Преобразование неоднозначной грамматики в однозначную

Я не понял, как однозначная грамматика происходит от неоднозначной грамматики? Рассмотрим пример на сайте: пример. Как была получена грамматика, меня смущает.

может кто-нибудь, пожалуйста, направлять меня ?

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 распознавание неоднозначных грамматик):

некоторые неоднозначные грамматики могут быть преобразованы в однозначные грамматики, но общая процедура для этого невозможна, так же как не существует алгоритма для обнаружения неоднозначных грамматик.

для того, чтобы придумать вторую грамматику, вы должны найти грамматику, которая

  1. эквивалентно первому: оба генерируют одно и то же язык
  2. однозначно: для каждого предложения языка дерево разбора уникально