簡體   English   中英

ANTLR解析器節點類型+樹采用者?

[英]ANTLR parser node type + Tree Adopter?

我已經開發了小的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)   

我可以通過在類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);
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM