Как определить, является ли грамматика LL (1), LR (0) или SLR (1)? - PullRequest
59 голосов
/ 14 декабря 2011

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

Может кто-нибудь объяснить, используя этот пример или любой другой пример?

X → Yz |a

Y → bZ |ε

Z → ε

Ответы [ 5 ]

95 голосов
/ 14 декабря 2011

Чтобы проверить, является ли грамматика LL (1), одним из вариантов является создание таблицы синтаксического анализа LL (1) и проверка на наличие конфликтов.Эти конфликты могут быть

  • ПЕРВОЕ / ПЕРВЫЕ конфликты, когда для нетерминальной / терминальной пары должно быть предсказано два разных производства.
  • ПЕРВЫЙ / СЛЕДУЮЩИЙ конфликты, где два разных производствапредсказанный, один, представляющий, что некоторая продукция должна быть взята, и расширяется до ненулевого числа символов, а другой, представляющий, что продукция должна использоваться, указывая, что некоторая нетерминальная часть должна быть в конечном итоге расширена до пустой строки.
  • СЛЕДОВАТЬ/ FOLLOW конфликтует, когда два произведения, указывающие на то, что нетерминал в конечном итоге должен быть расширен до пустой строки, конфликтуют друг с другом.

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

FIRST(X) = {a, b, z}
FIRST(Y) = {b, epsilon}
FIRST(Z) = {epsilon} 

У нас также есть следующие наборы FOLLOW:

FOLLOW(X) = {$}
FOLLOW(Y) = {z}
FOLLOW(Z) = {z}

Из этого мы можем построить следующую таблицу синтаксического анализа LL (1):

    a    b    z   $
X   a    Yz   Yz  
Y        bZ   eps
Z             eps

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

Чтобы проверить, является ли грамматика LR (0) или SLR (1), мы начнем с построениявсе наборы конфигурации LR (0) для грамматики.В этом случае, предполагая, что X является вашим начальным символом, мы получаем следующее:

(1)
X' -> .X
X -> .Yz
X -> .a
Y -> .
Y -> .bZ

(2)
X' -> X.

(3)
X -> Y.z

(4)
X -> Yz.

(5)
X -> a.

(6)
Y -> b.Z
Z -> .

(7)
Y -> bZ.

Из этого мы можем видеть, что грамматика не является LR (0), потому что в состояниях есть конфликты сдвига / уменьшения(1) и (6).В частности, потому что у нас есть элементы сокращения Z →.и Y →., мы не можем сказать, уменьшать ли пустую строку до этих символов или сдвигать какой-либо другой символ.В более общем смысле, грамматика с ε-продукцией не является LR (0).

Однако эта грамматика может быть SLR (1).Чтобы увидеть это, мы дополняем каждое сокращение предустановкой для определенных нетерминалов.Это возвращает этот набор конфигурационных наборов SLR (1):

(1)
X' -> .X
X -> .Yz [$]
X -> .a  [$]
Y -> .   [z]
Y -> .bZ [z]

(2)
X' -> X.

(3)
X -> Y.z [$]

(4)
X -> Yz. [$]

(5)
X -> a.  [$]

(6)
Y -> b.Z [z]
Z -> .   [z]

(7)
Y -> bZ. [z]

Теперь у нас больше нет конфликтов смещением-уменьшением.Конфликт в состоянии (1) был устранен, потому что мы уменьшаем его только тогда, когда обращаемся к z, что не конфликтует ни с одним из других элементов.Точно так же конфликт в (6) исчез по той же причине.

Надеюсь, это поможет!

10 голосов
/ 11 июня 2013

Если у вас нет конфликтов ПЕРВЫЙ / ПЕРВЫЙ и нет конфликтов ПЕРВЫЙ / СЛЕДУЮЩИЙ, ваша грамматика LL (1).

Пример конфликта FIRST / FIRST:

S -> Xb | Yc
X -> a 
Y -> a 

Видя только первый входной символ a, вы не можете знать, применять ли производственный S -> Xb или S -> Yc, потому что a находится в ПЕРВОМ наборе X и Y.

Пример конфликта ПЕРВЫЙ / СЛЕДУЮЩИЙ:

S -> AB 
A -> fe | epsilon 
B -> fg 

Видя только первый входной символ f, вы не можете решить, применять ли производственный A -> fe или A -> epsilon, потому что f находится как в первом наборе A, так и в следующем наборе A (A может быть разбирается как эпсилон и б как е).

Обратите внимание, что если у вас нет эпсилон-продукции, у вас не может возникнуть конфликт FIRST / FOLLOW.

2 голосов
/ 05 августа 2015

Простой ответ: Грамматика называется LL (1), если связанная таблица синтаксического анализа LL (1) имеет не более одного произведения в каждой записи таблицы.

Take the simple grammar A -->Aa|b.[A is non-terminal & a,b are terminals]
   then find the First and follow sets A.
    First{A}={b}.
    Follow{A}={$,a}.

    Parsing table for Our grammar.Terminals as columns and Nonterminal S as a row element.

        a            b                   $
    --------------------------------------------
 S  |               A-->a                      |
    |               A-->Aa.                    |
    -------------------------------------------- 

Поскольку [S, b] содержит два произведения, возникает путаница относительно того, какое правило выбрать. Так что это не LL (1).

Несколько простых проверок, чтобы увидеть, является ли грамматика LL (1) или нет. Проверка 1 : Грамматика не должна оставаться рекурсивной. Пример: E -> E + T. не является LL (1), потому что он является рекурсивным слева. Проверка 2 : Грамматика должна быть оставлена ​​с учетом.

Левый факторинг требуется, когда два или более выбора правил грамматики имеют общую строку префикса. Пример: S -> A + int | A .

Проверка 3 : Грамматика не должна быть двусмысленной.

These are some simple checks.
1 голос
/ 01 мая 2016

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

In LL (1)

  • Первый L означает сканирование ввода слева направо. Второй L стоит для левого большинства производных. 1 означает использование одного входного символа на каждом шаг.

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

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

0 голосов
/ 24 июня 2018

С помощью этих двух шагов мы можем проверить, LL (1) или нет. Они оба должны быть удовлетворены.

1. Если у нас есть продукция: A-> a1 | a2 | a3 | a4 | ..... | an. Тогда First (a (i)) пересечение First (a (j)) должно быть phi (пустое множество) [a (i) -a индекс i.]

2.Для каждого нетерминала 'A', если First (A) содержит эпсилон Тогда Первый (А) перекресток Следовать (А) должен быть фи (пустой набор).

...