Разбор ANTLR работает при использовании TestRig, но не выполняется при разборе с Java - PullRequest
1 голос
/ 16 февраля 2020

У меня есть грамматика для оценки файлов CSV, и она работает правильно в соответствии с TestRig. Создается следующее дерево разбора:

enter image description here

Если, однако, я использую следующий код java в своем приложении, синтаксический анализ завершается с ошибкой:

line 2:33 no viable alternative at input '=A2+B2+C1'

Обновление: сейчас я использую поток Char непосредственно из файла, но ошибка все еще остается.

 private static void parseFile(String fileName) throws IOException {
        CSVLexer lexer = new CSVLexer(CharStreams.fromFileName("test.csv", StandardCharsets.UTF_8));
        CSVParser parser = new CSVParser(new CommonTokenStream(lexer));
        ParseTree tree = parser.start(); //start is the start rule
 }

Насколько я понимаю, TestRig делает то же самое, поэтому как это может быть успешным, и этот сбой?

Вот test.csv, который я использую для проверки:

12;=35.5+6*2;=A1+B1
"szoveg";"masik szoveg";=A2+B2+C1

Что касается того, как я вызываю TestRig, я использую командную строку:

java -cp path\to\antln\jar org.antlr.v4.gui.TestRig CSV start -gui

ОБНОВЛЕНИЕ: при использовании

java -cp path\to\antln\jar org.antlr.v4.gui.TestRig CSV start -gui test.csv

я получаю ту же ошибку.

1 Ответ

0 голосов
/ 16 февраля 2020

Таким образом, проблема заключалась в том, что моя грамматика требует разрыв строки в конце каждой строки, а test.csv НЕ ИМЕЕТ разрыв строки в последней строке!

При нажатии введите последнюю строку и сохраняя, теперь он работает.

Решение: Чтобы переписать правило строки, чтобы сделать последний разрыв строки необязательным или , используйте java, чтобы добавить разрыв строки в конце строка, прочитанная из файла (я выбираю это)

if(!fileContent.endsWith("\n")) {
    fileContent += "\n";
}
...