LR парсер для эпсилон

Недавно я реализовал синтаксический анализатор LR(1) (без эпсилон) и задавался вопросом, как бы я реализовал эпсилон в алгоритме синтаксического анализа (примечание: не алгоритм построения таблицы). Это моя грамматика:

start -> A b
b -> B | \epsilon

Я выполнил шаги, перечисленные здесь, и получил это в результате моего анализатора (таблица):

state 0 on symbol start: 1
state 0 on symbol A: shift and goto state 2
state 1 on symbol $: accept
state 2 on symbol b: 3
state 2 on symbol B: shift and goto state 4
state 2 on symbol $: reduce b → 
state 3 on symbol $: reduce start → A b
state 4 on symbol $: reduce b → B

Приведенная выше таблица верна, но когда я пытаюсь разобрать A, перехода нет:

error: no transition in table for (0, 'b')

Вот как выглядит мой стек:

[0]
[0, 'A', 2]
[0, 'b'] # stack during the error

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


person xilpex    schedule 08.05.2020    source источник


Ответы (1)


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

Вот что вы ожидаете:

            LOOK
STACK       AHEAD   ACTION
[0]         A       shift, goto state 2    pushes A (shift) and new state (2)
[0 A 2]     $       reduce b ->            pops 0 pairs, pushes b (reduce) 
[0 A 2 b]           + goto 3               action for b in state 2
[0 A 2 b 3] $       reduce start -> A b    pops 2 pairs, pushes start (reduce)
[0 start]           + goto 1               action for start in state 0
[0 start 1] $       accept                 

Если бы мне пришлось сделать ставку на предположение, я бы сказал, что вы выдвигаете один символ для правой стороны. Как я уже упоминал в другом месте (включая ответ, который вы цитируете), ничего не значит. Это ноль символов, и при его нажатии ничего не появляется.

person rici    schedule 08.05.2020
comment
Ах хорошо. Я забыл не выталкивать эпсилон. Спасибо! - person xilpex; 08.05.2020
comment
Последний вопрос: я читал несколько постов о LR(1) и epsilon, и там упоминались наборы FOLLOW. Какое отношение к этому имеют наборы FOLLOW? - person xilpex; 08.05.2020
comment
Как и в случае с красивыми диаграммами для КПК, у bison есть прекрасное средство трассировки, которое точно скажет вам, что делает синтаксический анализатор на каждом этапе, включая распечатки стека. - person rici; 08.05.2020
comment
Наборы FOLLOW не используются в CLR, поэтому ничего. - person rici; 08.05.2020
comment
Скорее всего перепутали :-) - person xilpex; 08.05.2020
comment
Однако они используются для вычисления элементов SLR. Возможно, именно об этом и были посты. Надо бы посты посмотреть. - person rici; 08.05.2020