Antlr4 Python3 目标访问者不可用?

3
我尝试按照Antlr4参考书的指导,在Python3目标下进行编程,但是在计算器示例中卡住了。在Antlr4文档中提到:

AntLR的Python实现尽可能接近Java实现,因此您不应该难以将示例适应Python

但我还没有搞明白。
Java代码访问者有一个.visit方法,在Python中我没有这个方法。我认为这是因为在Java中,visit方法具有令牌的参数重载。在Python中,我们有visitProg()visitAssign()visitId()等等。但现在我不能写value = self.visit(ctx.expr()),因为我们不知道要调用哪个visit?
还是我错过了某些说明?

你知道Python ANTLR API的文档在哪里吗? - Onur
如果您想编写 self.visit(),则可能需要编写某种调度程序,根据 ctx.expr() 的运行时类型调用正确的 .visitX() - Onur
2个回答

5

看起来在过去的3年中,这个问题已经解决了。我从语法中生成了一个解析器,并针对Python 3进行了目标设置,使用了:

antlr4 -Dlanguage=Python3 -no-listener -visitor mygrammar.g4

它生成一个访问者类,该类是antlr4-python3-runtime中的一个子类ParseTreeVisitor。查看ParseTreeVisitor类,其中有一个visit方法。
对于那些想要使用Python完成The Definitive ANTLR 4 Reference的人,ANTLR4文档将您指向这个github仓库:

https://github.com/jszheng/py3antlr4book


使用antlr 4.7.2(撰写时的最新版本),我仍然无法获得访问者模块/类。这适用于Python2和Python3。 - pelson
1
更新:我收到了一个警告“error(153): LabeledExpr.g4:3:0: rule start contains a closure with at least one alternative that can match an empty string”,这导致访问者无法生成。一旦修复,我得到了我期望的结果。 - pelson
2
@PythonJin 你救了我的命!!谢谢分享 Git 仓库。我一直缺乏好的例子。 - Zeinab Ganjei

2

我遇到了类似的问题。你有关于Python中访问者实现的任何更新吗? - Raghav Mittal
这个PR的链接已经失效了,我在ANTLR4存储库中也没有找到任何相关的参考资料:https://github.com/antlr/antlr4 - PythonJin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接