Другой способ, возможно, завершить отличный ответ d11wtq, если это возможно:
Правило, допускающее обнуление (которое выводит ϵ), учитывается при построении синтаксического анализатора под функциями FOLLOW(X)
и FIRST(X)
.Например, если у вас есть A -> B x
, а B может вывести ϵ, то мы должны включить x
в набор, вычисленный как FIRST(A)
.А также в наборе FOLLOW(B)
.
Кроме того, пустые правила легко представлены в канонических LR(1)
наборах элементов.
Одна полезная вещь - представить, что существует дополнительный нетерминальный символ$
, который представляет конец файла.
Давайте возьмем грамматику:
S -> X | ϵ
X -> id
Для первого канонического набора LR(1)
элементов мы можем взять первый набор LR(0)
элементови добавьте заголовок с символом '$':
S -> . X , '$'
S -> . , '$'
X -> . id , '$'
Тогда у нас есть один для заголовка: id
:
S -> . X , 'id'
S -> . , 'id
X -> . id , 'id'
Теперь давайте посмотрим на FIRST
и FOLLOW
sets:
S -> . X , '$'
Это не пункт "точка-финал", поэтому здесь нужно смещаться, но только если набор FIRST(X)
содержит наш прогнозный символ $
.Это неверно, поэтому мы не заполняем запись в таблице.
Далее:
S -> . , '$'
Это элемент «точка-финал», поэтому его нужно уменьшить.Чтобы проверить контекст для сокращения, мы смотрим на FOLLOW(S)
: может ли грамматический символ, который мы хотим уменьшить, сопровождаться тем, что находится в поле зрения?Определенно да.$
всегда в FOLLOW(S)
, потому что начальный символ по определению сопровождается концом ввода.Так что да, мы можем уменьшить.И так как мы уменьшаем символ S
, уменьшение на самом деле является действием accept
: синтаксический анализ заканчивается.Мы заполняем запись таблицы действием accept
.
Аналогичным образом мы можем повторить для следующего набора элементов с lookahead id
.Давайте перейдем к правилу S-производного-пустого:
S -> . , 'id'
Может ли S
сопровождаться id
?Едва.Так что это сокращение не подходит.Мы не заполняем запись таблицы анализатора.
Таким образом, вы можете видеть, что пустое правило не создает проблем.Он немедленно превращается в точечный LR(0)
или LR(1)
элемент (в зависимости от метода построения синтаксического анализатора) и обрабатывается так же, как и любой другой точечный конечный элемент, с учетом рассмотрения и заполнения таблиц.