Преобразование неоднозначной грамматики в однозначную
Я не понял, как однозначная грамматика происходит от неоднозначной грамматики? Рассмотрим пример на сайте: пример. Как была получена грамматика, меня смущает.
может кто-нибудь, пожалуйста, направлять меня ?
2 ответов
пример имеет две грамматики:
двусмысленно:
E → E + E | E ∗ E | (E) | a
однозначна:
E → E + T | T
T → T ∗ F | F
F → (E) | a
однозначная грамматика была получена из неоднозначной, используя информацию, не указанную в неоднозначной грамматике:
- оператор ' * 'связывает более туго чем оператор'+'.
- оба оператора ' * ' и ' + ' остаются ассоциативными.
без внешней информации, никакой путь сделать преобразование.
С внешней информацией, мы можем сказать, что:
a * a + b * b
группируется так, как будто написано:
(a * a) + (b * b)
а не так:
a * ((a + b) * b)
второй предполагает, что " + "связывается плотнее, чем"*", и что операторы связываются справа налево, а не слева направо.
комментарий
как ассоциативность войдет в картину для примеров например:
S → aA | Ba
A → BA | a
B → aB | epsilon
это неоднозначная грамматика, так как перейти к преобразованию его в однозначный?
интересно, является ли "Эпсилон" ε, пустой строкой; давайте проанализируем грамматику в обоих направлениях.
ε-пустая строка
правило для B говорит, что B является либо пустой строкой, либо A, за которой следует допустимый B, который составляет бесконечно длинную строку 0 или более a.
правило для A говорит, что A либо a, либо B, за которым следует a. Таким образом, бесконечно длинная строка a также может быть A. Таким образом, грамматика не может выбрать, является ли строка a либо A, либо B.
и правило для S не помогает; S-это либо a, за которым следует бесконечно длинная строка a, либо бесконечно длинная строка a, за которой следует a. Для этого требуется хотя бы один a, но любое число a от одного вверх в порядке, но грамматика не имеет оснований для выбора между левым и правильные альтернативы.
ε не является пустой строкой
как насчет того, что ε не является пустой строкой?
- B-либо ε, либо ae.
- A является A или B и А (так как А или ае или ааэ).
- либо: S является a, за которым следует A (следовательно, aa, aae или aaae)
- или: S-Это B, за которым следует a (следовательно, ea или aea).
в этом случае грамматика однозначна, как она есть (хотя и не обязательно LR (1)). Очевидно, что многое зависит от значения "Эпсилона" в комментарии/вопросе.
ассоциативность
Я не думаю, что ассоциативность влияет на эту грамматику. Он обычно вступает в игру с операторами infix (такими как " + " в "a + b").
из Википедии (on распознавание неоднозначных грамматик):
некоторые неоднозначные грамматики могут быть преобразованы в однозначные грамматики, но общая процедура для этого невозможна, так же как не существует алгоритма для обнаружения неоднозначных грамматик.
для того, чтобы придумать вторую грамматику, вы должны найти грамматику, которая
- эквивалентно первому: оба генерируют одно и то же язык
- однозначно: для каждого предложения языка дерево разбора уникально