ANTLR4解析树不包含规则名称

发布于 2025-01-11 09:42:26 字数 571 浏览 0 评论 0原文

ANTLR4 不在解析树中显示规则名称。

例如,1 + 2 打印为:

简单表达式的树

main 中的代码:

    std::string test = "1 + 2";
    ANTLRInputStream input(test);
    GrammarLexer lexer(&input);
    CommonTokenStream tokens(&lexer);
    GrammarParser parser(&tokens);

    auto *tree = parser.expression();

    std::cout << tree->toStringTree(true) << "\n";

ANTLR4 doesn't show rule names in parse tree.

For example, 1 + 2 is printed as:

Simple expression's tree

Code in main:

    std::string test = "1 + 2";
    ANTLRInputStream input(test);
    GrammarLexer lexer(&input);
    CommonTokenStream tokens(&lexer);
    GrammarParser parser(&tokens);

    auto *tree = parser.expression();

    std::cout << tree->toStringTree(true) << "\n";

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

墨洒年华 2025-01-18 09:42:26

我深入研究了 ANTLR 的 C++ 运行时源代码,发现了这两个函数:

/// Print out a whole tree, not just a node, in LISP format
/// {@code (root child1 .. childN)}. Print just a node if this is a leaf.
virtual std::string toStringTree(bool pretty = false) = 0;

/// Specialize toStringTree so that it can print out more information
/// based upon the parser.
virtual std::string toStringTree(Parser *parser, bool pretty = false) = 0;

因此,要修复“错误”,请替换

tree->toStringTree(true)

tree->toStringTree(&parser, true)

I dived into ANTLR's C++ runtime source code and found these 2 functions:

/// Print out a whole tree, not just a node, in LISP format
/// {@code (root child1 .. childN)}. Print just a node if this is a leaf.
virtual std::string toStringTree(bool pretty = false) = 0;

/// Specialize toStringTree so that it can print out more information
/// based upon the parser.
virtual std::string toStringTree(Parser *parser, bool pretty = false) = 0;

So, to fix the "error", replace

tree->toStringTree(true)

with

tree->toStringTree(&parser, true)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文