Я пытаюсь ANTLR4 в Python для анализа кода C ++, я хочу найти, где переменная / объект и т. Д. c .. инициализируется и где эта переменная / объект назначается другой переменной / объекту.
Я начал с реализации visitAssignmentexpression
и visitInitdeclarator
в приведенном ниже коде.
int i;
int b, c;
int d;
i = 10;
b = i;
c = b;
d += c;
std::string str = "TEST";
ping(argv[1]);
Person *p = new Person();
Person p2 = new Person();
p->get_numbers();
p2.get_numbers();
Для visitInitdeclarator
Я получил следующий вывод, который меня очень смущает, например, почему я получаю str="TEST"
но не b = i
или i = 10
.
i
b
c
d
str="TEST"
p2=newPerson()
и для visitAssignmentexpression
я получил следующий вывод, я ожидал LValue или RValue et c ... но там я получил даже также некоторые вызовы функций!
i=10
10
b=i
i
c=b
b
d+=c
c
"TEST"
ping(argv[1])
argv[1]
1
Person*p=newPerson()
newPerson()
newPerson()
p->get_numbers()
p2.get_numbers()
Мне не должно быть трудно, что я новичок в ANTLR, и некоторые из этих выходных данных немного сбивают с толку. Вот как выглядит мой код:
from antlr4 import *
from antlr4.tree.Tree import TerminalNodeImpl
from CPP14Lexer import *
from CPP14Parser import *
from CPP14Visitor import *
class TREEVisitor(CPP14Visitor):
def visitFunctionCallPostfixexpression(self, ctx:CPP14Parser.FunctionCallPostfixexpressionContext):
#print("{}\t{}".format(ctx.getText(), ctx.getChildCount()))
return self.visitChildren(ctx)
def visitAssignmentexpression(self, ctx:CPP14Parser.AssignmentexpressionContext):
print(ctx.getText())
return self.visitChildren(ctx)
if __name__ == '__main__':
input_stream = FileStream(sys.argv[1])
cpplex = CPP14Lexer(input_stream)
commtokstream = CommonTokenStream(cpplex)
cpparser = CPP14Parser(commtokstream)
print("parse errors: {}".format(cpparser._syntaxErrors))
tree = cpparser.translationunit()
tv = TREEVisitor()
tv.visit(tree)
visitor = CPP14Visitor()
visitor.visit(tree)
Спасибо