对于 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) ;
之后,解析器期待一个 ELSE
或一个 shift_else
。
大概那里没有 ELSE
,因为它没有出现在源代码中。
除非你的词法分析器凭空变出一个shift_else
,否则下一个标记将是一个}
,它不是一个ELSE
或shift_else
,因此出现错误。
关于c - %nonassoc 导致语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33660363/