java - ANTLR parser node type + Tree Adopter? -


i have developed small antlr grammar. contains 3 files.

  • glexer.g : lexer
  • gparser.g : parser of tpye ast
  • gwalker.g : tree parser

also have custom tree node gtree (extends commontree) , tree adoptergadaptor ( extends commontreeadaptor ). see sample code below.

lexer : glexer.g

lexer grammar glexer; .. lexer rule .. 

**parser gparser.g **

parser grammar gparser; options {     output          = ast;     tokenvocab      = glexer; } statement    :       rule*         -> ^(statements rules* )   ; 

tree grammar : 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

try {     //lexer splits input 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 , 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 never thrown, declared."); } 

when run handle code above , giving casting exception. know why casting exception when nodes in generated ast should of type gtree custom tree adopter gtreeadaptor create tree node of type gtree.

help me understandinmg , getting resoved.

casting exception

java.lang.classcastexception: org.antlr.runtime.tree.commontree cannot cast driver.antlr.model.gtree        @ driver.antlr.lexerparser.gwalker.statement(gwalker.java:119)    

i able resolved adding method dupnode() in class gtreeadaptor

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

Comments

Popular posts from this blog

Hatching array of circles in AutoCAD using c# -

ios - UITEXTFIELD InputView Uipicker not working in swift -

Python Pig Latin Translator -