Програмски преводиоци 1/К2 2020
Други колоквијум 2020. године одржан је 22. јануара 2021. године, због неодржавања друге колоквијумске недеље у регуларном термину. Поставка овог рока је доступна са странице предмета (архива).
1. задатак
Поставка
Посматра се листа од једног или више идентификатора или целобројних константи, раздвојених зарезима, при чему се на крају користи ";". Улазни симболи су СЛОВО, ЦИФРА, "," и ";". Идентификатори почињу словом, а у наставку имају нула или више слова или цифара. Константе садрже само цифре, могу почињати нулом. Пример исправне листе: 1, а, тт20р, 120;
- Написати граматику (у којој репетитивне конструкције треба да буду представљене лево рекурзивним сменама) за описане листе. Терминални симболи су СЛОВО, ЦИФРА, "," и ";". Граматика не сме бити двосмислена.
- Трансформисати граматику иза тачке а) у ЛЛ(1) граматику, применом стандарних трансформација. Израчунати селекционе скупове и проверити да ли је добијена граматика ЛЛ(1).
- Додати у граматику из тачке а) атрибуте којима се рачуна вредност сваке од константи које се појављују у улазној листи, а такође и збир вредности свих константи у листи. Напомена: акционе симболе не уводити, нису потребни.
Решење
Граматика тражена у ставци под а може да гласи овако:
- <терминал> → СЛОВО
- <терминал> → ЦИФРА
- <ид> → <ид> <терминал>
- <ид> → СЛОВО
- <константа> → <константа> ЦИФРА
- <константа> → ЦИФРА
- <елемент> → <ид>
- <елемент> → <константа>
- <листа> → <листа>, <елемент>
- <листа> → <елемент>
- <С> → <листа>;
Трансформисана ЛЛ(1) граматика са селекционим скуповима може да изгледа овако:
- <терминал> → СЛОВО
- СЕЛЕЦТ(1) = {СЛОВО}
- <терминал> → ЦИФРА
- СЕЛЕЦТ(2) = {ЦИФРА}
- <ид> → СЛОВО <ид'>
- СЕЛЕЦТ(3) = {СЛОВО}
- <ид'> → <терминал> <ид'>
- СЕЛЕЦТ(4) = ФИРСТ(<терминал>) = {СЛОВО, ЦИФРА}
- <ид'> → ε
- СЕЛЕЦТ(5) = ФОЛЛОW(<ид'>) = ФОЛЛОW(<ид>) = ФОЛЛОW(<елемент>) = ФИРСТ(<листа'>) ∪ ФОЛЛОW(<листа'>) = {","} ∪ ФОЛЛОW(<листа>) = {",", ";"}
- <константа> → ЦИФРА <константа'>
- СЕЛЕЦТ(6) = {ЦИФРА}
- <константа'> → ЦИФРА <константа'>
- СЕЛЕЦТ(7) = {ЦИФРА}
- <константа'> → ε
- СЕЛЕЦТ(8) = ФОЛЛОW(<константа'>) = {",", ";"}
- <елемент> → <ид>
- СЕЛЕЦТ(9) = {СЛОВО}
- <елемент> → <константа>
- СЕЛЕЦТ(10) = {ЦИФРА}
- <листа> → <елемент> <листа'>
- СЕЛЕЦТ(11) = ФИРСТ(<елемент>) = {СЛОВО, ЦИФРА}
- <листа'> → , <елемент> <листа'>
- СЕЛЕЦТ(12) = {","}
- <листа'> → ε
- СЕЛЕЦТ(13) = {";"}
- <С> → <листа>;
- СЕЛЕЦТ(14) = ФИРСТ(<листа>) = ФИРСТ(<елемент>) = {СЛОВО, ЦИФРА}
Због тога што се ни за једну смену не преклапају СЕЛЕЦТ скупови, ово је ЛЛ(1) граматика.
Атрибутивно-транслациона граматика са поменутим атрибутима би, зато, могла да изгледа овако:
- <терминал> → СЛОВО
- <терминал> → ЦИФРА
- <ид> → <ид> <терминал>
- <ид> → СЛОВО
- <константа>в → <константа>в1 ЦИФРАв2
- <константа>в → ЦИФРАв1
- <елемент>в → <ид>
- <елемент>в → <константа>в1
- <листа>в → <листа>в1, <елемент>в2
- <листа>в → <елемент>в1
- <С>в → <листа>в1;
2. задатак
Поставка
Дата је граматика:
- <С> → ф <А> ф
- <А> → ц <Б>
- <Б> → ф <С> ц
- <Б> → ε
- Да ли се секвенца
fcffcfcf
може препознати описаном граматиком? Приказати поступак. - Нацртати карактеристични аутомат и контролну табелу ЛР(0) парсера (потисну не цртати).
- Приказати контролну табелу СЛР(1) парсера. Да ли постоје конфликти?
Решење
Стање | Операција |
---|---|
∇ | СХИФТ |
<С>0 | СХИФТ |
─┤0 | АЦЦЕПТ |
ф11 | СХИФТ |
<А>1 | СХИФТ |
ф12 | РЕДУЦЕ(1) |
ц2 | С/Р конфликт |
<Б>2 | РЕДУЦЕ(2) |
ф3 | СХИФТ |
<С>3 | СХИФТ |
ц3 | РЕДУЦЕ(3) |
ФОЛЛОW скупови ове граматике су:
- ФОЛЛОW(<С>) = {─┤, ц}
- ФОЛЛОW(<А>) = {ф}
- ФОЛЛОW(<Б>) = {ф}
Стање | ц | ф | ─┤ |
---|---|---|---|
∇ | СХИФТ | ||
<С>0 | СХИФТ | ||
─┤0 | АЦЦЕПТ | ||
ф11 | СХИФТ | ||
<А>1 | СХИФТ | ||
ф12 | РЕДУЦЕ(1) | РЕДУЦЕ(1) | |
ц2 | С/Р конфликт | ||
<Б>2 | РЕДУЦЕ(2) | ||
ф3 | СХИФТ | ||
<С>3 | СХИФТ | ||
ц3 | РЕДУЦЕ(3) |