Дана контекстно-свободная грамматика, порождающая арифметические выражения с операциями + и * и скобками (пример: E -> E + E | E * E | (E) | id). Обсудите, является ли грамматика неоднозначной, приведите пример неоднозначного вывода, предложите способ устранить неоднозначность (приоритеты и ассоциативность) и постройте соответствующую неамбигвую грамматику
Классическая грамматика E -> E + E | E * E | EEE | id неоднозначна. Причина — отсутствие информации о приоритетах и ассоциативности операций: одно и то же слово может иметь разные синтаксические деревья разныесмыслыразные смыслыразныесмыслы.
Пример неоднозначности. Рассмотрим строку id + id * id
Две разные структуры интерпретацииинтерпретацииинтерпретации этой строки:
1) + на верхнем уровне, справа — *: E /\ E + E/\ id E * E id id
это соответствует id + id∗idid * idid∗id.
Левосторонняя 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
Эти варианты эквивалентны по языку и однозначно задают желаемые приоритеты и ассоциативность.
Классическая грамматика
E -> E + E | E * E | EEE | id
неоднозначна. Причина — отсутствие информации о приоритетах и ассоциативности операций: одно и то же слово может иметь разные синтаксические деревья разныесмыслыразные смыслыразныесмыслы.
Пример неоднозначности. Рассмотрим строку
id + id * id
Две разные структуры интерпретацииинтерпретацииинтерпретации этой строки:
1) + на верхнем уровне, справа — *:E
/\
E + E/\
id E * E id id
это соответствует id + id∗idid * idid∗id.
Левосторонняя leftmostleftmostleftmost выводящая последовательность:
2) * на верхнем уровне, слева — +:E -> E + E
-> id + E
-> id + E E
-> id + id E
-> id + id * id
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
Эти варианты эквивалентны по языку и однозначно задают желаемые приоритеты и ассоциативность.