【问题标题】:ANTLR parser node type + Tree Adopter?ANTLR 解析器节点类型 + 树采用者?
【发布时间】:2016-01-28 13:03:29
【问题描述】:

我开发了小型 ANTLR 语法。其中包含三个文件。

  • GLexer.g : 词法分析器
  • GParser.g : tpye AST 的解析器
  • GWalker.g:树解析器

我还有自定义树节点 GTree(扩展 CommonTree)和树采用者 GAdaptor(扩展 CommonTreeAdaptor)。请参阅下面的示例代码。

词法分析器:GLexer.g

lexer grammar GLexer;
..
some lexer rule
..

**解析器 GParser.g **

parser grammar GParser;
options {
    output          = AST;
    tokenVocab      = GLexer;
}
statement 
  : 
     rule* 
       -> ^(STATEMENTS rules* )
  ;

树语法:GWalker.g

tree grammar GWalker;
options {
  tokenVocab      = GParser;
  ASTLabelType    = GTree;
}
statement returns [String node]
  : 
     ^(STATEMENTS rules* )
  ;

树节点

public class GTree extends CommonTree {
    public String text;
    public HashMap<String, Object> params = new HashMap<String, Object>();
    public GTree(Token t) {
        super(t);
        text = (t != null ? t.getText() : "[]");
    }
}

树采用者

public class GTreeAdaptor extends CommonTreeAdaptor {
    public GTree create(Token payload) {
        GTree c = new GTree(payload);
        return c;
    }
}

ANTLR 处理程序

try {
    //lexer splits input into tokens
    ANTLRStringStream input = new ANTLRStringStream("input String");
    TokenStream tokens = new CommonTokenStream( new GLexer( input ) );

    //parser generates abstract syntax tree
    GParser parser = new GParser(tokens);
    // Initiate Custom Adopter and set in parser
    TreeAdaptor adaptor = new GTreeAdaptor();
    parser.setTreeAdaptor(adaptor);
    GParser.statement_return st = parser.statement();

    CommonTreeNodeStream gTreeNodeStream = new CommonTreeNodeStream(
            st.getTree());

    GWalker gwalker = new GWalker(gTreeNodeStream);
    String returnValue = gwalker.statement();
    // print returnValue
} catch (RecognitionException e) {
    throw new IllegalStateException("Recognition exception is never thrown, only declared.");
}

当我运行上面的句柄代码时,它给出了强制转换异常。我知道为什么当生成的 AST 中的所有节点都应为 GTree 类型时出现此转换异常,因为我的自定义树采用者 GTreeAdaptor 将仅创建 GTree 类型的树节点。

帮助我理解并解决它。

投射异常

java.lang.ClassCastException: org.antlr.runtime.tree.CommonTree cannot be cast to driver.antlr.model.GTree       
at driver.antlr.lexerparser.GWalker.statement(GWalker.java:119)   

【问题讨论】:

    标签: java antlr antlr3


    【解决方案1】:

    我可以通过在类 GTreeAdaptor 中添加方法 dupNode() 来解决

    链接: https://theantlrguy.atlassian.net/wiki/pages/viewpage.action?pageId=2687038

    改变了采用者定义:

    public class GTreeAdaptor extends CommonTreeAdaptor {
       public GTree create(Token payload) {
           GTree c = new GTree(payload);
           return c;
       }
       public Object dupNode(Object t) {
           if ( t==null ) return null;
           return create(((GTree )t).token);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多