野牛总是打印“语法错误”

时间:2015-10-22 23:35:59

标签: c compiler-construction bison flex-lexer

好。所以我的任务是在我的编译器类中做一个玩具编译器,因此我选择了Bison和Flex。我已经掌握了关于Bison的大部分基础知识,并且在某种程度上知道LR,LALR和SLR解析器的工作原理。但是,这更像是一个技术问题。在我的语法中,我已经开始使用error标记添加错误产生。现在我的问题是,每当Bison使用error规则时,它就会syntax erroryyerror一起打印。我不想要这个,因为我想要一个更好的信息来显示。一个例子:

我有以下规则来检测不匹配的花括号(请记住,大写是终端,小写是非终端):

program_start: 
PROGRAM IDENTIFIER '{' translation_unit '}'
| error '}'                                   {yyerror("Mismatched }");}
;

所以,如果我使用像:

这样的样本
program p { 

}
}

然后显然有一个不平衡的支架。然而,这输出:

LINE: 26 AT }
ERROR: syntax error
LINE: 26 AT }
ERROR: Mismatched }

我的yyerror功能

void yyerror(const char* error_str) {
    fprintf(stderr, "LINE: %d AT %c\nERROR: %s\n",yylineno, yytext[0], error_str);
}

所以我的问题是我不希望Bison打印“语法错误”并只打印我传递给yyerror的错误消息。我在Lex& Yacc的书(我知道它不一样)并搜索谷歌的任何事都无济于事。

1 个答案:

答案 0 :(得分:3)

yacc / bison中的

error产品用于语法错误中恢复,而不是用于检测它们。因此,您的规则program_start: error '}'基本上是在说{34}当program_start出现语法错误时,通过将所有内容丢弃到下一个'}'令牌来恢复#34} ;。如果您为其输入program p { ..something with a syntax error.. },则即使没有不平衡的大括号,您的规则也可用于从该错误中恢复。

考虑到这一点,bison正在做什么是有道理的 - 它会检测语法错误,调用yyerror来输出消息,然后尝试恢复,寻找可以应用的错误规则。

如果要更改/禁止显示错误消息,则应执行yyerror,而不是错误恢复规则。