为什么 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
实例。
我有这个简单的语法
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
实例。