简体   繁体   English

ANTLR解析器节点类型+树采用者?

[英]ANTLR parser node type + Tree Adopter?

I have developed small ANTLR grammar. 我已经开发了小的ANTLR语法。 which contains three files. 其中包含三个文件。

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

Also I have custom tree node GTree (extends CommonTree) and tree adopterGAdaptor ( extends CommonTreeAdaptor ). 我也有自定义树节点GTree(扩展CommonTree)和树采纳器GAdaptor(扩展CommonTreeAdaptor)。 See sample code below. 请参见下面的示例代码。

lexer : GLexer.g 词法分析器:GLexer.g

lexer grammar GLexer;
..
some lexer rule
..

**Parser GParser.g ** **解析器GParser.g **

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

Tree Grammar : GWalker.g 树语法:GWalker.g

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

Tree node 树节点

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() : "[]");
    }
}

Tree Adopter 树采用者

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

ANTLR handler 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.");
}

When I run handle code above , it is giving casting exception. 当我在上面运行句柄代码时,它给出了强制转换异常。 I know why this casting exception when all nodes in generated AST should be of type GTree as my custom tree adopter GTreeAdaptor will create only tree node of type GTree. 我知道为什么当生成的AST中的所有节点都应为GTree类型时出现此强制转换异常,因为我的自定义树采用者GTreeAdaptor将仅创建GTree类型的树节点。

Help me understandinmg this and getting it resoved. 帮助我理解这个问题并获得解决。

Casting exception 强制转换例外

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)   

I am able to resolved by adding method dupNode() in class GTreeAdaptor 我可以通过在类GTreeAdaptor中添加方法dupNode()来解决

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

Changed Adopter Definition : 更改的采用者定义:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM