Что случилось с этой грамматикой
s : cmd
| cmd SOMETHING
cmd :WORD
WORD и SOMETHING не являются нулевыми терминалами
это грамматика LR1, поэтому бизон должен разобрать ее без проблем.
однако я столкнулся с неожиданной проблемой во время выполнения: программа запрашивает ввод дважды, поэтому, например, когда я ввожу "qwerty", он запрашивает второй ввод, когда я пытаюсь его отладить, я получаю следующее:
Starting parse
Entering state 0
Reading a token: qwerty
Next token is token WORD
Shifting token WORD
Entering state 1
Reducing stack by rule 3 (line 20):
$1 = token WORD ()
-> $$ = nterm cmd ()
Stack now 0
Entering state 3
Reading a token:
(asks for input a second time)
1 ответ
Решение
Как он узнает, какое правило для s использовать, пока не попытается прочитать что-то, и либо успешно (второе правило), либо потерпит неудачу (первое правило)? Что означает, что нужно запросить второй вход.