У меня есть грамматика зубров:
input: /* empty */
| input command
;
command:
builtin
| external
;
builtin:
CD { printf("Changing to home directory...\n"); }
| CD WORD { printf("Changing to directory %s\n", $2); }
;
Мне интересно, как заставить Бизона не принимать (YYACCEPT?) Что-то как command
, пока он не прочитает ВСЕ входные данные. Таким образом, я могу иметь все эти правила ниже, которые используют рекурсию или что-то еще для построения вещей, что приводит либо к допустимой команде, либо к чему-то, что не будет работать.
Один простой тест, который я делаю с приведенным выше кодом, просто вводит "cd mydir mydir". Зубр разбирает CD
и WORD
и говорит: «Эй! Это команда, поставь ее наверх!». Тогда следующий найденный токен - это просто WORD
, у которого нет правила, и затем он сообщает об ошибке.
Я хочу, чтобы он прочитал всю строку и понял, что CD WORD WORD
не является правилом, а затем сообщит об ошибке. Я думаю, что упускаю что-то очевидное и буду очень признателен за любую помощь - спасибо!
Также - я пытался использовать input command NEWLINE
или что-то подобное, но он все равно выдвигает CD WORD
в качестве команды, а затем анализирует дополнительные WORD
отдельно.