Програмски преводиоци 1/К2 2019
Други колоквијум 2019. године одржан је 2. децембра и трајао је 90 минута. Поставка рока доступна је са странице предмета (архива).
1. задатак
Поставка
- Којој граматици одговара дати рекурзивни препознавач написан на псеудојезику?
- Налажењем СЕЛЕЦТ скупова проверити да ли је граматика из тачке а) типа ЛЛ(1).
- Уколико већ није, трансформисати граматику из тачке а) да буде ЛЛ(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;
Решење
Овај рекурзивни препознавач одговара граматици са мртвим нетерминалом <А>. Ако бисмо избацили мртве нетерминале, добили бисмо граматику која изгледа овако:
- <С> → <А> а
- <С> → ε
- <А> → ф
Ипак, ово вероватно није оно што је био очекивани одговор на ову ставку. Боља формулација прве ставке би била "Када би се граматика техником рекурзивног спуста пребацила у код парсера, добија се следећи изворни код. Одредити изворну граматику." У овом случају добија се граматика која изгледа овако:
- <С> → <А> а
- СЕЛЕЦТ(1) = {ф}
- <С> → ε
- СЕЛЕЦТ(2) = {─┤}
- <А> → <А> <А> д
- СЕЛЕЦТ(3) = {ф}
- <А> → ф
- СЕЛЕЦТ(4) = {ф}
Четврта смена ове граматике може бити само ф, зато што се ПРОЦБ из оригиналног парсера не позива у случају да на улазу дође терминал ц.
Ова граматика није ЛЛ(1) због присуства леве рекурзије. Када елиминишемо леву рекурзију, ова граматика изгледа овако:
- <С> → <А> а
- СЕЛЕЦТ(1) = {ф}
- <С> → ε
- СЕЛЕЦТ(2) = {─┤}
- <А> → ф <А'>
- СЕЛЕЦТ(3) = {ф}
- <А'> → <А> д <А'>
- СЕЛЕЦТ(4) = {ф}
- <А'> → ε
- СЕЛЕЦТ(5) = {а}
На овај начин се СЕЛЕЦТ скупови смена не преклапају, и зато је ова граматика ЛЛ(1).
2. задатак
Поставка
За дату граматику са нетерминалима С и А:
- <С> → <А>
- <С> → б ц <А> ц
- <А> → б
- Попунити садржаје стања карактеристичног ЛР(0) аутомата на датој слици (не попуњавати унутар {})
- Попунити предикционе скупове {} унутар стања на слици да би се добио карактеристични ЛАЛР(1) аутомат.
- Попунити контролну табелу СЛР(1) парсера.
- Попунити контролну табелу ЛАЛР(1) парсера
Решење
Стање | б | ц | ─┤ |
---|---|---|---|
∇ | СХИФТ | ||
б3б4 | С/Р конфликт | РЕДУЦЕ(3) | |
<С>0 | СХИФТ | ||
─┤0 | АЦЦЕПТ | ||
<А>1 | РЕДУЦЕ(1) | ||
ц21 | СХИФТ | ||
<А>2 | СХИФТ | ||
ц22 | РЕДУЦЕ(2) | ||
б3 | РЕДУЦЕ(3) | РЕДУЦЕ(3) |
Стање | б | ц | ─┤ |
---|---|---|---|
∇ | СХИФТ | ||
б3б4 | СХИФТ | РЕДУЦЕ(3) | |
<С>0 | СХИФТ | ||
─┤0 | АЦЦЕПТ | ||
<А>1 | РЕДУЦЕ(1) | ||
ц21 | СХИФТ | ||
<А>2 | СХИФТ | ||
ц22 | РЕДУЦЕ(2) | ||
б3 | РЕДУЦЕ(3) |
3. задатак
Поставка
Дата је граматика која описује низ који се састоји од једног или више целих бројева раздвојених зарезима. Датој граматици доделити атрибуте и акције уколико је потребно тако да стартни нетерминал <низ> има синтетизовани атрибут у коме се налази дузина[сиц] најдузе[сиц] неопадајуће секвенце у низу. Сматрати да терминал БРОЈ има синтетизовани атрибут са вредношћу тог броја. За сваки уведени атрибут потребно је назначити његов тип.
- <низ> → БРОЈ , <низ>
- <низ> → БРОЈ
Решење
Уводе се три синтетизована атрибута, максимална дужина неопадајућег низа бројева (), тренутна дужина неопадајућег низа бројева () и први број у низу ().
- <низ>мл,л,н → БРОЈвал , <низ>мл1,л1,н1
- <низ>мл,л,н → БРОЈвал