将异常处理为 bison 中的解析错误
Handle exception as a parse error in bison
如何捕获在 bison 中执行规则时抛出的异常
foo : BAR { $$ = new Bar(); }
如果 Bar 的参数不合适,构造函数会抛出 std::invalid_argument
异常。我想捕获该异常并引发编译错误,因此我收到了类似
的本机错误消息
input:42.10: Bad value `baz' for bar
也有很多这种规则,所以最好不要在规则本身内处理,而是在解析器的某个地方处理。
如果您使用的是 lalr1.cc
,Bison 的 C++ 框架,那么对异常的支持有限:如果您抛出 yy::parser::syntax_error
,则异常会作为语法错误被捕获,及时报告,解析器进入错误恢复模式。这很像使用 YYERROR
.
如果抛出其他任何东西,整个解析将中止,堆栈将被清理,异常将被重新抛出。那是 YYABORT
.
因此,如果您想将错误捕获为规则减少,您应该抛出特定的异常,请参阅 C++ Parser Interface Documentation of Bison。
如何捕获在 bison 中执行规则时抛出的异常
foo : BAR { $$ = new Bar(); }
如果 Bar 的参数不合适,构造函数会抛出 std::invalid_argument
异常。我想捕获该异常并引发编译错误,因此我收到了类似
input:42.10: Bad value `baz' for bar
也有很多这种规则,所以最好不要在规则本身内处理,而是在解析器的某个地方处理。
如果您使用的是 lalr1.cc
,Bison 的 C++ 框架,那么对异常的支持有限:如果您抛出 yy::parser::syntax_error
,则异常会作为语法错误被捕获,及时报告,解析器进入错误恢复模式。这很像使用 YYERROR
.
如果抛出其他任何东西,整个解析将中止,堆栈将被清理,异常将被重新抛出。那是 YYABORT
.
因此,如果您想将错误捕获为规则减少,您应该抛出特定的异常,请参阅 C++ Parser Interface Documentation of Bison。