在我的新工作中,有更多的人使用Python而不是Perl,我有一个非常有用的API,我自己编写,我想用Python提供给我的同事。
我认为将Perl代码编译成Python代码的编译器对于这样的任务非常有用。在尝试编写解析Perl的内容之前(或者至少是我在定义API时使用的Perl子集)之前,我从咨询公司那里得到了bridgekeeper。
我几乎肯定不值得花钱聘请咨询公司来翻译这个API,但这是一个非常有趣的工具。
是否有人知道将解析(或尝试解析!)Perl5代码并将其编译为Python的编译器?如果没有这样的东西,我该如何开始编写一个简单的编译器来解析我的面向对象的Perl代码并将其转换为Python?我可以用ANTLR或YACC语法作为起点吗?
编辑:我找到了perl.y,如果我要编制自己的编译器,这可能是一个起点。
答案 0 :(得分:31)
詹姆斯
我建议您只使用Python重写模块,原因如下:
答案 1 :(得分:18)
我认为你应该重写你的代码。解析工作的结果质量取决于您的Perl编码风格。 我认为下面的引文很好地总结了理论方面。 来自维基百科:Perl in Wikipedia
Perl有一个图灵完备语法,因为解析可能会受到编译阶段执行的运行时代码的影响。[25]因此,Perl无法通过直接的Lex / Yacc词法分析器/解析器组合进行解析。相反,解释器实现了自己的词法分析器,它与修改后的GNU bison解析器协调,以解决语言中的歧义。
通常说“只有Perl才能解析Perl”,这意味着只有Perl解释器(perl)才能解析Perl语言(Perl),但即便如此,这一点也不正确。因为Perl解释器可以在编译阶段模拟图灵机,所以需要决定停机问题以便在每种情况下完成解析。这是一个长期存在的结果,Halting问题是不可判定的,因此即使Perl也不能解析Perl。 Perl做出了不寻常的选择,让用户可以在自己的编译阶段获得完整的编程能力。理论纯度方面的成本很高,但实际上的不便似乎很少见。
其他承担解析Perl的程序,例如源代码分析器和自动压缩程序,不仅要与模糊的句法结构竞争,还要与一般情况下Perl解析的不可判断性相抗衡。 Adam Kennedy的PPI项目专注于将Perl代码解析为文档(保留其作为文档的完整性),而不是将Perl解析为可执行代码(甚至Perl本身也无法做到)。肯尼迪首先推测说,“解析Perl会遇到'停机问题'。”[26],后来证明了这一点。[27]
答案 2 :(得分:7)
从5.10开始,您可以在启用实验Misc Attribute Decoration的情况下编译perl,并将PERL_XMLDUMP环境变量设置为文件名以获取解析树的XML转储(包括注释 - 对语言转换器非常有用)。虽然正如医生所说,这是一项正在进行的工作。
答案 3 :(得分:6)
我从未尝试过它,似乎没有维护,但也许PyPerl是一种选择?
这个API有多大?如果它真的有用那你为什么不在python中重写它。编写自动转换器可能需要更长时间才能重写API。
即使你设法自动重写它,结果代码也可能不会非常pythonic。
请务必查看weismat和eliben的答案
答案 4 :(得分:4)
尽管在python中将其转换为或重写它可能很有趣,但我不会将其中任何一个作为我的首选。然后你会遇到一个分叉的代码库。您所做的任何修改都必须重复。
为您的API编写一些可以从Perl外部访问的包装器。一种可能性是RESTful接口。另一个,如果你不想处理网络问题,那就是创建一组访问API的命令行工具(可能将信息作为JSON传递)。然后你可以编写一个简单的python库,它使用httplib2或subprocess访问包装器API(取决于你如何实现包装器)。
每当界面发生变化时,你仍然需要更新Python API,但现在它只用于界面更改。
答案 5 :(得分:3)
您可以尝试编写一个带有PPI的解析器,将其转储到某个中间形式,并从那里进行mecanically编写。很难,但可行。有用?尔....
或者您可以将代码移植到Perl 6,等待Pynie准备就绪,允许在同一运行时间内从Python直接调用Perl6!毕竟不是那么遥远。太糟糕了Ponie已经死了。
答案 6 :(得分:1)
https://perthon.sourceforge.net可能有用吗?虽然它仍处于alpha状态,但我看到了很多潜力。