【发布时间】: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)
【问题讨论】: