c - %nonassoc 导致语法错误

标签 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

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

最佳答案

在读取 if(1 > 5) ; 之后,解析器期待一个 ELSE 或一个 shift_else

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

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

关于c - %nonassoc 导致语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33660363/

相关文章:

c - yacc/bison 操作的范围是什么?

bison - Yacc 的某些版本是否在规则和操作之间使用 '='?

c - yacc生成的.y文件如何恢复.c文件?

c - 加权随机数生成

c - MSVC "error C2099: initializer is not a constant",其值由其他常量组成,仅在 C 上

c - 查找 C 程序的输出

bison - 轮类减少冲突

c - 如何修复传递给 pango_layout_set_text() 的无效 UTF-8 字符串

C with Bison+Flex 检查规则文件

在语句结尾解析可选分号