将异常处理为野牛中的解析错误

时间:2015-05-12 08:44:19

标签: c++ exception-handling bison

如何在野牛执行规则时抛出异常,例如

foo : BAR { $$ = new Bar($1); }

如果它的参数不合适,Bar构造函数会抛出std::invalid_argument异常。我想捕获该异常并引发编译错误,因此我得到本机错误消息,如

input:42.10: Bad value `baz' for bar

此外还有很多这样的规则,所以处理它不是在规则本身,而是在解析器中的某个地方会很棒。

1 个答案:

答案 0 :(得分:1)

如果您正在使用Bison的C ++框架lalr1.cc,那么对异常的支持有限:如果您抛出yy::parser::syntax_error,则会将异常作为语法错误捕获,并且已正式报告,解析器进入错误恢复模式。这非常类似于使用YYERROR

如果抛出其他内容,则会中止整个解析,清理堆栈,并重新抛出异常。那是YYABORT

因此,如果您希望在规则缩减时遇到错误,则应抛出特定异常,请参阅C++ Parser Interface Documentation of Bison