Дана контекстно-свободная грамматика, порождающая арифметические выражения с операциями + и * и скобками (пример: E -> E + E | E * E | (E) | id). Обсудите, является ли грамматика неоднозначной, приведите пример неоднозначного вывода, предложите способ устранить неоднозначность (приоритеты и ассоциативность) и постройте соответствующую неамбигвую грамматику

8 Окт в 11:36
9 +4
0
Ответы
1

Классическая грамматика
E -> E + E | E * E | EEE | id
неоднозначна. Причина — отсутствие информации о приоритетах и ассоциативности операций: одно и то же слово может иметь разные синтаксические деревья разныесмыслыразные смыслыразныесмыслы.

Пример неоднозначности. Рассмотрим строку
id + id * id

Две разные структуры интерпретацииинтерпретацииинтерпретации этой строки:

1) + на верхнем уровне, справа — *:
E
/\
E + E/\
id E * E id id

это соответствует id + id∗idid * ididid.

Левосторонняя leftmostleftmostleftmost выводящая последовательность:
E -> E + E
-> id + E
-> id + E E
-> id + id E
-> id + id * id

2) * на верхнем уровне, слева — +:
E
/\
E * E
/\E + E id

id id
это соответствует id+idid + idid+id id — но при удалении скобок получается та же строка id + id id.

Левосторонняя выводящая последовательность:
E -> E E
-> E + E E
-> id + E E
-> id + id E
-> id + id * id

Итого одна и та же строка имеет как минимум два разных синтаксических дерева — грамматика неоднозначна.

Устранение неоднозначности. Обычное требование: умышленно задать приоритеты и ассоциативность

имеет более высокий приоритет, чем +и * — левые ассоциативны a+b+c==(a+b)+ca + b + c == (a + b) + ca+b+c==(a+b)+c

Соответствующая неамбигвая грамматика уровнидляприоритета,левыйрекурсивныйвариантуровни для приоритета, левый рекурсивный вариантуровнидляприоритета,левыйрекурсивныйвариант:
E -> E + T | T
T -> T * F | F
F -> E E E | id

Эта грамматика однозначно задаёт приоритет > + и левую ассоциативность для обоих операторов. Пример: id + id id порождается единственным деревом с∗внутриTсправас * внутри T справасвнутриTсправа:

E/\
E + T/\
T T * F

F F id
| |
id id

Альтернативная форма, удобная для нисходящего парсера безлевойрекурсиибез левой рекурсиибезлевойрекурсии:
E -> T E'
E' -> + T E' | ε
T -> F T'
T' -> * F T' | ε
F -> E E E | id

Эти варианты эквивалентны по языку и однозначно задают желаемые приоритеты и ассоциативность.

8 Окт в 12:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир