gpt4 book ai didi

java - Antlr4 - 是否有使用 ParseTree Walker 的简单示例?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:12 24 4
gpt4 key购买 nike

Antlr4 有一个新类 ParseTreeWalker。但是我该如何使用它呢?我正在寻找一个最小的工作示例。我的语法文件是 'gram.g4',我想解析一个文件 'program.txt'

到目前为止,这是我的代码。 (假设 ANTLR 已经运行了我的语法文件并创建了所有的 gramBaseListenergramLexer 等等):

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import static org.antlr.v4.runtime.CharStreams.fromFileName;

public class launch{
public static void main(String[] args) {

CharStream cs = fromFileName("gram.g4"); //load the file
gramLexer lexer = new gramLexer(cs); //instantiate a lexer
CommonTokenStream tokens = new CommonTokenStream(lexer); //scan stream for tokens
gramParser parser = new gramParser(tokens); //parse the tokens

// Now what?? How do I connect the above with the below?

ParseTreeWalker walker = new ParseTreeWalker(); // how do I use this to parse program.txt??
}}

我正在使用 java,但我认为它在其他语言中也是类似的。

ANTLR 文档 ( http://www.antlr.org/api/Java/index.html ) 缺少示例。互联网上有很多教程,但它们大多是针对 ANTLR 版本 3 的。少数使用版本 4 的教程不起作用或已过时(例如,没有 parser.init() 函数,并且像 ANTLRInputStream 这样的类已被弃用)

在此先感谢任何可以提供帮助的人。

最佳答案

对于语法中的每个解析器规则,生成的解析器都会有一个具有该名称的对应方法。调用该方法将按照该规则开始解析。

因此,如果您的“root-rule”被命名为 start然后你将通过 gramParser.start() 开始解析返回 ParseTree .然后可以将这棵树送入 ParseTreeWalker与您要使用的监听器一起使用。

总而言之,它可能看起来像这样(由 OP 编辑​​):

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import static org.antlr.v4.runtime.CharStreams.fromFileName;

public class launch{
public static void main(String[] args) {

CharStream cs = fromFileName("program.txt"); //load the file
gramLexer lexer = new gramLexer(cs); //instantiate a lexer
CommonTokenStream tokens = new CommonTokenStream(lexer); //scan stream for tokens
gramParser parser = new gramParser(tokens); //parse the tokens

ParseTree tree = parser.start(); // parse the content and get the tree
Mylistener listener = new Mylistener();

ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(listener,tree);
}}

************ 新文件 Mylistener.java ************

public class Mylistener extends gramBaseListener {
@Override public void enterEveryRule(ParserRuleContext ctx) { //see gramBaseListener for allowed functions
System.out.println("rule entered: " + ctx.getText()); //code that executes per rule
}
}

当然你必须更换<listener>与您实现 BaseListener

还有一个小节点:在 Java 中,类名以大写字母开头是一种惯例,我建议您坚持这一点,以使代码对其他人更具可读性。

关于java - Antlr4 - 是否有使用 ParseTree Walker 的简单示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48555825/

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