Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以编程方式使用ANTLR4创建Java8AST_Java_Gradle_Antlr_Antlr4 - Fatal编程技术网

以编程方式使用ANTLR4创建Java8AST

以编程方式使用ANTLR4创建Java8AST,java,gradle,antlr,antlr4,Java,Gradle,Antlr,Antlr4,我正试图弄清楚如何准确地使用ANTLR,但我很难消化我发现的东西。到目前为止,我的资源如下: 一点背景知识 我正在尝试从ANTLR迁移到ANTLR,因为我想处理Java以外的语言的AST。我对ANTLR和预定义语法(见上文)的理解是,这是可行的 设置 智能15 CE 格拉德尔 Java 1.8 我在IntelliJ中创建了一个非常简单和标准的gradle项目,但我仍然遇到一些问题: 问题 我缺少Java8Lexer和Java8Parser类。我不知道在哪里可以找到这些 bui

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

一点背景知识 我正在尝试从ANTLR迁移到ANTLR,因为我想处理Java以外的语言的AST。我对ANTLR和预定义语法(见上文)的理解是,这是可行的

设置

  • 智能15 CE
  • 格拉德尔
  • Java 1.8
我在IntelliJ中创建了一个非常简单和标准的gradle项目,但我仍然遇到一些问题:

问题 我缺少
Java8Lexer
Java8Parser
类。我不知道在哪里可以找到这些

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'
}

即使在这个非常简单的例子中,我需要的两个类中没有一个是不被导入的

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
    }
}

没有在…

中描述,您缺少一个步骤。您获得了java8语法,但还没有从中创建解析器。这通常涉及在语法文件()上运行Antlr4JAR,这非常简单(示例取自页面):


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

此外,您可以使用
gradle+antlr
https://github.com/todylu/xcodeprojectParser

  • antlr语法项目中的依赖项:
    antlr“org.antlr:antlr4:4.5.3”
  • 演示项目中的依赖项:
    compile“org.antlr:antlr4运行时:4.5.3”

顺便说一句,最好安装到Intellij Idea中,以帮助您编辑
g4
文件。

我已经在github上创建了一个开源项目,可以在内存中自动生成解析器/词法分析器和AST创建。你可以在github上找到它

从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());

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

好的,这当然回答了我的问题
// 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());