Програмски преводиоци 1/К2 2020
Drugi kolokvijum 2020. godine održan je 22. januara 2021. godine, zbog neodržavanja druge kolokvijumske nedelje u regularnom terminu. Postavka ovog roka je dostupna sa stranice predmeta (arhiva).
1. zadatak
Postavka
Posmatra se lista od jednog ili više identifikatora ili celobrojnih konstanti, razdvojenih zarezima, pri čemu se na kraju koristi ";". Ulazni simboli su SLOVO, CIFRA, "," i ";". Identifikatori počinju slovom, a u nastavku imaju nula ili više slova ili cifara. Konstante sadrže samo cifre, mogu počinjati nulom. Primer ispravne liste: 1, a, tt20r, 120;
- Napisati gramatiku (u kojoj repetitivne konstrukcije treba da budu predstavljene levo rekurzivnim smenama) za opisane liste. Terminalni simboli su SLOVO, CIFRA, "," i ";". Gramatika ne sme biti dvosmislena.
- Transformisati gramatiku iza tačke a) u LL(1) gramatiku, primenom standarnih transformacija. Izračunati selekcione skupove i proveriti da li je dobijena gramatika LL(1).
- Dodati u gramatiku iz tačke a) atribute kojima se računa vrednost svake od konstanti koje se pojavljuju u ulaznoj listi, a takođe i zbir vrednosti svih konstanti u listi. Napomena: akcione simbole ne uvoditi, nisu potrebni.
Rešenje
Gramatika tražena u stavci pod a može da glasi ovako:
- <terminal> → SLOVO
- <terminal> → CIFRA
- <id> → <id> <terminal>
- <id> → SLOVO
- <konstanta> → <konstanta> CIFRA
- <konstanta> → CIFRA
- <element> → <id>
- <element> → <konstanta>
- <lista> → <lista>, <element>
- <lista> → <element>
- <S> → <lista>;
Transformisana LL(1) gramatika sa selekcionim skupovima može da izgleda ovako:
- <terminal> → SLOVO
- SELECT(1) = {SLOVO}
- <terminal> → CIFRA
- SELECT(2) = {CIFRA}
- <id> → SLOVO <id'>
- SELECT(3) = {SLOVO}
- <id'> → <terminal> <id'>
- SELECT(4) = FIRST(<terminal>) = {SLOVO, CIFRA}
- <id'> → ε
- SELECT(5) = FOLLOW(<id'>) = FOLLOW(<id>) = FOLLOW(<element>) = FIRST(<lista'>) ∪ FOLLOW(<lista'>) = {","} ∪ FOLLOW(<lista>) = {",", ";"}
- <konstanta> → CIFRA <konstanta'>
- SELECT(6) = {CIFRA}
- <konstanta'> → CIFRA <konstanta'>
- SELECT(7) = {CIFRA}
- <konstanta'> → ε
- SELECT(8) = FOLLOW(<konstanta'>) = {",", ";"}
- <element> → <id>
- SELECT(9) = {SLOVO}
- <element> → <konstanta>
- SELECT(10) = {CIFRA}
- <lista> → <element> <lista'>
- SELECT(11) = FIRST(<element>) = {SLOVO, CIFRA}
- <lista'> → , <element> <lista'>
- SELECT(12) = {","}
- <lista'> → ε
- SELECT(13) = {";"}
- <S> → <lista>;
- SELECT(14) = FIRST(<lista>) = FIRST(<element>) = {SLOVO, CIFRA}
Zbog toga što se ni za jednu smenu ne preklapaju SELECT skupovi, ovo je LL(1) gramatika.
Atributivno-translaciona gramatika sa pomenutim atributima bi, zato, mogla da izgleda ovako:
- <terminal> → SLOVO
- <terminal> → CIFRA
- <id> → <id> <terminal>
- <id> → SLOVO
- <konstanta>v → <konstanta>v1 CIFRAv2
- v ← v1 + v2
- <konstanta>v → CIFRAv1
- v ← v1
- <element>v → <id>
- v ← 0
- <element>v → <konstanta>v1
- v ← v1
- <lista>v → <lista>v1, <element>v2
- v ← v1 + v2
- <lista>v → <element>v1
- v ← v1
- <S>v → <lista>v1;
- v ← v1
2. zadatak
Postavka
Data je gramatika:
- <S> → f <A> f
- <A> → c <B>
- <B> → f <S> c
- <B> → ε
- Da li se sekvenca
fcffcfcf
može prepoznati opisanom gramatikom? Prikazati postupak. - Nacrtati karakteristični automat i kontrolnu tabelu LR(0) parsera (potisnu ne crtati).
- Prikazati kontrolnu tabelu SLR(1) parsera. Da li postoje konflikti?
Rešenje
Stanje | Operacija |
---|---|
∇ | SHIFT |
<S>0 | SHIFT |
─┤0 | ACCEPT |
f11 | SHIFT |
<A>1 | SHIFT |
f12 | REDUCE(1) |
c2 | S/R konflikt |
<B>2 | REDUCE(2) |
f3 | SHIFT |
<S>3 | SHIFT |
c3 | REDUCE(3) |
FOLLOW skupovi ove gramatike su:
- FOLLOW(<S>) = {─┤, c}
- FOLLOW(<A>) = {f}
- FOLLOW(<B>) = {f}
Stanje | c | f | ─┤ |
---|---|---|---|
∇ | SHIFT | ||
<S>0 | SHIFT | ||
─┤0 | ACCEPT | ||
f11 | SHIFT | ||
<A>1 | SHIFT | ||
f12 | REDUCE(1) | REDUCE(1) | |
c2 | S/R konflikt | ||
<B>2 | REDUCE(2) | ||
f3 | SHIFT | ||
<S>3 | SHIFT | ||
c3 | REDUCE(3) |