Код: Выделить всё
%token NUM END IDENT VAR ASSIGN_OP BEGIN_TOK FUNC_TOK EXTERNAL VARARG TRUE_TOK FALSE_TOK OR XOR AND IF THEN ELSE LE BE NE WHILE DO
%%
PROGRAM:
DECLARATIONS MAIN_BLOCK
;
DECLARATIONS:
| VAR_DECLS DECLARATIONS
| FUNC_DECL DECLARATIONS
;
MAIN_BLOCK:
BEGIN_TOK STATEMENTS END '.'
;
STATEMENTS:
| STATEMENT ';' STATEMENTS
;
STATEMENT:
EXPR
| LVAL ASSIGN_OP EXPR
| IF_STATEMENT
| WHILE_STATEMENT
| BEGIN_TOK STATEMENTS END
;
IF_STATEMENT:
IF EXPR THEN STATEMENT ELSE STATEMENT
| IF EXPR THEN STATEMENT
;
WHILE_STATEMENT:
WHILE EXPR DO STATEMENT
;
LVAL: IDENT
;
EXPR:
BOOL_OP
| EXPR2
;
EXPR2: TERM
| TERM '+' EXPR2
| TERM '-' EXPR2
| TERM OR EXPR2
| TERM XOR EXPR2
;
TERM: VAL
| TERM '*' VAL
| TERM '/' VAL
| TERM AND VAL
;
VAL:
NUM
| TRUE_TOK
| FALSE_TOK
| IDENT
| IDENT '(' ARGS ')'
;
BOOL_OP:
EXPR2 '<' EXPR2
| EXPR2 '>' EXPR2
| EXPR2 '=' EXPR2
| EXPR2 LE EXPR2
| EXPR2 BE EXPR2
| EXPR2 NE EXPR2
;
VAR_DECLS: VAR VAR_DECL_LIST_T
;
VAR_DECL_LIST_T: VAR_DECL VAR_DECL_LIST
;
VAR_DECL_LIST:
| VAR_DECL VAR_DECL_LIST
;
VAR_DECL:
IDENT ':' IDENT ';'
;
ARGS:
| EXPR
| EXPR ',' ARGS
;
FUNC_DECL:
FUNC_TOK IDENT '(' DECL_ARGS ')' ':' IDENT ';' EXTERNAL ';'
| FUNC_TOK IDENT ':' IDENT ';' EXTERNAL ';'
;
DECL_ARGS:
| DECL_ARG
| DECL_ARG ';' DECL_ARGS
;
DECL_ARG:
IDENT ':' IDENT
;
%%При компиляции бизон ругается:
Код: Выделить всё
main.ypp: конфликты: 1 сдвига/выводаЕсли удаляю все упоминания IF_STATEMENT, то бизон успешно компилирует грамматику.
Почему так? Что делать?
Что это значит?