对于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
有关为何会发生这种情况的任何建议?我该怎么做才能解决这个问题?
答案 0 :(得分:0)
阅读if(1 > 5) ;
后,解析器需要ELSE
或shift_else
。
据推测,那里没有ELSE
,因为它没有出现在源代码中。
除非你的词分析员凭空想出shift_else
,否则下一个标记将是}
,而不是ELSE
或shift_else
,因此错误。