gpt4 book ai didi

c++ - 如何使用 C++ 在 antlr4 中捕获解析异常?

转载 作者:行者123 更新时间:2023-11-30 04:47:33 30 4
gpt4 key购买 nike

我正在使用 antlr4 c++ 目标。我不知道如何捕获解析异常,也找不到关于它的文档。

我试过使用 parser.setErrorHandler(std::make_shared<antlr4::BailErrorStrategy>()); ,但它抛出一个异常,其“e.what()”为空。

try {
ANTLRInputStream instream(sql);
MyLexer lexer(&instream);
CommonTokenStream tokens(&lexer);
MyParser parser(&tokens);
// parser.setErrorHandler(std::make_shared<antlr4::BailErrorStrategy>());

auto ctx = parser.singleStatement();
...
} catch(ParseCancellationException& e) {
std::cout << string(e.what()) << std::endl;
throw MyParseException(e.what());
} catch (std::exception& e) {
std::cout << e.what() << std::endl;
}

我希望捕捉到异常消息,例如“第 1:19 行缺少‘;’”在 ''",并使用我自己的异常类型重新抛出它。

最佳答案

没有您可以捕获的解析异常。 ParseCancellationException 非常特殊,因为它用于实现提前退出策略(通常与 2-phase 方法结合使用以在 SLL 模式下开始解析(语法正确的输入速度更快)并继续 LL 模式,如果第一阶段失败。异常会绕过所有通常在解析错误时启动的 catch 子句。

捕获解析错误的正确方法是(正如 sepp2k 已经提到的那样)通过添加您自己的错误监听器,该监听器会使用所有必要的信息(位置、违规 token 等)进行调用,以便您可以为用户创建自己的错误.

我已经在 MySQL Workbench 中实现了该方法。检查代码 for the parse steplexer以及parser error在那里处理。

关于c++ - 如何使用 C++ 在 antlr4 中捕获解析异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56205952/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com