ANTLR如何使用递归检索令牌类型

时间:2016-11-10 12:24:46

标签: recursion antlr antlr4

我正在使用ANTLR4框架,这是我语言的一个片段:

    #ifndef TRANSACTION_H
    #define TRANSACTION_H

    #include <string>
    using namespace std;

    #include "defs.h"

    class Transaction
    {
      public:
        Transaction(TransType = TTERROR, TransState = TSERROR,int = 0 ,float = 0);
        int         getTransID();
        TransType   getTType();
        TransState  getTState();
        string      getDate();
        int         getTAcctNum();
        void        setDate(string);
        float       getAmount();
      private:
        static int  nextTransID;
        int         transID;
        TransType   tType;
        TransState  tState;
        string      date;
        int         tAcctNum;
        float       tAmount;


    };

    #endif

如您所见,RN是一个终端节点,因此我可以轻松处理它。但是r是非终端节点,因此它可能非常复杂,如DLRRelationUnionOf(RN1,DLRRelationIntersectionOf(RN2,RN3))。 我的目标是处理 r 节点并递归查找RN。 问题是,一旦在代码中重新执行规则r,如:

#include "Transaction.h"
#include "defs.h"

#include <string>
using namespace std;

int Transaction::nextTransID = 2001;

Transaction::Transaction(TransType t, TransState s, int acct, float amount)
{
  transID   = nextTransID++;
  tType     = t;
  tState    = s;
  tAcctNum  = acct;
  tAmount   = amount;
}

int getTransID()        { return transID;  }
TransType getTType()    { return tType;    }
TransState getTState()  { return tState;   }
string getDate()        { return date;     }
int getTAcctNum()       { return tAcctNum; }
float getTAmount()      { return tAmount;  }


void setDate(string d)
{
  date = d;
}

如何查看recursiveRule以找出RN?

1 个答案:

答案 0 :(得分:1)

在运行期间,解析器会创建一个解析树(如果启用,则为默认值)。解析树是匹配项的树表示。此树由ParserRuleContext个实例组成,每个实例都有子项,这些子项以匹配顺序表示该规则中的匹配项。因此,对于r上下文,当匹配第二个alt时,您可以找到6个子节点(一个用于文字,一个用于LPAREN,一个用于第一个子r等)。您可以使用这些子上下文来访问子条目。如果匹配RN,则第一个子条目中有一个终端节点。