У меня возникли проблемы с разбором следующей грамматики с использованием метода LALR.
s -> y
y -> dX | ydX
X -> e | Zd
z -> F | epsilon
Сначала я в порядке, вот состояние элемента 0: (разделяет состояния просмотра вперед)
s -> .y, $
y -> .dX, $d
y -> .ydX, $d
Теперь это нормально, но когда вы переходите в состояние 1 с терминала d, я путаюсь. Моя книга имеет состояние 2 следующим образом:
y -> d.X, $d
X -> .e, $d
X -> .Zd, $d
Z -> .f, d
Z -> ., d
Откуда упреждающий терминал «d» появился в нетерминале X? Я думал, что dX происходит от .dX, у которого есть опережающие терминалы "$" и $d". Но при выполнении E-замыкания не должны ли опережающие прогнозы быть первым из $d, который равен "$"? Почему это "$", или "d"? Я думал, что это может происходить из другого состояния, так как это LALR, но состояние, в котором я в конечном итоге сливаюсь с состоянием 1, также не имеет d в предварительном просмотре. Может кто-нибудь объяснить мне, почему существует пара "d" с "$" в опережении этого состояния?Спасибо.
$d
здесь нет двухсимвольного просмотра вперед; это сокращение для набора{$, d}
.FIRST
набора состоит из всех символов, которые находятся вFIRST
элемента набора, поэтомуFIRST({$, d})
это в точности{$, d}
. - person rici   schedule 05.11.2019