我有这个简单的语法
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();
等等...
答案 0 :(得分:1)
您所有的词法分析器都从同一流中读取数据,并且您所有的语法都可能消耗整个输入(至少Monto会这样做,而且我希望Fecha也是如此)。您也似乎没有在不同解析器的调用之间重置输入流。因此,在调用Fecha解析器之后,输入流将为空,因为解析器消耗了所有输入。因此,当您调用Monto解析器时,它会从空流中读取并产生错误,因为语法与空输入不匹配。
相反,您应该为每个词法分析器创建一个不同的CharStream
实例。