我想从我的解析器中获取所有标记,然后我想过滤输出,得到一个 AST(myAST) 列表:
ANTLRStringStream stream = new ANTLRStringStream("P + 1 + F(A + 3)");
MyLexer lexer = new MyLexer (stream);
MyParser parser = new MyParser(new CommonTokenStream(lexer));
LanguajeTreeAdaptor treeAdaptor = new LanguajeTreeAdaptor();
parser.setTreeAdaptor(treeAdaptor);
我的语言有一个 TreeAdaptor:
public class LanguajeTreeAdaptor extends CommonTreeAdaptor{
public LanguajeTreeAdaptor(){
super();
}
@Override
public Object create(Token payload) {
if(payload == null)
return super.create(payload);
switch(payload.getType()){
case EtesGrammarParser.ID:
return new IdAST(payload);
..........
}
return super.create(payload);
}
以下是我的一些语法规则:
program
: expression EOF!
;
expression
: exprFinal
;
exprFinal: exprFuncCall | ID | INT | DOUBLE | STRING | exprParenthesis;
exprFuncCall : ID LPARENT exprList RPARENT -> ^(FUNC_CALL ID exprList);
所以 P、F 和 A 在我的规则中是 Id,我正在尝试使用以下代码:
TokenStream input = parser.getTokenStream();
TokenSource tSource = input.getTokenSource();
Token currentToken = tSource.nextToken();
while(currentToken != null){
System.out.println(currentToken.getText());
currentToken = tSource.nextToken();
}
但我只想处理 IdAST(我的想法),
while(currentToken != null){
if(currentToken instanceof IdAST){
//call to another method to process the Id
}
System.out.println(currentToken.getText());
currentToken = tSource.nextToken();
}
我不能这样做,因为 currentToken 是 CommonToken,我怎样才能只获得那些 Id?我正在使用 antlr 3 问候 Zinov