Programski prevodioci 1/K2 2022
Drugi kolokvijum 2022. godine održan je 5. decembra. Trajao je 100 minuta i postavka roka nije trenutno dostupna sa stranice predmeta.
1. zadatak
Postavka
Na osnovu date potisne i kontrolne tabele LR(0) parsera:
- Nacrtati karakteristični automat ovog parsera.
- Odrediti gramatiku koju ovaj parser parsira.
- Odrediti FOLLOW skupove ove gramatike. Ukoliko ovaj parser postane SLR(1), da li će biti konflikata?
Stanje | <E> | id | ( | ) | + | ─┤ | Akcija |
---|---|---|---|---|---|---|---|
∇ | <E>x1 | idx | SHIFT | ||||
<E>x1 | +3 | ─┤0 | SHIFT | ||||
─┤0 | ACCEPT | ||||||
idx | (2 | SHIFT/REDUCE(1) | |||||
(2 | <E>x2 | idx | SHIFT | ||||
<E>x2 | )2 | +3 | SHIFT | ||||
+3 | id3 | SHIFT | |||||
)2 | REDUCE(2) | ||||||
id3 | REDUCE(3) |
Rešenje
Gramatika koju ovaj automat parsira je:
- <E> → id
- <E> → id ( <E> )
- <E> → <E> + id
FIRST i FOLLOW skupovi ove gramatike su:
- FIRST(<E>) = {id}
- FOLLOW(<E>) = {")", "+", ─┤}
U LR(0) automatu, u stanju idx dešava se S/R konflikt. U SLR(1) parseru, za svaki terminal se akcija određuje posebno. Za terminal ( će se obavljati SHIFT, dok će za FOLLOW(<E>), odnosno za znakove ), + i ─┤, obavljati REDUCE(1). Zbog ovoga u SLR(1) parseru neće biti konflikata.
2. zadatak
- Овај задатак није решен. Помозите SI Wiki тако што ћете га решити.
Postavka
Dopuniti parser ili gramatiku ispod na odgovarajući način na mestima označenim sa ????. Ukoliko se u ovu gramatiku dodaju sledeće dve smene:
- <S> → b <S>
- <B> → <B> f
da li gramatika ostaje LL(1) (obrazložiti zašto da ili zašto ne) i ukoliko ne ostaje transformisati tako da bude LL(1).
Gramatika:
- <S> → a <A> e <B>
- <S> → ????
- <A> → b <S> d
- <A> → ε
- <B> → c ????
- <B> → ????
Parser:[1]
glavni program: INP = NEXTCHAR(); call PROCS; /* ???? */ end; procedure PROCS: case INP of ????: goto P1; ????: goto P2; default: REJECT(); end case; P1: INP = NEXTCHAR(); /* ???? */ call A; /* ???? */ P2: call A; call S; return; end procedure; procedure PROCA: case INP of ????: goto P3; ????: goto P4; default: REJECT(); end case; P3: INP = NEXTCHAR(); /* ???? */ P4: /* ???? */ end procedure; procedure PROCB: case INP of ????: goto P5; ????: goto P6; default: REJECT(); end case; P5: INP = NEXTCHAR(); /* ???? */ call PROCS; P6: return; end procedure;
Rešenje
Krajnja gramatika je:
- <S> → a <A> e <B>
- <S> → <A> <B>
- <A> → b <S> d
- <A> → ε
- <B> → c <S>
- <B> → ε
3. zadatak
Postavka
Data je gramatika koja opisuje binarno stablo:
- <tree>width,level → <node>
- <node> → <node> ID <node>
- <node> → NULL
U gramatici, između levog i desnog deteta nekog čvora dolazi identifikator tog čvora, dok ukoliko čvor nema dete na mestu njegovog podstabla piše NULL. Kroz nasleđeni atribut level
prosleđuje se broj određenog nivoa stabla (koren ima nivo 0), a potrebno je napraviti atributivno-translacionu gramatiku koja u atribut width
korena upisuje širinu stabla na tom nivou. Za svaki atribut napisati ulogu i da li je sintetizovan ili nasleđen.
Rešenje
Uvode se tri atributa:
- Nasleđeni atribut
curr
koji predstavlja trenutni nivo na kojem se nalazi čvor. - Nasleđeni atribut
aim
koji predstavlja traženi nivo na kojem se meri širina. - Sintetizovani atribut
width
koji predstavlja do tada izračunatu širinu stabla na zadatom nivou.
Sa njima, atributivno-translaciona gramatika izgleda ovako:
- <tree>width,level → <node>curr,aim,width1
- <node>curr,aim,width → <node>c1,a1,w1 ID <node>c2,a2,w2
- <node>curr,aim,width → NULL
Napomene
- ↑ Na kolokvijumu je rečeno da pozivi poput
call A
imaju isto značenje kaocall PROCA
.