好。所以我的任务是在我的编译器类中做一个玩具编译器,因此我选择了Bison和Flex。我已经掌握了关于Bison的大部分基础知识,并且在某种程度上知道LR,LALR和SLR解析器的工作原理。但是,这更像是一个技术问题。在我的语法中,我已经开始使用error
标记添加错误产生。现在我的问题是,每当Bison使用error
规则时,它就会syntax error
与yyerror
一起打印。我不想要这个,因为我想要一个更好的信息来显示。一个例子:
我有以下规则来检测不匹配的花括号(请记住,大写是终端,小写是非终端):
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的书(我知道它不一样)并搜索谷歌的任何事都无济于事。
答案 0 :(得分:3)
error
产品用于从语法错误中恢复,而不是用于检测它们。因此,您的规则program_start: error '}'
基本上是在说{34}当program_start
出现语法错误时,通过将所有内容丢弃到下一个'}'
令牌来恢复#34} ;。如果您为其输入program p { ..something with a syntax error.. }
,则即使没有不平衡的大括号,您的规则也可用于从该错误中恢复。
考虑到这一点,bison正在做什么是有道理的 - 它会检测语法错误,调用yyerror
来输出消息,然后尝试恢复,寻找可以应用的错误规则。
如果要更改/禁止显示错误消息,则应执行yyerror
,而不是错误恢复规则。