为什么EOF与语法不匹配?

时间:2018-11-26 05:09:53

标签: antlr4

我有这个简单的语法

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();

等等...

1 个答案:

答案 0 :(得分:1)

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

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