Я пытаюсь реализовать несколько инструкций в своем компиляторе. Для простоты приведу лишь небольшой пример. Что работает:
expr1;
Что не работает:
expr1; expr2;
А грамма выглядит так:
%start expression
%%
expression
: first ';'
;
first
: first '+' second
| first '-' second
| second
;
second
: second '*' number
| second '/' number
| number
number
: NUM_INT
;
Вам нужно правило, которое соответствует нескольким операторам, и вы можете определить это с помощью рекурсии следующим образом:
statements
: statements statement
| /* empty */
;
Это соответствует нулю или большему количеству утверждений. Если вам нужен хотя бы один, вам следует заменить пустой футляр на statement
.