%nonassoc导致语法错误

时间:2015-11-11 21:41:12

标签: c bison yacc flex-lexer

对于if和if-else语句语法,我有一些语法。

以下是我的代码的简化摘录,以显示我如何使用if和if-else语句语法,因此如果存在与该语法无关的错误,那么请不要担心。我向你保证,我正在使用的代码中没有编译错误:

%token IF ELSE VOID ID VOID_PARAMS

%nonassoc shift_else
%nonassoc ElSE

%%

Func: VOID ID VOID_PARAMS '{' Stmt '}'
;
If_Stmt: IF '(' L_expr ')' Stmt
;
Stmt: If_Stmt shift_else
;
| If_Stmt ELSE Stmt
;
| ';'
| ...
;

L_expr: ...
;

它已经工作了一段时间,但现在它在功能结束时发现错误。例如:

void foo(void) {
    if (1 > 5)
        ;
}

给出了这个输出(使用yyerror()):

Found unexpected token: '}' on line 4

有关为何会发生这种情况的任何建议?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

阅读if(1 > 5) ;后,解析器需要ELSEshift_else

据推测,那里没有ELSE,因为它没有出现在源代码中。

除非你的词分析员凭空想出shift_else,否则下一个标记将是},而不是ELSEshift_else,因此错误。