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

Ada*_*ter 18 perl grammar parsing

我理解Perl语法是模糊的,它的消歧是非平凡的(有时涉及在编译阶段执行代码).无论如何,Perl是否具有正式语法(尽管模棱两可和/或上下文敏感)?

DVK*_*DVK 30

来自perlfaq7

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

没有BNF,但是如果你特别勇敢的话,你可以在源代码发布中通过yacc语法在paly.y中找到自己的方式.语法依赖于非常智能的标记化代码,因此也准备冒险进入toke.c.

用Chaim Frenkel的话说:"Perl的语法不能简化为BNF.解析perl的工作分布在yacc,词法分析器,烟雾和镜子之间."

要查看为什么由于上下文影响几乎不可能解析Perl的一组精彩示例,请查看Randal Schwartz的帖子:On Parsing Perl

另外,请参阅Simon Cozens的" Perl 5 Internals(第5章,Lexer和Parser) "中的讨论.


请注意,Perl6答案有所不同:


Joe*_*ger 9

其他人之前已经在类似的问题上发布过此链接,但我认为这很有趣并且有一个很好的案例:Perl无法解析(正式证明).

从该链接:

[考虑]以下由Randal Schwartz编写的恶魔代码片段,并确定正确的解析:

无论如何/ 25; #/; 死"这死了!";

Schwartz的Snippet可以解析两种不同的方式:如果是无效的(即不带参数),则第一个语句是void上下文中的一个除法,而该行的其余部分是注释.如果有任何争论,Schwartz的Snippet会解析为具有匹配运算符结果的任何函数,然后调用die()函数.

这意味着,为了静态解析Perl,必须能够从Perl 5代码字符串中确定它是否为任何子例程建立了一个nullary原型.

我只是发布这部分,以表明它真的很难很快.

或者,许多代码/文本编辑器可以做一个体面的(虽然从来都不是很好)语法高亮的工作,所以你可以从这些规范开始看看他们做了什么.事实上,你激励了我,我想我会发一个相关的问题,询问哪个编辑最能突出Perl.


arn*_*olt 5

在"这是Perl 5的规范"这一意义上没有正式的语法(尽管Perl 6的努力试图解决这个问题).但是Perl 5源代码中有一个正式的语法.当然,理解代码很可能不是一项微不足道的事情.

Jeffrey Kegler在他的博客上写了一些关于perl语法的好文章.特别看,这篇文章这篇文章.博客的其余部分也有一些关于解析的非常有趣的想法.