gpt4 book ai didi

antlr4 - 需要一个 ANTLR4 树行走线索

转载 作者:行者123 更新时间:2023-12-04 21:45:51 27 4
gpt4 key购买 nike

我的(一个)编译器类(class)已经很多年了,所以请原谅我
问题是不恰当的。我也是 ANTLR 和 C(而不是 Java)编码器的新手。
我想做的是描述我的问题,然后寻求最好的建议
使用的技术。

我正在尝试将 ASN.1 作品翻译成 ML。例如,

Foo ::= ENUMERATED {
bar (0), -- some comment 0
baz (1) -- some comment 1
}

进入
<Enumerated name="Foo">
<NamedValues>
<Unsigned name="bar" value="0" comment="some comment 0"/>
<Unsigned name="baz" value="1" comment="some comment 1"/>
</NamedValues>
</Enumerated>

我的(简化的)ASN1 语法是:
assignment : IDENTIFIER typeAssignment ;
typeAssignment : '::=' type ;
type : builtinType ;
builtinType : enumeratedType ;
enumeratedType : 'ENUMERATED' '{' enumerations '}' ;
...

“权威 ANTLR4 引用”中的几个示例演示了
覆盖 BaseListener 中的某些 enterNode 或 exitNode 方法和
所需的一切都在节点的上下文中。我的问题是我想要
覆盖 enterTypeAssignmentexitTypeAssignment ,但其中一些
我需要的信息位于更高(例如分配)或更低(例如枚举)的节点中
在解析树上。

这里是否有足够的描述来询问我是否应该使用访问者
或听众模式?关于要关注哪些书籍示例的任何建议
不胜感激。

我对蛮力方法有一些运气:
import org.antlr.v4.runtime.TokenStream;
import org.antlr.v4.runtime.misc.Interval;

public class MylListener extends ASN1BaseListener {
ASN1Parser parser;
String id = "";
String assignedType = "";

public MyListener(ASN1Parser parser) {this.parser = parser;}

@Override
public void enterAssignment(ASN1Parser.AssignmentContext ctx) {
id = ctx.IDENTIFIER().getText();
}

/** Listen to matches of typeAssignment **/
@Override
public void enterTypeAssignment(ASN1Parser.TypeAssignmentContext ctx) {
if ( ctx.type() != null ) {
if ( ctx.type().builtinType() != null ) {
if ( ctx.type().builtinType().enumeratedType() != null ) {
assignedType = "Enumerated";
System.out.println("");
System.out.println("<Enumerated name=\""+id+"\">");
...
}
}
}
}

@Override
public void exitTypeAssignment(ASN1Parser.TypeAssignmentContext ctx) {
if (assignedType.length() > 0) {
System.out.println("</"+assignedType+">");
assignedType = "";
}
}
}

但可能有一个更优雅的解决方案......

更新:我得到了我想要的结果,方法是在我沿着树向下的过程中将 TerminalNodes 保存在全局变量中,并让这些变量可以访问以覆盖树更下方的监听器中的方法。有没有更好的方法从给定节点访问父或祖父上下文?

最佳答案

我会首先解析这个东西,然后使用访问者。
使用 Listener 的优势在于您拥有所有可用信息。

您还可以使用 C# 目标,它可能更易于在 C 背景下使用。

关于antlr4 - 需要一个 ANTLR4 树行走线索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14540142/

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