Как определить, является ли язык LL (1) LR (0) SLR(1)

есть ли простой способ определить, является ли грамматика LL(1), LR(0), SLR (1)... просто от взгляда на грамматику без какого-либо сложного анализа?

например: чтобы решить, является ли грамматика BNF ll (1), Вы должны сначала вычислить и следовать наборам, что может занять много времени в некоторых случаях.

У кого-нибудь есть идея, как сделать это быстрее? Любая помощь будет действительно оценили!

7 ответов


во-первых, немного педантичности. Вы не можете определить, является ли язык is LL (1) из проверки грамматики для него, вы можете делать только утверждения о грамматика. Вполне возможно писать не-LL(1) грамматики для языков, для которых существует грамматика LL(1).

с этим:

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

  • Проверьте грамматику и найдите нарушения ограничений различных типов грамматики. Например: LL(1) допускает правую, но не левую рекурсию, таким образом, грамматика, содержащая левую рекурсию, не является ll (1). (Для других свойств грамматики вам придется провести некоторое время с определениями, потому что я ничего не помню еще с верхней части моей голове :).


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

A → A + A / a

не LL (1), в то время как

a → a / b

есть.

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

A → B / A
B → A + A

Это не LL (1), но это может быть не сразу очевидно

правила грамматики для арифметики быстро становятся очень сложными:

expr → term {'+'term }
term → factor {'*'factor }
фактор → число | ' ('expr')'

эта грамматика обрабатывает только умножение и сложение, и уже не сразу ясно, является ли грамматика LL(1). По-прежнему можно оценить его, просматривая грамматику, но как грамматику растет он становится менее выполнимым. Если мы определяем грамматику для всего языка программирования, это почти наверняка потребует некоторого сложного анализа.

тем не менее, есть несколько очевидных признаков того, что грамматика не LL(1) - как A → A + A выше - и если вы можете найти любой из них в своей грамматике, вы будете знать, что его нужно переписать, если вы пишете рекурсивный парсер спуска. Но нет ярлыка, чтобы проверить, что грамматика is LL (1).


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


прямо из книги" компиляторы: принципы, методы и инструменты " Aho, et. Эл.

страница 223:

грамматика G - LL (1) , если и только если всякий раз, когда A ->Альфа | бета являются двумя различными производствами G, выполняются следующие условия:

  1. без терминала " a " сделайте оба Альфа и бета производные строки, начинающиеся с "a"
  2. одно из Альфа и бета можно получить пустую строку
  3. если бета может достичь пустого перехода через ноль или более переходов, то Альфа не выводит строку, начинающуюся с терминала в FOLLOW (A). Аналогично, если Альфа может достичь пустого перехода через ноль или более переходов, то бета не выводит строку, начинающуюся с терминала в FOLLOW (A)

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


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


ya есть ярлыки для грамматики ll(1)

1) Если A - >B1|B2/.......|Миллиард затем первое(B1)пересечение первое (B2)пересечение .сначала(Bn)=пустое множество, затем ll (1) grammar

2) Если A - >B1 / epsilon тогда пересечение B1 follow (A) пустое множество

3) Если G-любая грамматика, такая, что каждый не терминал получает только одно производство, то грамматика LL(1)


p0 S' → E
p1 E → id
p2 E → id ( E )
p3 E → E + id
  • построить LR (0) DFA, следующий набор для таблиц E и SLR action/goto.
  • это грамматика LR(0)? Докажи свой ответ.
  • используя таблицы SLR, покажите шаги (сдвиги, сокращения, принятие) синтаксического анализа LR:
    id ( id + id )