%nonassoc 导致语法错误

%nonassoc causing syntax error

对于 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

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

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

大概那里没有 ELSE,因为它没有出现在源代码中。

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