[英]ANTLR parser node type + Tree Adopter?
我已經開發了小的ANTLR語法。 其中包含三個文件。
我也有自定義樹節點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.