如何在野牛执行规则时抛出异常,例如
foo : BAR { $$ = new Bar($1); }
如果它的参数不合适,Bar构造函数会抛出std::invalid_argument
异常。我想捕获该异常并引发编译错误,因此我得到本机错误消息,如
input:42.10: Bad value `baz' for bar
此外还有很多这样的规则,所以处理它不是在规则本身,而是在解析器中的某个地方会很棒。
答案 0 :(得分:1)
如果您正在使用Bison的C ++框架lalr1.cc
,那么对异常的支持有限:如果您抛出yy::parser::syntax_error
,则会将异常作为语法错误捕获,并且已正式报告,解析器进入错误恢复模式。这非常类似于使用YYERROR
。
如果抛出其他内容,则会中止整个解析,清理堆栈,并重新抛出异常。那是YYABORT
。
因此,如果您希望在规则缩减时遇到错误,则应抛出特定异常,请参阅C++ Parser Interface Documentation of Bison。