Програмски преводиоци 1/К2 2019
Drugi kolokvijum 2019. godine održan je 2. decembra i trajao je 90 minuta. Postavka roka dostupna je sa stranice predmeta (arhiva).
1. zadatak
Postavka
- Kojoj gramatici odgovara dati rekurzivni prepoznavač napisan na pseudojeziku?
- Nalaženjem SELECT skupova proveriti da li je gramatika iz tačke a) tipa LL(1).
- Ukoliko već nije, transformisati gramatiku iz tačke a) da bude LL(1).
glavni program:
INP = prvi ulazni simbol
call PROCS;
if (INP <> '─┤')
then REJECT;
else ACCEPT;
end if;
end;
procedure PROCS:
case INP of
'c', 'f': {
call PROCA;
if (INP <> 'a')
then REJECT;
else call ADVANCE;
end if;
}
'─┤': /* ništa */ return;
'a', 'd': REJECT;
end case;
end procedure;
procedure PROCA:
case INP of
'c': {
call PROCA;
call PROCA;
if (INP <> 'd')
then REJECT;
else ADVANCE;
end if;
}
'f': call PROCB;
'a', 'd', '─┤': REJECT;
end case;
end procedure;
procedure PROCB:
case INP of
'c': ADVANCE;
'f': ADVANCE;
'a', 'd', '─┤': REJECT;
end case;
end procedure;
Rešenje
Ovaj rekurzivni prepoznavač odgovara gramatici sa mrtvim neterminalom <A>. Ako bismo izbacili mrtve neterminale, dobili bismo gramatiku koja izgleda ovako:
- <S> → <A> a
- <S> → ε
- <A> → f
Ipak, ovo verovatno nije ono što je bio očekivani odgovor na ovu stavku. Bolja formulacija prve stavke bi bila "Kada bi se gramatika tehnikom rekurzivnog spusta prebacila u kod parsera, dobija se sledeći izvorni kod. Odrediti izvornu gramatiku." U ovom slučaju dobija se gramatika koja izgleda ovako:
- <S> → <A> a
- SELECT(1) = {f}
- <S> → ε
- SELECT(2) = {─┤}
- <A> → <A> <A> d
- SELECT(3) = {f}
- <A> → f
- SELECT(4) = {f}
Četvrta smena ove gramatike može biti samo f, zato što se PROCB iz originalnog parsera ne poziva u slučaju da na ulazu dođe terminal c.
Ova gramatika nije LL(1) zbog prisustva leve rekurzije. Kada eliminišemo levu rekurziju, ova gramatika izgleda ovako:
- <S> → <A> a
- SELECT(1) = {f}
- <S> → ε
- SELECT(2) = {─┤}
- <A> → f <A'>
- SELECT(3) = {f}
- <A'> → <A> d <A'>
- SELECT(4) = {f}
- <A'> → ε
- SELECT(5) = {a}
Na ovaj način se SELECT skupovi smena ne preklapaju, i zato je ova gramatika LL(1).
2. zadatak
Postavka
Za datu gramatiku sa neterminalima S i A:
- <S> → <A>
- <S> → b c <A> c
- <A> → b
- Popuniti sadržaje stanja karakterističnog LR(0) automata na datoj slici (ne popunjavati unutar {})
- Popuniti predikcione skupove {} unutar stanja na slici da bi se dobio karakteristični LALR(1) automat.
- Popuniti kontrolnu tabelu SLR(1) parsera.
- Popuniti kontrolnu tabelu LALR(1) parsera
Rešenje
| Stanje | b | c | ─┤ |
|---|---|---|---|
| ∇ | SHIFT | ||
| b3b4 | S/R konflikt | REDUCE(3) | |
| <S>0 | SHIFT | ||
| ─┤0 | ACCEPT | ||
| <A>1 | REDUCE(1) | ||
| c21 | SHIFT | ||
| <A>2 | SHIFT | ||
| c22 | REDUCE(2) | ||
| b3 | REDUCE(3) | REDUCE(3) |
| Stanje | b | c | ─┤ |
|---|---|---|---|
| ∇ | SHIFT | ||
| b3b4 | SHIFT | REDUCE(3) | |
| <S>0 | SHIFT | ||
| ─┤0 | ACCEPT | ||
| <A>1 | REDUCE(1) | ||
| c21 | SHIFT | ||
| <A>2 | SHIFT | ||
| c22 | REDUCE(2) | ||
| b3 | REDUCE(3) |
3. zadatak
Postavka
Data je gramatika koja opisuje niz koji se sastoji od jednog ili više celih brojeva razdvojenih zarezima. Datoj gramatici dodeliti atribute i akcije ukoliko je potrebno tako da startni neterminal <niz> ima sintetizovani atribut u kome se nalazi duzina[sic] najduze[sic] neopadajuće sekvence u nizu. Smatrati da terminal BROJ ima sintetizovani atribut sa vrednošću tog broja. Za svaki uvedeni atribut potrebno je naznačiti njegov tip.
- <niz> → BROJ , <niz>
- <niz> → BROJ
Rešenje
Uvode se tri sintetizovana atributa, maksimalna dužina neopadajućeg niza brojeva (), trenutna dužina neopadajućeg niza brojeva () i prvi broj u nizu ().
- <niz>ml,l,n → BROJval , <niz>ml1,l1,n1
- <niz>ml,l,n → BROJval