【问题标题】:ANTLR4 Add a node directly to the Parse TreeANTLR4 直接向 Parse Tree 添加一个节点
【发布时间】:2020-11-13 11:33:48
【问题描述】:

我是 ANTLR 新手并使用 ANTLR4(4.7.2 Jar 文件)。我目前正在研究 Oracle Parser。

有没有办法从 Parser 或 Lexer 直接向 AST 添加节点(带有一些文本)? 我将 cmets 隐藏在我的 Lexer 中,并希望将其直接添加到树中。

有可能吗?我相信 Less4j 允许类似的东西。

【问题讨论】:

  • 正如 Bart 下面提到的,没有什么可以直接在 Antlr4 运行时中使用隐藏的通道标记来装饰解析树。他是对的。但是您可以使用运行时提供的原语(请参阅ParserRuleContextTerminalNodeImpl)进行后解析,以免在语法中使用特定于目标的代码。
  • @kaby76 感谢您的回复。有什么我可以参考的吗?如前所述,我是新手,在执行上述操作时需要一些帮助
  • 跟随link 到一些你想要的代码。它在 C# 中,因此您必须进行相应的翻译和更改,例如,将递归实现转换为堆栈实现,将流更改为您使用的类型等。但是,它应该可以帮助您入门。
  • @kaby76 :你能告诉我“树是 ParserRuleContext internal_node”是做什么的(在 Program.cs 中提到)吗?什么是 internal_node?我如何将它翻译成java?谢谢。
  • @kaby76 非常感谢。我终于能够根据您提供的样本将 cmets 添加到 ast。

标签: antlr antlr4


【解决方案1】:

有没有办法从 Parser 或 Lexer 直接向 AST 添加节点(带有一些文本)?

不是来自词法分析器:在那个阶段还没有解析树。

您可以通过解析器,但没有 ANTLR API 可以做到这一点。 ANTLR 为您提供解析树,就像它解析您的输入一样。它不允许您对其进行变异。您必须在遍历 ANTLR 解析树时创建自己的解析树,并在该阶段自己进行突变(包括读取隐藏通道)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    相关资源
    最近更新 更多