在阅读定义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();
}
解析器树是:
我认为要获取代码中调用的每个函数的名称,需要找到这个子树:
我的意思是我覆盖了标签FunCall的访问者,并通过调用postfixexpression的childeren访问者来获取标识符值。 但我不知道这个解决方案是否正确或适合这个问题。我应该使用访问者吗?