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) "中的讨论.
其他人之前已经在类似的问题上发布过此链接,但我认为这很有趣并且有一个很好的案例:Perl无法解析(正式证明).
从该链接:
[考虑]以下由Randal Schwartz编写的恶魔代码片段,并确定正确的解析:
无论如何/ 25; #/; 死"这死了!";
Schwartz的Snippet可以解析两种不同的方式:如果是无效的(即不带参数),则第一个语句是void上下文中的一个除法,而该行的其余部分是注释.如果有任何争论,Schwartz的Snippet会解析为具有匹配运算符结果的任何函数,然后调用die()函数.
这意味着,为了静态解析Perl,必须能够从Perl 5代码字符串中确定它是否为任何子例程建立了一个nullary原型.
我只是发布这部分,以表明它真的很难很快.
或者,许多代码/文本编辑器可以做一个体面的(虽然从来都不是很好)语法高亮的工作,所以你可以从这些规范开始看看他们做了什么.事实上,你激励了我,我想我会发一个相关的问题,询问哪个编辑最能突出Perl.