使用Parserwalker Listener Vs访客生成调用图?

时间:2016-02-01 20:58:39

标签: c++ parsing grammar antlr4

在阅读定义antlr v4书后,我明白有两种树木行走机制。

我想为Cpp语法生成SIMPLE调用图。

this是Cpp14语法。

这是规则的一部分:

postfixexpression
:
    primaryexpression           #PrimaryEX
    | postfixexpression '[' expression ']'      #label9
    | postfixexpression '[' bracedinitlist ']'      #label10
    | postfixexpression '(' expressionlist? ')'     #FuncCall
    | simpletypespecifier '(' expressionlist? ')'   #label11
    | typenamespecifier '(' expressionlist? ')'     #label13
    | simpletypespecifier bracedinitlist        #label14        
    | typenamespecifier bracedinitlist      #label15
    | postfixexpression '.' Template? idexpression  #label16        
    | postfixexpression '->' Template? idexpression #label17
    | postfixexpression '.' pseudodestructorname        #label18
    | postfixexpression '->' pseudodestructorname   #label19    
    | postfixexpression '++'            #label20
    | postfixexpression '--'            #label21
    | Dynamic_cast '<' typeid '>' '(' expression ')'    #label22
    | Static_cast '<' typeid '>' '(' expression ')' #label23
    | Reinterpret_cast '<' typeid '>' '(' expression ')'    #label24
    | Const_cast '<' typeid '>' '(' expression ')'  #label25
    | Typeid '(' expression ')'             #label26
    | Typeid '(' typeid ')'         #label27

我的解决方案是使用访问者并为查找函数名称所需的所有规则创建标签。

例如,当我输入输入文件t.mainCpp

static void nastaran(int a, int b)
{
}
int main()
{
    a=func();
}

解析器树是:

enter image description here

我认为要获取代码中调用的每个函数的名称,需要找到这个子树:

enter image description here

我的意思是我覆盖了标签FunCall的访问者,并通过调用postfixexpression的childeren访问者来获取标识符值。 但我不知道这个解决方案是否正确或适合这个问题。我应该使用访问者吗?

0 个答案:

没有答案