Java 如何在antlr中从解析器获取所有令牌
我想从解析器中获取所有令牌,然后过滤输出,获取AST(myAST)列表: 我的语言有一个树形适配器:Java 如何在antlr中从解析器获取所有令牌,java,antlr,antlr3,antlrworks,Java,Antlr,Antlr3,Antlrworks,我想从解析器中获取所有令牌,然后过滤输出,获取AST(myAST)列表: 我的语言有一个树形适配器: public class LanguajeTreeAdaptor extends CommonTreeAdaptor{ public LanguajeTreeAdaptor(){ super(); } @Override public Object create(Token payload) { if(payload == nu
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(我的想法)
我不能这样做,因为currentToken是CommonToken,我怎样才能只获取那些Id?。我正在使用antlr 3和Zinov不,我不能强制转换到IdAST,因为IdAST是一个CommonTree而不是CommonToken:(@Bart我有一个可以编辑ID的应用程序,例如p=a(a=5)其中P和A是Id,因此如果在我的编辑器中我转到A并将值5更改为P,我会得到Id的递归依赖关系,我需要检查当您更改我的Id时是否会出现此问题,这就是每行获取所有Id依赖关系的原因。P+1+F(A+3)我很抱歉,不,我不知道:我问了两个问题,你确实回答了,但要么我无法说明我需要什么信息,要么你无法正确地沟通这个问题(或者两者兼而有之)。不管怎样,我根本不知道你的问题到底是什么(或者你试图解决什么)。我只是想让你知道我没有调查它,以防你在等待我的回答。祝你好运。不,我不能投给IdAST,因为IdAST是一个CommonTree而不是CommonToken:(@Bart我有一个可以编辑我的ID的应用程序,例如P=a(a=5)其中P和A是Id,因此如果在我的编辑器中我转到A并将值5更改为P,我会得到Id的递归依赖关系,我需要检查当您更改我的Id时是否会出现此问题,这就是每行获取所有Id依赖关系的原因。P+1+F(A+3)我很抱歉,不,我不知道:我问了两个问题,你确实回答了,但要么我无法说明我需要什么信息,要么你无法正确地沟通这个问题(或者两者兼而有之)。不管怎样,我根本不知道你的问题到底是什么(或者你试图解决什么).只是想让你知道我没有调查此事,以防你在等待我的答复。祝你好运。
TokenStream input = parser.getTokenStream();
TokenSource tSource = input.getTokenSource();
Token currentToken = tSource.nextToken();
while(currentToken != null){
System.out.println(currentToken.getText());
currentToken = tSource.nextToken();
}
while(currentToken != null){
if(currentToken instanceof IdAST){
//call to another method to process the Id
}
System.out.println(currentToken.getText());
currentToken = tSource.nextToken();
}