访客显示输出过多
Visitor shows too much output
我正在尝试 Python 中的 ANTLR4 来解析 C++ 代码,我想找到 variable/object 等的初始化位置以及 variable/object 分配给另一个 variable/object.
我首先在下面的代码中实现 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 等......但我什至也得到了一些函数调用!
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)
谢谢
我用 Alternative Labels 更改了语法文件,现在它看起来像这样,似乎给了我想要的结果,
assignmentexpression
: conditionalexpression #otherassignments
| logicalorexpression assignmentoperator initializerclause #theassignments
| throwexpression #otherassignments
;
我正在尝试 Python 中的 ANTLR4 来解析 C++ 代码,我想找到 variable/object 等的初始化位置以及 variable/object 分配给另一个 variable/object.
我首先在下面的代码中实现 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 等......但我什至也得到了一些函数调用!
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)
谢谢
我用 Alternative Labels 更改了语法文件,现在它看起来像这样,似乎给了我想要的结果,
assignmentexpression
: conditionalexpression #otherassignments
| logicalorexpression assignmentoperator initializerclause #theassignments
| throwexpression #otherassignments
;