Програмски преводиоци 1/К2 2019
Други колоквијум 2019. године одржан је 2. децембра. Поставка рока доступна је са странице предмета (архива).
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
- <низ>мл,л,н → БРОЈвал