以编程方式使用 ANTLR4 创建 Java 8 AST



我试图弄清楚如何使用ANTLR,但我很难消化我发现的东西。到目前为止,以下是我的资源:

  • 如何使用ANTLR4创建AST?
  • 如何使用 Gradle 2.10 将 ANTLR 词法分析器语法导入到另一个语法中?
  • https://github.com/antlr/grammars-v4/tree/master/java8
  • https://dzone.com/articles/parsing-any-language-in-java-in-5-minutes-using-an
  • https://raw.githubusercontent.com/antlr/antlr4/master/doc/getting-started.md

一点背景

我正在尝试从JavaParse迁移到ANTLR,因为我想处理除Java之外的语言的AST。我对ANTLR和预定义语法(上面链接)的理解是这是可行的。

设置

  • 智能J 15 CE
  • 格拉德尔
  • 爪哇 1.8
  • 此 ANTLR 资源

我在 IntelliJ 中创建了一个非常简单且标准的 gradle 项目,但我仍然遇到问题:

问题所在

我错过了Java8LexerJava8Parser课程。我不知道在哪里可以找到这些。

build.gradle

group 'com.antlr-demo'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
    mavenCentral()
}
dependencies {
    compile 'org.antlr:antlr4-master:4.5'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

Test.java

即使在这个非常琐碎的示例中,我需要的两个类中也没有一个不是导入的。

public static void parseFile(String f) { // found in Test.java:257
    try {
        if ( !quiet ) System.err.println(f);
        // Create a scanner that reads from the input stream passed to us
        Lexer lexer = new Java8Lexer(new ANTLRFileStream(f)); // missing
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        // Create a parser that reads from the scanner
        Java8Parser parser = new Java8Parser(tokens); // missing
        if ( diag ) parser.addErrorListener(new DiagnosticErrorListener());
        if ( bail ) parser.setErrorHandler(new BailErrorStrategy());
        if ( SLL ) parser.getInterpreter().setPredictionMode(PredictionMode.SLL);
        // start parsing at the compilationUnit rule
        ParserRuleContext t = parser.compilationUnit();
        if ( notree ) parser.setBuildParseTree(false);
        if ( gui ) t.inspect(parser);
        if ( printTree ) System.out.println(t.toStringTree(parser));
    }
    catch (Exception e) {
        System.err.println("parser exception: "+e);
        e.printStackTrace();   // so we can get stack trace
    }
}

pom 文件中没有描述...

我在 github 上创建了一个开源项目,该项目会自动在内存中生成解析器/词法分析器和创建 AST。你可以在github https://github.com/julianthome/inmemantlr 上找到它。

从 JAVA 程序获取 AST 的代码非常简单:

// the ANTLR grammar
File f = new File("src/test/ressources/Java.g4");
// plug the ANTLR grammar in 
GenericParser gp = new GenericParser(f, "Java");
// load the file that we'd like to parse into a String variable
String s = FileUtils.loadFileContent("src/test/ressources/HelloWorld.java");
// this listener will create an AST from the java file    
gp.setListener(new DefaultTreeListener());
// compile Parser/Lexer
gp.compile();
ParserRuleContext ctx = ctx = gp.parse(s);
// get access to AST
Ast ast = dlist.getAst();
// print AST in dot format
System.out.println(ast.toDot());

如果您有兴趣,可以仔细查看存储库中的测试用例。

你错过了一个步骤。您获得了java8语法,但尚未从中创建解析器。这通常涉及在语法文件(常见问题解答等)上运行 antlr4 jar,这非常简单(示例取自入门页面):

$ antlr4 Hello.g4
$ javac Hello*.java

有一个 gradle 插件,其名称antlr用于将g4文件转换为java文件。您可以在https://docs.gradle.org/current/userguide/antlr_plugin.html获取antlr插件的详细信息

此外,您可以使用gradle + antlr查看真实项目:https://github.com/todylu/xcodeprojectParser

  • ANTLR语法项目中的依赖关系:antlr "org.antlr:antlr4:4.5.3"
  • 演示项目中的依赖关系:compile "org.antlr:antlr4-runtime:4.5.3"

顺便说一下,最好将ANTLR v4语法插件安装到Intellij Idea中,以帮助您编辑g4文件。

相关内容

  • 没有找到相关文章

最新更新