Запуск ANTLR grun (TestRig) по грамматике в пакете.
У меня есть все сгенерированные файлы Java в одном каталоге после выполнения ANTLR, поэтому я использовал некоторые параметры для создания отдельного каталога и пространства имен для хранения и компиляции для хранения всех сгенерированных файлов.
Это файл грамматики:
грамматика 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
а также sourcepath
вариант в javac
,
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
, но они не работали.
Как бегать grun
на файлы ANTLR, расположенные в других каталогах?
3 ответа
НАСКОЛЬКО МНЕ ИЗВЕСТНО, grun
работает только тогда, когда все файлы находятся в одной папке. Он предназначен для быстрой отладки.
В Linux я меняю каталог (cd
) перед запуском grun
.
Каталог моего проекта имеет следующую структуру:
Корневая папка/
- src / (где
.java
файлы хранятся) - bin/ (где
.class
файлы хранятся) input / (где программы ввода в
.txt
хранятся)Makefile
- src / (где
И мой Makefile
имеет следующее правило:
start:
@cd bin && cat ../$(INPUT) | grun MyGrammar program -gui
Поэтому когда я звоню make start INPUT="input/test.txt"
это начинается grun
, показывая дерево синтаксического анализа для моей входной программы.
Если вы сгенерировали свой парсер со следующими параметрами:
-package expr -lib . -o gen/expr Expr.g4
..ваши классы парсера теперь находятся в пакете Javaexpr
. Теперь при использованииgrun
просто укажите параметр грамматики, чтобы инструмент мог найти класс анализатора по имени его пакета:
grun expr.Expr prog -tree
Я подтвердил, что это работает с ANTLR 4.12.0, единственной разницей в моей настройке была упаковка всех сгенерированных классов парсера/лексера в библиотеку maven, настроенную в моем пути к классам.