Давайте начнем с грамматики:.
S → (S) S | & эпсилон;
Чтобы построить SLR (1) синтаксический анализатор для этой грамматики, мы необходимо увеличить его с помощью нового правила запуска:
Start → S
S → (S) S | & Эпсилон;
Обратите внимание, что FOLLOW (S) содержит ) и $ и никаких других символов.
Теперь мы можем приступить к созданию SLR (1) автомат, построив LR (0) автомат и приумножения каждую продукцию с FOLLOW набор:
(0)
Start -> .S [$]
S -> .(S)S [$)]
S -> . [$)]
(1)
Start -> S. [$]
(2)
S -> (.S)S [$)]
S -> .(S)S [$)]
S -> . [$)]
(3)
S -> (S.)S [$)]
(4)
S -> (S).S [$)]
S -> .(S)S [$)]
S -> . [$)]
(5)
S -> (S)S. [$)]
Вы утверждали, что состояния 0, 2, 4 имеют конфликты сдвига/сокращения, но я на самом деле не думаю, что это так. В состоянии (0) у нас есть завершенный элемент S →., Но смотри - $ и). Это означает, что мы уменьшаем только на $ и). С другой стороны, единственное действие сдвига здесь происходит на (
Если бы у нас не было взглядов, у нас был бы конфликт сдвига/уменьшения, но из-за взглядов, которые мы знаем, чтобы сдвинуться, если мы см. (и уменьшить, если мы увидим) или $. Если вы проверите другие состояния, которые вы отметили, вы увидите, что применяется та же самая логика.
В результате эта грамматика действительно является зеркальной (1) .
Ваш вопрос может быть сформулирован лучше. Существует конфликт смены/сокращения без взгляда, но один символ lookahead разрешает его: вы меняете '(' и иначе уменьшаете. Что вы не понимаете? – rici
определение в мои заметки для SLR (1): «если вы хотите уменьшить (x-> b), тогда следующий вход должен соответствовать (x). И я не знаю, как его применять. follow (s) is ")", а следующий вход - "(" .. – user3230613
, если следующий ввод равен '(', вы не можете уменьшить. Но в этом случае вы можете сдвинуть '(', так это то, что вы делаете , – rici