Я пытаюсь обернуть голову вокруг теории парсера, и я продолжаю находить один и тот же пример в разных источниках.Грамматика выглядит примерно так (упрощенно):
E = T
E = E + T
T = 0..9
Итак, предположительно, строка 2 + 2
будет проанализирована как таковая ("|" отделяет стек от напоминания)
|2 + 2 <-can't reduce, shift
2|+ 2 <-reduce by T = 0..9
T|+ 2 <-reduce by E = T
E|+ 2 <-can't reduce, shift
E +|2 <-can't reduce, shift
E + 2| <-reduce by T = 0..9
E + T| <-reduction by E = E + T here?
E| <-done
Вопрос в том, что на E + T
пошаговый синтаксический анализатор может применить два разных сокращения к самой правой части стека: E = T
(в результате E + E
) и E = E + T
(в результате E
).И я не могу найти ясного и сознательного объяснения, как оно выбирает одно над другим.
Чего мне не хватает?