我在这里找到了Python3的ANTLR语法,下载了它,并使用Pycharm中的ANTLR插件生成了ANTLR识别器(插件版本1.17,包含ANTLR运行时4.9.1(。
其中一个生成的模块是Python3Lexer.py。该类在顶部附近导入了一个名为Python3RexerBase的模块(可能是另一个Python模块(,但我一直找不到一个名称为PythoN3ExerBase的Python模块。
生成的Python3Lxer模块还包含如下函数:
def NEWLINE_sempred(self, localctx:RuleContext, predIndex:int):
if predIndex == 0:
return this.atStartOfInput()
这个.atStartOfInput((看起来非常Java化。
我在这里发现了一个Python3LexerBase.java类,所以它似乎试图从Python中调用一个java类。
Go中有一个关于同一基类的非常相似的线程,其中指出Python中存在或可能存在一个。
有人知道吗:
- 为什么(似乎(试图从Python中调用Java代码
- 某个地方有Python3LexerBase模块吗?还是我需要自己实现它
词法分析器和语法分析器的基类通常是用生成文件的目标语言编写的,因此它们不属于语法本身(如果不包括目标操作代码,则语法本身与目标语言无关(。但通常,对于特定的目标语言,附近至少有一个实现,你必须自己将其移植到你的语言(这里是Python(中,当然,除非这个实现符合你的需求。
如果一种语言被足够多的人使用,那么通常会随着时间的推移提供一个基本实现,就像Python语法一样。但正如@kaby76已经提到的,对于作为目标的Python来说,这还没有发生。