当前位置: 首页 > 知识库问答 >
问题:

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

危烨煜
2023-03-14

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

  • 如何使用ANTLR4创建AST?
  • 如何使用Gradle 2.10将一个ANTLR lexer语法导入到另一个语法中?
  • 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/gett-started.md

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

设置

  • Intellij 15 Ce
  • 分级
  • Java 1.8
  • 此ANTLR资源
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
    }
}

pom文件中没有描述...

共有1个答案

王才
2023-03-14

你少了一步。您已经获得了java8语法,但还没有从它创建一个解析器。这通常涉及在语法文件(常见问题和更多)上运行antlr4 jar,这非常简单(示例取自入门页面):

$ antlr4 Hello.g4
$ javac Hello*.java
 类似资料:
  • 问题内容: 我一直在尝试以编程方式重做我的应用程序上的工作。(不使用情节提要) 除了手动制作导航控制器外,我几乎完成了。 我一直在做一些研究,但找不到任何手动实现此方法的文档。(我开始将应用程序制作为单视图应用程序) 目前,我只有1个ViewController。当然是appDelegate 导航控制器将在应用程序的所有页面中使用。 如果有人可以帮助我,或发送指向一些适当文档的链接以编程方式进行此

  • 我想创建一个具有此形状的xml,在其中我将内部元素插入循环中,并在元素上设置属性。 这是我目前掌握的代码: 我得到了一个ModifyException,因为我给insertAfterHead打了两次电话。如何生成所需的xml形状?我还不完全理解如何将偏移量放到正确的位置。

  • 问题内容: 我知道我可以使用Java中的 api 以编程方式创建文件,如下所示: 但是是否有任何 API 可以构建树?(例如Dom之类的api) 我需要这样的东西: 和: 提前致谢。 问题答案: 由于XSLT也是XML,因此您可以简单地使用相同的策略: 等等… 但这不是很优雅。您应该改用库或框架,但应该很容易找到一个谷歌浏览器。

  • 我有一个WS,它返回非常基本的产品数据:代码、价格和图像。我需要用这些基本数据以编程方式创建Hybris产品,然后进行同步,以便在店面上看到这些产品。 创建具有这些基本信息的产品的步骤是什么?有OOTB服务吗?

  • 我正尝试使用以下命令以编程方式创建:

  • 我有一个这样的层次结构: 线性布局(水平) 图像视图 线性布局(垂直) 文本视图 文本视图 文本视图 文本视图 我希望能够通过迭代添加上面的层次结构,只要可以从数据库中获得数据(使用Parse) 我尝试过将ImageView和LinearLayout放在父LinearLayout下,但似乎不起作用。这是我在Mainactive中的代码。Java: 我不知道哪里出错了,因为我的代码没有提示任何错误。