Неоднозначная грамматика

Модератор: Модераторы разделов

frp
Сообщения: 1445
ОС: Debian Squeeze

Неоднозначная грамматика

Сообщение frp »

Грамматика (код выпилен):

Код: Выделить всё

%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, то бизон успешно компилирует грамматику.
Почему так? Что делать?
Что это значит?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Неоднозначная грамматика

Сообщение /dev/random »

Если после вложенных if'ов будет стоять else, то непонятно, к какому if'у он относится. Следовательно, грамматика неоднозначна. Подробности и решение - в секциях 5.2 и 3.7.8 info bison.
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Неоднозначная грамматика

Сообщение frp »

/dev/random писал(а):
05.10.2010 01:24
Подробности и решение - в секциях 5.2 и 3.7.8 info bison.

Спасибо. Применил данное решение.

И все таки интересно, как для данного случая написать правильную грамматику.
Спасибо сказали: