как получить все токены из парсера в antlr - PullRequest
1 голос
/ 03 февраля 2012

Я хочу получить все токены из моего анализатора, а затем я хочу отфильтровать вывод, получив список 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 С уважением Зинов

...