如何使用ANTLR4解析嵌套的源文件-再试一次

时间:2019-11-28 23:39:43

标签: antlr4

我在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}))
;

1 个答案:

答案 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) {
      ;
    }
  }
;