ANTLRを実行した後に、生成されたすべてのJavaファイルが1つのディレクトリに格納されているため、生成されたすべてのファイルを格納するために別のディレクトリと名前空間を生成し、パッケージ内の文法で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
は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
を実行するにはどうすればよいですか?