语法解析的目的是为了转换,让这门语言能够逐步进化成一种语言。
这种语言的内核肯定是 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
中,也就是 在 Match 中默认是命名捕获的。
regex foo { <.bar> }
那么在 regex 也尽量使用 bracket 来进行设计。
在 Grammar 中,regex 也是有关键字的:
my $match = YourGrammar.parse($some-string);
只有括号和命名 regex 才会捕获东西,但内置的 <:LC> 会捕获东西吗?
默认,调用 .parse() 这个方法,将首先查找 Grammar 中 TOP 的 regex, 用这个
规则来解析字符串。如果没有找到 TOP,就会报错。所以 也是关键字。可以把 TOP 当成 Grammar 的入口。当然,你可以不用:
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 的正则表达式语言,是所有语言中所没有的。
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 定义的 regex 永远不会回溯:
token ident { [ <alpha> | \- ] \w* }
等价于:
regex ident { [ <alpha>: | \-: ]: \w*: }
rule 定义的规则不但不能回溯,而且缺省是 :sigspace 模式:
regex :ratchet :sigspace { ... }
token, rule 都是从 regex 演化而来: