为什么 EOF 与文法不匹配?

Why EOF does not match with the grammar?

我有这个简单的语法

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 工具)它工作时

已编辑

我正在使用 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();

等等...

你所有的词法分析器都从同一个流中读取,并且可能你所有的语法都使用了整个输入(至少 Monto 是这样,我希望 Fecha 也是如此)。您似乎也没有在不同解析器的调用之间重置输入流。所以在调用 Fecha 解析器之后,输入流将为空,因为解析器消耗了所有输入。因此,当您调用 Monto 解析器时,它会从空流中读取并产生错误,因为语法与空输入不匹配。

相反,您应该为每个词法分析器创建一个不同的 CharStream 实例。