Почему леворекурсивная, недетерминированная или неоднозначная грамматика не может быть LL (1)? - PullRequest
0 голосов
/ 05 января 2019

Из нескольких источников я узнал, что грамматика LL (1):

  1. однозначна,
  2. не леворекурсивный,
  3. и, детерминированный (разложенный слева).

То, что я не могу полностью понять, - то, почему вышеупомянутое верно для любой грамматики LL (1). Я знаю, что таблица разбора LL (1) будет иметь несколько записей в некоторых ячейках, но я действительно хочу получить формальное и общее (не с примером) доказательство следующих предложений:

Леворекурсивная (1), недетерминированная (2) или неоднозначная (3) грамматика не является LL (1).

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Ответ на эти вопросы (и они действительны для LL (k) для любого конечного k) связан с тем, как стек синтаксического анализа работает в синтаксическом анализаторе LL.

В точке, где каждый находится в начале нетерминала в грамматике, синтаксический анализатор должен определить, оглядываясь в будущее только на жетоны случая k (1 в LL (1)), прежде чем решить, помещать ли в стек a конкретное правило или для разбора текста с использованием других правил. Итак, давайте рассмотрим каждый из этих случаев и посмотрим, как это влияет на это решение.

  1. левая рекурсия. Есть два леворекурсивных случая.

    а. У левой рекурсии нет жетонов после рекурсии. Правило что-то вроде:

нетермический: нетермальный;

Такое правило не действует и независимо от того, сколько вы набираете, не меняет то, что вы анализируете.

b. The left-recursion has tokens in it after the recursion.  A rules something like:

нетермический: нетермальный «X»;

В этом правиле вам нужно помещать нетермические правила в стек столько раз, сколько следует за нетермом. Вы не можете определить, сколько существует X, только с k токенами. Если вы угадаете и догадаетесь слишком малым, у вас останется X, и для любого предположения в языке будет случай с большим количеством X-токенов. Если вы угадаете, а угадаете слишком большое, вы получите внешние нетермические правила в стеке. Вы не можете удалить их. В любом случае, вы просто не правы.

  1. Non-детерминированным. Недетерминированная грамматика имеет те же характеристики, что и леворекурсивная. Это недетерминировано, следует ли вам подталкивать или нет. Языки палиндрома являются типичными недетерминированными примерами, но не единственными. На языке палиндрома вы не знаете, следует ли помещать в стек другого нетерминала или использовать токен, который вы видите, чтобы помочь вам вернуться обратно в стек. Если вы сделаете неправильный выбор, вы снова пропустите ввод.

  2. Неоднозначный. Опять проблема похожая. В этом случае возможны два анализа. Тот, который выдвигает один нетерминал и успешно анализирует ввод, а другой - нет (возможно, вместо этого проталкивает другой нетерминал, сейчас или позже при разборе). Любой из них даст правильный анализ. Теперь, в неоднозначном случае, нажатие на нетерминал не обязательно вызовет ошибку синтаксического анализа, вы просто выберете один из возможных синтаксических разборов, игнорируя другой. Если ваша семантика требует, чтобы был выбран другой синтаксический анализ, проблема возникнет позже. Обратите внимание, конечно, что самые неоднозначные грамматики также являются недетерминированными.

Теперь, если вы посмотрите на эти случаи, вы увидите, что, если бы вы могли как-то одновременно поместить и не поместить нетерминал в стек, вы могли бы проанализировать ввод с помощью грамматики. И, в неоднозначном случае, создайте набор разборов, которые соответствуют входным данным. Есть методы, которые делают это, я полагаю, они считаются GLL (обобщенным LL) - эквивалентный метод с генератором синтаксического анализатора LR называется GLR. Результирующий вывод часто рассматривается как «лес синтаксического анализа» (или иногда синтаксический анализ, направленный ациклический граф).

[Примечание: я впервые увидел вышеупомянутый вопрос на Quora, и этот ответ скопирован оттуда.]

0 голосов
/ 06 января 2019

Я провел еще несколько исследований, и я думаю, что нашел решение для 1-го и 2-го вопросов, а для 3-го я нашел здесь решение на SO для него, попытки доказательства написаны ниже:

Мы начнем с написания трех правил определения грамматики LL (1):

Для каждого производства A -> α | β с α ≠ β:

  1. FIRST(α) ∩ FIRST(β) = Ø.
  2. Если β =>* ε, то FIRST(α) ∩ FOLLOW(A) = Ø (также, если α =>* ε, то FIRST(β) ∩ FOLLOW(A) = Ø).
  3. Включение ε в правило (1) подразумевает, что самое большее из α и β может выводить ε.

Предложение 1: Нефакторная грамматика не является LL (1).

Доказательство:

Если грамматика G нефакторирована, то в G существует произведение вида:

A -> ωα1 | ωα2 | ... | ωαn

(где αi - это i-th α, а не символы α и i), с α1 ≠ α2 ≠ ... ≠ αn. Затем мы можем легко показать, что:

∩(i=1,..,n) FIRST(ωαi) ≠ Ø

, что противоречит правилу (1) определения, следовательно, нефакторная грамматика не является LL (1). ∎

Предложение 2: Леворекурсивная грамматика не является LL (1).

Доказательство:

Если грамматика является леворекурсивной, то в G существует произведение вида:

S -> Sα | β

Здесь возникают три случая:

  1. Если FIRST(β) ≠ {ε}, то:

    FIRST(β) ⊆ FIRST(S)

    => FIRST(β) ∩ FIRST(Sα) ≠ Ø

    , что противоречит правилу (1) определения.

  2. Если FIRST(β) = {ε}, то:

    2,1. Если ε ∈ FIRST(α), то:

    ε ∈ FIRST(Sα)

    , что противоречит правилу (3) определения.

    2,2. Если ε ∉ FIRST(α), то:

    FIRST(α) ⊆ FIRST(S) (потому что β =>* ε)

    => FIRST(α) ⊆ FIRST(Sα) ........ (I)

    мы также знаем, что:

    FIRST(α) ⊆ FOLLOW(S) ........ (II)

    по (I) и (II), имеем:

    FIRST(Sα) ∩ FOLLOW(S) ≠ Ø

    и, поскольку β =>* ε, это противоречит правилу (2) определения.

В каждом случае мы приходим к противоречию, поэтому леворекурсивная грамматика не является LL (1). ∎

Предложение 3: Неоднозначная грамматика не является LL (1).

Доказательство:

Хотя приведенные выше доказательства мои, но это не моё доказательство, это Кевин А. Науде , который я получил из его ответа, который связан ниже:

https://stackoverflow.com/a/18969767/6275103

...