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

这是语法文件:

语法Expr;

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


编译代码需要d中的sourcepathjavac选项。

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


这是目录结构。

antlr - 在包中的语法上运行ANTLR grun(TestRig)。-LMLPHP
检查一切正常后,我尝试使用grun(TestRig)。我尝试了grun Expr prog -treegrun out/expr/Expr prog -tree,但是它们没有用。

如何在其他目录中的ANTLR文件上运行grun

最佳答案

AFAIK,grun仅在所有文件都在同一文件夹中时起作用。它是一种快速调试工具。

09-19 00:44