4

在 ANTLR 执行后,我将所有生成的 java 文件放在一个目录中,因此我使用了一些选项来生成一个单独的目录和命名空间来存储和编译以存储所有生成的文件。

这是语法文件:

语法表达式;

prog: (expr NEWLINE)* ;
expr: expr ('*'|'/') expr
    | expr ('+'|'-') expr
    | INT
    | '(' expr ')'
    ;
NEWLINE : [\r\n]+ ;
INT     : [0-9]+ ;

我可以使用 将生成的文件放在不同的目录中,并使用选项o添加包信息。package

java -jar /usr/local/lib/antlr-4.5.3-complete.jar -listener -visitor -package expr -lib . -o gen/expr Expr.g4

编译代码需要dsourcepath选项在javac.

javac -cp .:/usr/local/lib/antlr-4.5.3-complete.jar -d out -sourcepath gen gen/expr/Expr*.java

我可以通过制作可执行文件来检查代码是否有效。

import expr.*;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

class ExprRunner {
    public static void main(String[] args) throws Exception {
        // create a CharStream that reads from standard input

        String filePath = "input.txt";
        File fileInput = new File(filePath);
        FileInputStream fileInputStream = new FileInputStream(fileInput);


        ANTLRInputStream input = new ANTLRInputStream(fileInputStream); 
        ExprLexer lexer = new ExprLexer(input); 
        CommonTokenStream tokens = new CommonTokenStream(lexer); 
        ExprParser parser = new ExprParser(tokens);
        ParseTree tree = parser.prog(); // begin parsing at init rule
        System.out.println(tree.toStringTree(parser)); // print LISP-style tree        
    }
}

我可以构建并运行它。

javac -cp .:/usr/local/lib/antlr-4.5.3-complete.jar:out -d out -sourcepath . ExprRunner.java
java -cp .:/usr/local/lib/antlr-4.5.3-complete.jar:out ExprRunner

这是目录结构。

在此处输入图像描述 检查一切正常后,我尝试使用 grun (TestRig)。我试过grun Expr prog -treeand grun out/expr/Expr prog -tree,但它们没有用。

如何grun在位于其他目录的 ANTLR 文件上运行?

4

2 回答 2

4

AFAIK,grun仅当所有文件都在同一个文件夹中时才有效。它是一种快速调试工具。

于 2016-04-17T20:31:57.973 回答
0

我在 Linux 上所做的是在运行之前更改目录( cd) grun

我的项目目录具有以下结构:

  • 根文件夹/

    • src/(.java存储文件的地方)
    • bin/(.class存储文件的地方)
    • input/(.txt存储输入程序的地方)

    • 生成文件

Makefile有以下规则:

start:
    @cd bin && cat ../$(INPUT) | grun MyGrammar program -gui

所以当我调用make start INPUT="input/test.txt"它时grun,它会显示我的输入程序的解析树。

于 2019-10-05T22:48:10.847 回答