gpt4 book ai didi

tree - 扩展 ANTLR3 AST

转载 作者:行者123 更新时间:2023-12-01 09:33:54 29 4
gpt4 key购买 nike

使用 ANTLR2,您可以在语法定义文件中定义如下内容:

options
{
language = "CSharp";
namespace = "Extended.Tokens";
}

tokens {
TOKEN<AST=Extended.Tokens.TokenNode>;
}

然后,您可以创建一个类:

public class TokenNode: antlr.BaseAST
{
...
}

如果可以使用类似的东西(将类创建委托(delegate)给 AST 工厂而不是我手动执行树复制),有什么想法吗?仅仅通过简单的语法定义从旧格式复制到新格式是行不通的,我试图在他们的网站和样本中搜索类似的东西。有什么提示吗?

编辑

我不是要创建自定义标记,而是要创建自定义“节点解析器”。

为了“执行”一棵树,您有 2 个选择(据我所知):

  1. 创建一个“树访问者”并处理值,或者
  2. 通过“几乎复制”语法定义来创建树解析器。

在 v2 的情况下,我可以将树节点装饰成我想要的任何方法,然后在解析器运行后调用它们,只需从根节点调用“执行”之类的东西。

最佳答案

我对 C# 知之甚少,但与 Java 目标应该没有太大区别。

您可以通过在 options { ... } 部分(一个 XTree在这种情况下):

T.g

grammar T;

options {
output=AST;
ASTLabelType=XTree;
}

tokens {
ROOT;
}

@parser::header {
package demo;
import demo.*;
}

@lexer::header {
package demo;
import demo.*;
}

parse
: Any* EOF -> ^(ROOT Any*)
;

Any
: .
;

然后您创建一个扩展 CommonTree 的自定义类:

演示/XTree.java

package demo;

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;

public class XTree extends CommonTree {

public XTree(Token t) {
super(t);
}

public void x() {
System.out.println("XTree.text=" + super.getText() + ", children=" + super.getChildCount());
}
}

并且当您创建TParser 实例时,您必须创建并设置一个自定义TreeAdaptor,它会创建您的XTree 实例:

演示/Main.java

package demo;

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;

public class Main {

public static void main(String[] args) throws Exception {
String source = "ABC";
TLexer lexer = new TLexer(new ANTLRStringStream(source));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.setTreeAdaptor(new CommonTreeAdaptor(){
@Override
public Object create(Token t) {
return new XTree(t);
}
});
XTree root = (XTree)parser.parse().getTree();
root.x();
}
}

运行演示:

java -cp antlr-3.2.jar org.antlr.Tool T.g -o demo/
javac -cp antlr-3.2.jar demo/*.java
java -cp .:antlr-3.2.jar demo.Main

将打印:

XTree.text=ROOT, children=3

有关详细信息,请参阅:http://www.antlr.org/wiki/display/ANTLR3/Tree+construction

关于tree - 扩展 ANTLR3 AST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7635729/

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