%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) ;
后,解析器需要 ELSE
或 shift_else
。
大概那里没有 ELSE
,因为它没有出现在源代码中。
除非你的词法分析器凭空变出 shift_else
,否则下一个标记将是 }
,而不是 ELSE
或 shift_else
,因此错误。
对于 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
,因此错误。