2013-05-25 4 views

ответ

5
options { 
    k = 1; 
} 

Это даст предупреждение, если ваш грамматист не находится в LL (1).

+0

Спасибо. Это намного проще, чем я думал. – herry

+0

Это, похоже, не работает для ANTLR4? –

1

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

1) проверьте FIRST множество всех нетерминалов и, если есть какие-то дубликаты среди одного нетерминала, то грамматика не LL (1).
EX: S-> aba | abc (какое производство мы используем, если нам дается вход «a», мы не можем определить, и вам нужно заглянуть в следующий токен ввода, и на самом деле нам нужно заглянуть на третье, чтобы определить (так это требует LL (3).

2) Так как мы знаем, какие нетерминальные мы находим материал, мы не должны рассматривать первый набор других нетерминалах.
EX. S-> аба
T -> acc
ИНТЕКЦИЯ FIRST (s) с FIRST (T) = {a}, но поскольку мы знаем, что мы производим либо для S, либо для T (только по одному), нам не нужно беспокоиться о множественные нетерминалы, имеющие непустые пересекающиеся множества.

3) Наконец, будьте осторожны, когда грамматика переходит к пустой строке (S-> ε). В этом случае набор FOLLOW должен быть объединен с FIRST, чтобы убедиться, что их пересечение пуст.
EX. S-> aba | bSa | ε
T-> cdd
Здесь, если мы получим вход «ba ...», мы будем использовать производственную S-> bSa, но тогда мы увидим «а» в нашем потоке ввода и не будем знать следует ли производить S-> aba (если вход был b [aba] a) или для получения S-> ε (если вход был b [ε] a)

Смежные вопросы