Автомат LR - это пусковой автомат, который использует стек состояний, а не одно текущее состояние, как с DFA. Действия (shift, reduce и goto) управляются государством, находящимся в верхней части стека, со сдвигом и goto, нажимая новое состояние и уменьшая количество фиксированных состояний на основе уменьшаемого правила. В вашем примере, если мы подсчитаем состояния в столбцах (так что 0 - начальное состояние в верхнем левом углу, 3 - состояние в среднем столбце), мы можем показать, как он анализирует входную строку «ab»:
Action Stack
initial state 0
shift a 0 1
reduce A->a 0
goto A 0 3
shift b 0 3 4
reduce B->b 0 3
goto B 0 3 5
reduce S->AB 0
goto S 0 2
accept
Поскольку это парсер LR (0), каждое состояние имеет либо действие shift/goto, либо одно действие уменьшения, и нет необходимости в поиске, чтобы знать, что делать дальше (хотя сдвиг, который потребляет входной токен, зависят от этого токена, чтобы определить, какое состояние переключиться на).
Для ввода «AAB» процесс только немного дольше:
Action Stack
initial state 0
shift a 0 1
reduce A->a 0
goto A 0 3
shift a 0 3 1
reduce A->a 0 3
goto A 0 3 3
shift b 0 3 3 4
reduce B->b 0 3 3
goto B 0 3 3 5
reduce S->AB 0 3
goto S 0 3 6
reduce B->S 0 3
goto B 0 3 5
reduce S->AB 0
goto S 0 2
accept
показывает эффект правой возвратных степенных правило, чтобы соответствовать несколько элементов а на входе (B -> S -> AB), что приводит к тому, что все а сдвинуты (нажатие состояний в стеке) до тех пор, пока не будет достигнута окончательная последовательность повторной последовательности, а затем серия действий reduce/goto, чтобы отбросить их. Лучше использовать леворекурсивное правило и использует фиксированное количество пространства стека, чередуя смены и уменьшая.
Я думаю, что намерения рисовальщиков по маркировке дуг состоят не в том, чтобы показать, какой вход вызывает переход, но также и из совпадающих правил (внутри ящиков), и таким образом вызвал переход. Таким образом, в первом поле используется правило '' A -> a .'', и, таким образом, он маркирует дугу вправо с помощью '' A''. – BitTickler