Perl 6 的 Grammar 学习总结
语法解析的目的是为了转换,让这门语言能够逐步进化成一种语言。 这种语言的内核肯定是 Lisp,但外形却是创作者最喜欢的。 所有过去的东西都可以使用,但有更新的东西。更新的语言。 这些语言都是互通的。用任何一种语言写的代码,都是可以转换成另外的代码。 Perl 6 允许下面的 identifier: person's-name first-name middle-name last-name 但不允许下面的形式: list->vector string? sort! Perl 6 定义了很多操作符,但这些操作符不能自定义,只能在源码中定义: + - * ^ / 既然有 JSON 数据交换格式,就应当有算法交换格式,就好象是输出产品,也输出技术: 正则表达式是一种描述规则的语言,而传统语言是描述算法的语言。regex 就好象 Prolog,我们把想要的描述出来,计算机会帮我们算出符合条件的序列。 Perl 6 将 regex 作为第一类对象抽象出来并不奇怪,但他将 Grammar 也抽象出来了。 像一个类或模块一样设计 Grammar,那么就要学习 Perl 6 设计类的规则。 如果 regex 以点 dot(.) 开始,那么这个 regex 将不会保存在 Match Object 中,也就是
regex foo { <.bar> } 那么在 regex 也尽量使用 bracket 来进行设计。 在 Grammar 中,regex 也是有关键字的: my $match = YourGrammar.parse($some-string); 只有括号和命名 regex 才会捕获东西,但内置的 <:LC> 会捕获东西吗? 默认,调用 .parse() 这个方法,将首先查找 Grammar 中 TOP 的 regex,用这个 规则来解析字符串。如果没有找到 TOP,就会报错。所以
my $match = YourGrammar.parse($some-string,:rule<fred>); Grammar 就像 Class 一样,可以继承,可以改写。一定有核心的设计者将 Perl 6,Perl5 Ruby 等语言的 Grammar 设计出来,以便大家测试。一旦熟悉这种语言, 就可以将 Antrl 等软件的 g4 资源转换过来。 代码可以直接用大括号内嵌进来,但继承的词法和语法规则是什么呢? grammar Foo { regex foo { blah blah { say "hi" } blah blah } } "aaa" ~~ / a { say "hi" } b/ 在 regex 中插入代码要小心回溯 backtracking. 另外一种在 regex 插入代码的行为是插入一个子程序。 grammar foo { regex foo { <.setup> blah blah } method setup { # do stuff here } } Perl 6 的正则表达式语言,是所有语言中所没有的。 预定义执行 actions object:my $match = Grammar.parse($string,:rule($start-regex),:actions($actions-object)); Antlr 只是 Java 的一个工具,而 Perl 6 是一个做相同事的语言。内置了一个虚拟机,解释器,还有一个编译器。 对于带数量符号的捕获,是保存在数组中,Perl 5 是不是也是这样呢? if "hello" =~ s/(w)+/a/g { say @+; } 实际只捕获了一个位置,所以,Perl 5 并不是这样。尽量用 regex
token 和 ruletoken 定义的 regex 永远不会回溯: token ident { [ <alpha> | - ] w* } 等价于: regex ident { [ <alpha>: | -: ]: w*: } rule 定义的规则不但不能回溯,而且缺省是 :sigspace 模式: regex :ratchet :sigspace { ... } token,rule 都是从 regex 演化而来: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |