Запуск `TestRig` на отдельном грамматике и лексере приводит к` java.lang.ClassCastException` или `Невозможно загрузить Test как лексер или анализатор` - PullRequest
0 голосов
/ 21 мая 2019

У меня есть отдельная грамматика синтаксического анализатора и лексера, и я хочу запустить org.antlr.v4.gui.TestRig для отладки / проверки моей грамматики.

Моя грамматика лексера начинается с:

lexer grammar TestLexer;

IDS: [a-zA-Z];

WS: [ \t];
NL: [\r?\n];

...

и грамматики моего синтаксического анализатораначните с:

parser grammar TestParser;
options { tokenVocab=TestLexer; }

testRule: WS* IDS+ NL;

...

Моя переменная classpath env указывает на завершение antlr.jar и текущий каталог.

  • antlr является псевдонимом java org.antlr.v4.Tool
  • grun является псевдонимом java org.antlr.v4.gui.TestRig.

Когда я запускаю antlr TestParser.g4 && javac *.java, код синтаксического анализатора генерируется и компилируется.

Когда я запускаю grun TestParser testRule -gui, я получаюошибка:

Exception in thread "main" java.lang.ClassCastException: class TestParser
        at java.lang.Class.asSubclass(Class.java:3404)
        at org.antlr.v4.gui.TestRig.process(TestRig.java:135)
        at org.antlr.v4.gui.TestRig.main(TestRig.java:119)

И когда я запускаю grun Test testRule -gui, я получаю ошибку:

Can't load Test as lexer or parser

У меня нет проблем при использовании комбинированной грамматики.

Чего не хватает для запуска TestRig?

1 Ответ

0 голосов
/ 21 мая 2019

При использовании разделенного лексера и анализатора вы должны сгенерировать код для лексера и анализатора. Это не делается автоматически путем генерации кода только для парсера.

Выполнение:

antlr TestLexer.g4
antlr TestParser.g4
javac *.java

После генерации кода для обоих (лексера и парсера) вы должны выполнить:

grun Test -gui testInput.txt

, где testInput.txt содержит некоторые тестовые данные для анализа.

Примечание: При использовании разделенного лексера и синтаксического анализатора ожидается, что лексер заканчивается на Lexer, а синтаксический анализатор заканчивается на Parser. Общая часть файлов - это название грамматики. I.e TestLexer и TestParser -> Test - это название грамматики.

...