在哪里可以找到Perl编程语言的正式语法?

在哪里可以找到Perl编程语言的正式语法?,perl,parsing,grammar,Perl,Parsing,Grammar,我理解Perl语法是不明确的,并且它的消歧是非常重要的()。不管怎样,Perl是否有正式的语法(尽管不明确和/或上下文敏感) 我可以获得Perl语言的BNF/yacc/RE吗? 没有BNF,但你可以用你的爪子 通过yacc语法在 源分布中的perly.y,如果 你特别勇敢。语法 依靠非常智能的标记化代码, 所以,准备好冒险进入托克 还有 用Chaim Frenkel的话来说:“Perl的 语法不能简化为BNF 解析perl的工作是分布式的 在yacc,lexer,smoke和 镜子。” 要了解由

我理解Perl语法是不明确的,并且它的消歧是非常重要的()。不管怎样,Perl是否有正式的语法(尽管不明确和/或上下文敏感)

我可以获得Perl语言的BNF/yacc/RE吗?

没有BNF,但你可以用你的爪子 通过yacc语法在 源分布中的perly.y,如果 你特别勇敢。语法 依靠非常智能的标记化代码, 所以,准备好冒险进入托克 还有

用Chaim Frenkel的话来说:“Perl的 语法不能简化为BNF 解析perl的工作是分布式的 在yacc,lexer,smoke和 镜子。”

要了解由于上下文影响几乎不可能解析Perl的原因,有一组精彩的示例,请查看

此外,请参见Simon Cozens在“”中的讨论


请注意

  • 存在

  • Rakudo Perl已经


没有“这是Perl 5的规范”意义上的正式语法(不过,我们正在努力解决这个问题)。但是在Perl5源代码中有一个正式的语法。当然,理解代码很可能不是一件小事


Jeffrey Kegler在他的博客上也写了一些关于perl语法的好文章。特别是请参见和。博客的其余部分也有一些关于语法分析的非常有趣的想法。

其他人以前也曾就类似问题发布过此链接,但我认为它很有趣,并且有一个很好的例子:

从该链接:

[认为]以下这些都是邪恶的 代码片段,由Randal编造 然后确定正确的 解析它:

随便什么;死“这死了!”

Schwartz的代码片段可以用两种不同的方式进行解析:如果任何东西都是空的 (也就是说,不接受任何参数) 第一个陈述是无效的分割 上下文,行的其余部分是 评论。如果任何事情都需要 参数,Schwartz的代码片段解析为 使用 匹配运算符的结果,然后是 调用die()函数

这意味着,为了静态解析Perl,它必须 可以从一串 Perl 5代码是否建立了 无主原型 子程序

我只是发布这一部分,以表明它变得非常困难,非常快


或者,许多代码/文本编辑器可以做一个不错的语法高亮显示工作(尽管从来都不是很好),因此您可以从这些规范开始,看看它们做了什么。事实上,您启发了我,我想我会发布一个相关的问题,询问什么编辑器最突出Perl。

即使它可能非常大。你为什么需要它?如果你想练习语法,有一些选择不会导致心脏病发作;如果您想构建一个perl解析器/解释器,请玩得开心,但首先问问自己为什么没有其他人尝试过;)是的,这是它的正则表达式:
*
:-)@delnan:我同意,这太疯狂了。:)我很好奇,因为我在学习句法分析理论。我想看一个现实生活中模糊语法的例子(而不是教科书中的玩具语法)。我还想看看现实生活中的上下文敏感语法(如果Perl最终是上下文敏感的)。与我的大多数事情一样,好奇心通常是激励因素+谢谢你给我带来了早晨的第一个笑声。谢谢:)烟镜,太棒了!我被最后那句话弄糊涂了。不是挑战而是真诚的好奇。我的印象是,yacc(以及相关的编译器)的输入实际上是BNF或EBNF或某种变体。它的输出会反馈到lexer,以此类推,直到输出被输出。我的理解哪里错了?thanksah,发现了这个:这是一个很好的讨论,回答了我的问题。是的。这就是“烟雾和镜子”部分。Perl5语法真的很奇怪。这是一个很好的例子!哈哈,你知道你有一种奇怪的语言,而仅仅是解析它的行为就能激发人们的灵感!:)并不意味着你不能解析它;这意味着存在不明确的解析。这个例子很有趣,因为看起来您必须有一个符号表才能使用lex;这就引出了一个问题:如何在没有lexed的情况下拥有一个符号表?Perl是否只在需要执行行时才解析行(这将允许它首先执行“whatever”的定义,然后执行这行)?如果我在执行过程中重新定义“whatever”,如果我能做到这一点,这一行的含义会改变吗?更有趣。@IraBaxter,我知道已经很久了,但我想我会回答的。这个例子并不是“无法解释”的。如果你阅读链接,有一个例子要复杂得多,显然不可能解析。@JoelBerger:我回去重新阅读了这个线程。我没有看到“更复杂的例子”;所有这些基本上都是“你不能静态地决定‘whatever’是否有参数列表”的版本。我相信你不能静态地决定。这并不意味着你不能解析它,只是它有多种解释,并且有足够的解析技术来处理它。也不意味着你不能建立有用的静态分析器;在这种情况下,他们可能无法提供良好的信息。我怀疑这种事情在实际的程序中是罕见的;以及Joel Berger在回答中引用的“Perl不能被解析”一文的作者。