Antlr4-有使用ParseTree Walker的简单示例吗?

joh*_*jik 8 java antlr4

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??
}}
Run Code Online (Sandbox Code Playgroud)

我正在使用Java,但我认为其他语言也是如此。

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

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

Rav*_*ven 9

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

因此,如果您的“ 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);
}}
Run Code Online (Sandbox Code Playgroud)

************新文件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
        }
    }
Run Code Online (Sandbox Code Playgroud)

当然,您必须替换<listener>BaseListener

只是一个小的sidenode:在Java中,习惯上以大写字母开头的类名,我建议您坚持这样做,以使代码对其他人更易读。

  • 嗯,好的,start()是我在gram.g4中的规则的实际名称。对不起,这一切还是新的。几个问题。因此,侦听器是由gramBaseListener创建的gbl = new gramBaseListener(); 现在我如何解析程序? (2认同)