Java 如何在antlr中从解析器获取所有令牌

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

我想从解析器中获取所有令牌,然后过滤输出,获取AST(myAST)列表:

我的语言有一个树形适配器:

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();
    }