Почему EOF не соответствует грамматике? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть эта простая грамматика

grammar Monto;
import util;

documento: .*? monto .+;
monto: SYMBOL INT+;

SYMBOL: '$';

И когда я запускаю это, я получаю эту ошибку:

line 1:0 mismatched input '<EOF>'

Я добавил EOF к своему основному правилу, но он не работает, япробовал с этим

documento: .*? monto .+ EOF;

или с этим

documento: .*? monto .+? EOF;

Любопытно, когда я запускаю его из cmd (инструмент ANTLR4), он работает

EDITED

Я использую ANLTR 4.7.1 и вот как я создаю лексеры и парсеры

public GrammarModule(String text) {
    CharStream input = CharStreams.fromString(text);
    demandantesLexer = new DemandantesLexer(input);
    demandantesParser = new DemandantesParser(new CommonTokenStream(demandantesLexer));
    demandadosLexer = new DemandadosLexer(input);
    demandadosParser = new DemandadosParser(new CommonTokenStream(demandadosLexer));
    direccionLexer = new DireccionLexer(input);
    direccionParser = new DireccionParser(new CommonTokenStream(direccionLexer));
    fechaLexer = new FechaLexer(input);
    fechaParser = new FechaParser(new CommonTokenStream(fechaLexer));
    montoLexer = new MontoLexer(input);
    montoParser = new MontoParser(new CommonTokenStream(montoLexer));
    numCuentaLexer = new NumCuentaLexer(input);
    numCuentaParser = new NumCuentaParser(new CommonTokenStream(numCuentaLexer));
    oficioLexer = new OficioLexer(input);
    oficioParser = new OficioParser(new CommonTokenStream(oficioLexer));
    referenciaLexer = new ReferenciaLexer(input);
    referenciaParser = new ReferenciaParser(new CommonTokenStream(referenciaLexer));
}

Вызов парсеров

fechaParser.documento().fecha().getText();
montoParser.documento().monto().getText();

и так далее ....

1 Ответ

0 голосов
/ 26 ноября 2018

Все ваши лексеры читают из одного и того же потока, и, вероятно, все ваши грамматики потребляют весь ввод (по крайней мере, Монто делает, и я ожидаю, что и Феча тоже).Вы также не можете сбросить поток ввода между вызовами разных парсеров.Таким образом, после того, как вы вызовете парсер Fecha, поток ввода будет пустым, потому что парсер использовал весь ввод.Поэтому, когда вы вызываете анализатор Monto, он читает из пустого потока и выдает ошибку, поскольку грамматика не соответствует пустому вводу.

Вместо этого вам просто нужно создать отдельный экземпляр CharStream для каждого лексера.

...