运行 ANTLR grun (TestRig) 包中的语法。
Running ANTLR grun (TestRig) on grammar in a package.
我在 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
这是目录结构。
检查一切正常后,我尝试使用 g运行 (TestRig)。我尝试了 grun Expr prog -tree
和 grun out/expr/Expr prog -tree
,但它们没有用。
如何运行 grun
位于其他目录的ANTLR 文件?
AFAIK,grun
仅当所有文件都在同一文件夹中时才有效。它是一种快速调试工具。
我在 Linux 上所做的是在 运行 grun
.[=19 之前 更改目录 (cd
) =]
我的项目目录结构如下:
根文件夹/
- src/(存储
.java
个文件)
- bin/(存储
.class
个文件)
input/(存放.txt
中的输入程序)
生成文件
而我的 Makefile
有以下规则:
start:
@cd bin && cat ../$(INPUT) | grun MyGrammar program -gui
因此,当我调用 make start INPUT="input/test.txt"
时,它开始 grun
,显示我的输入程序的解析树。
我在 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 Expr prog -tree
和 grun out/expr/Expr prog -tree
,但它们没有用。
如何运行 grun
位于其他目录的ANTLR 文件?
AFAIK,grun
仅当所有文件都在同一文件夹中时才有效。它是一种快速调试工具。
我在 Linux 上所做的是在 运行 grun
.[=19 之前 更改目录 (cd
) =]
我的项目目录结构如下:
根文件夹/
- src/(存储
.java
个文件) - bin/(存储
.class
个文件) input/(存放
.txt
中的输入程序)生成文件
- src/(存储
而我的 Makefile
有以下规则:
start:
@cd bin && cat ../$(INPUT) | grun MyGrammar program -gui
因此,当我调用 make start INPUT="input/test.txt"
时,它开始 grun
,显示我的输入程序的解析树。