【问题标题】:Are there programmatic tools for Perl to Python conversion? [closed]是否有用于 Perl 到 Python 转换的编程工具? [关闭]
【发布时间】:2010-11-06 21:59:00
【问题描述】:

在我的新工作中,使用 Python 的人比使用 Perl 的人多,而且我有一个非常有用的 API,是我自己编写的,我想将 Python 提供给我的同事。

我认为将 Perl 代码编译为 Python 代码的编译器对于此类任务非常有用。在尝试编写解析 Perl 的东西(或者至少是我在定义我的 API 时使用的 Perl 子集)之前,我遇到了来自咨询公司的bridgekeeper

几乎可以肯定,我聘请咨询公司翻译此 API 不值得花钱,但这是一个非常有趣的工具。

有谁知道会解析(或尝试解析!)Perl5 代码并将其编译成 Python 的编译器?如果没有这样的东西,我应该如何开始编写一个简单的编译器来解析我的面向对象的 Perl 代码并将其转换为 Python?有没有可以用作起点的 ANTLR 或 YACC 语法?

编辑:我找到了perl.y,如果我要推出自己的编译器,这可能是一个起点。

【问题讨论】:

标签: python perl parsing compilation


【解决方案1】:

詹姆斯,

我建议您只用 Python 重写该模块,原因如下:

  1. 解析 Perl 太难了。除非这对您来说是一项重要且理想的练习,否则您会发现自己在翻译上花费的时间比有用的工作要多得多。
  2. 通过重写它,您将有很好的机会练习 Python。学习最好通过做来完成,完成一项真正需要完成的任务是一大福音。
  3. 最后,Python 和 Perl 有完全不同的理念。要获得更 Pythonic 的 API,最好用 Python 重写它。

【讨论】:

  • PERL 充满了不能简单地转换成 Python 的结构。 PERL 需要人工阅读和理解代码背后的意图。
  • s/PERL/Perl/g (除非你比我怀疑的更吵)
  • @ijw:“s/PERL/Perl/g”是什么意思?
  • @Bastien:这是一个 Perl 正则表达式替换命令,意思是“用 Perl 全局替换 PERL(即所有出现)”
  • @S.Lott。确实,但是 OP 已经知道 Perl 并且已经编写了有问题的模块,所以我推测可以肯定地假设他理解他所写内容的意图。
【解决方案2】:

我认为你应该重写你的代码。解析工作结果的质量取决于您的 Perl 编码风格。 我认为下面的引用很好地总结了理论方面。 来自维基百科:Perl in Wikipedia

Perl 具有图灵完备的文法,因为在编译阶段执行的运行时代码会影响解析。[25]因此,Perl 不能被直接的 Lex/Yacc 词法分析器/解析器组合解析。相反,解释器实现了自己的词法分析器,它与修改后的 GNU bison 解析器协调以解决语言中的歧义。

人们常说“只有 perl 才能解析 Perl”,意思是只有 Perl 解释器 (perl) 才能解析 Perl 语言 (Perl),但即便如此,一般情况下也不是这样。因为 Perl 解释器可以在其编译阶段模拟图灵机,所以它需要确定停机问题才能在每种情况下完成解析。 Halting Problem 是不可判定的,这是一个长期存在的结果,因此即使 Perl 也不能总是解析 Perl。 Perl 做出了不同寻常的选择,即在其自己的编译阶段让用户访问其完整的编程能力。理论上的纯度成本很高,但实际不便似乎很少见。

解析 Perl 的其他程序,例如源代码分析器和自动缩进器,不仅要应对模棱两可的句法结构,还要应对 Perl 解析在一般情况下的不确定性。 Adam Kennedy 的 PPI 项目专注于将 Perl 代码解析为文档(保持其作为文档的完整性),而不是将 Perl 解析为可执行代码(甚至 Perl 本身也不能总是这样做)。肯尼迪首先猜想,“解析 Perl 会遇到‘停机问题’。”[26],后来证明了这一点。[27]

【讨论】:

    【解决方案3】:

    从 5.10 开始,您可以在启用实验性 Misc Attribute Decoration 的情况下编译 perl,并将 PERL_XMLDUMP 环境变量设置为文件名以获取解析树的 XML 转储(包括 cmets - 对语言翻译非常有帮助)。虽然正如文档所说,这是一项正在进行的工作。

    【讨论】:

      【解决方案4】:

      我从未尝试过,它似乎无人维护,但也许PyPerl 是一个选项?

      这个 API 有多大?如果它真的很有用,那你为什么不在 python 中重写它。编写自动转换器可能比重写 API 需要更长的时间。

      即使你设法自动重写它,生成的代码也可能不会很 Python。

      请务必查看 Weismat 和 eliben 的答案

      【讨论】:

        【解决方案5】:

        尽管将其转换为 Python 或用 Python 重写可能很有趣,但我不会将其中任何一个作为我的首选。然后你会被一个分叉的代码库困住。您所做的任何修改都必须复制。

        为您的 API 编写某种包装器,您可以从 Perl 外部访问它。一种可能性是 RESTful 接口。另一个,如果您不想处理网络问题,是创建一组访问 API 的命令行工具(可能以 JSON 的形式传递信息)。然后,您可以编写一个简单的 python 库,该库使用 httplib2 或子进程访问包装器 API(取决于您如何实现包装器)。

        您仍然需要在接口更改时更新 Python API,但现在只针对接口更改。

        【讨论】:

        • 或者我可以切换到 Python。那不会那么糟糕!
        【解决方案6】:

        您可以尝试使用 PPI 编写解析器,将其转储到某种中间形式,然后从那里机械地编写 Python。很难,但可行。有用?呃……

        或者您可以将您的代码移植到Perl 6,等待Pynie 准备好允许在同一运行时内从 Python 直接调用 Perl6!毕竟也不是那么远。可惜Ponie 已经死了。

        【讨论】:

          【解决方案7】:

          https://perthon.sourceforge.net 可能有用吗?虽然它仍处于 alpha 阶段,但我看到了很大的潜力。

          【讨论】:

            猜你喜欢
            • 2010-09-07
            • 2011-12-18
            • 2010-10-08
            • 1970-01-01
            • 2011-11-11
            • 1970-01-01
            • 1970-01-01
            • 2011-08-28
            • 2012-06-01
            相关资源
            最近更新 更多