Посетитель показывает слишком много результатов - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь 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)

Спасибо

1 Ответ

0 голосов
/ 22 апреля 2020

Я изменил файл грамматики с помощью Альтернативные метки , теперь он выглядит так и, кажется, дает мне желаемый результат,

assignmentexpression
   : conditionalexpression                                     #otherassignments
   | logicalorexpression assignmentoperator initializerclause  #theassignments
   | throwexpression                                           #otherassignments
   ;
...