Запуск 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

И мой 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, настроенную в моем пути к классам.

Другие вопросы по тегам