我在Terrence Parr的一篇文章中找到了该代码(如下所示),该代码显示了如何在ANTLR3 for Java中处理INCLUDE文件。我试图将其添加到与ANTLR4(带有C ++目标)一起使用的语法中,但是当我尝试生成解析器时,出现错误
error(50): : syntax error: '^' came as a complete surprise to me
error(50): : syntax error: mismatched input '->' expecting SEMI while matching a rule
error(50): : syntax error: '^' came as a complete surprise to me
error(50): : syntax error: '(' came as a complete surprise to me while matching rule preamble
,我不知道这些错误是什么意思。谁能解释一下,也许告诉我前进的方向?
(注意:我不喜欢用代码污染语法文件,我使用的是访问者模式,但如果可以的话,我会接受它!)
谢谢
include_filename :
('a'..'z' | 'A'..'Z' | '.' | '_')+
;
include_statement
@init { CommonTree includetree = null; }
:
'include' include_filename ';' {
try {
CharStream inputstream = null;
inputstream = new ANTLRFileStream($include_filename.text);
gramLexer innerlexer = new gramLexer(inputstream);
gramParser innerparser = new gramParser(new CommonTokenStream(innerlexer));
includetree = (CommonTree)(innerparser.program().getTree());
} catch (Exception fnf) {
;
}
}
-> ^('include' include_filename ^({includetree}))
;
答案 0 :(得分:0)
从ANTLR4开始,不再可以使用语法规则来操纵生成的解析树。实际上,ANTLR3生成了AST(抽象语法树),它是解析树的子集(由ANTLR4生成)。这又意味着您无法保留树重写语法(以->
开头的部分)。因此,您应该将代码更改为:
include_statement
@init { CommonTree includetree = null; }
:
'include' Include_filename ';' {
try {
CharStream inputstream = null;
inputstream = new ANTLRFileStream($include_filename.text);
gramLexer innerlexer = new gramLexer(inputstream);
gramParser innerparser = new gramParser(new CommonTokenStream(innerlexer));
includetree = (CommonTree)(innerparser.program().getTree());
} catch (Exception fnf) {
;
}
}
;