在包中的语法上运行ANTLR grun(TestRig)。

在包中的语法上运行ANTLR grun(TestRig)。,antlr,antlr4,grun,Antlr,Antlr4,Grun,在ANTLR执行之后,我将所有生成的java文件都放在一个目录中,因此我使用了一些选项来生成一个单独的目录和名称空间,以存储和编译所有生成的文件 这是语法文件: 语法表达 prog: (expr NEWLINE)* ; expr: expr ('*'|'/') expr | expr ('+'|'-') expr | INT | '(' expr ')' ; NEWLINE : [\r\n]+ ; INT : [0-9]+ ; 我可以使用o在不同的目录中

在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
编译代码需要
javac
中的
d
sourcepath
选项

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-tree
grun-out/Expr/Expr-prog-tree
,但都不起作用


如何对位于其他目录中的ANTLR文件运行
grun

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

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

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

  • 根文件夹/

    • src/(其中存储
      .java
      文件)
    • bin/(存储
      .class
      文件的位置)
    • 输入/(其中存储了
      .txt
      中的输入程序)

    • 生成文件

我的
Makefile
有以下规则:

start:
    @cd bin && cat ../$(INPUT) | grun MyGrammar program -gui
因此,当我调用
makestart-INPUT=“INPUT/test.txt”
时,它会启动
grun
,显示输入程序的解析树