2
在ANTLR執行後,我在一個目錄中生成了所有生成的java文件,因此我使用了一些選項來生成單獨的目錄和命名空間,以存儲和編譯以存儲所有生成的文件。在文件包中運行ANTLR grun(TestRig)。
這是語法文件:
語法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
和javac
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
?