语法解析的目的是为了转换,让这门语言可以逐步进化成一种语言。 这种语言的内核确定是 Lisp,但外形倒是创做者最喜欢的。正则表达式
全部过去的东西均可以使用,但有更新的东西。更新的语言。 这些语言都是互通的。用任何一种语言写的代码,都是能够转换成另外的代码。算法
Perl 6 容许下面的 identifier:数组
person's-name first-name middle-name last-name
但不容许下面的形式:数据结构
list->vector string? sort!
Perl 6 定义了不少操做符,但这些操做符不能自定义,只能在源码中定义:ide
+ - * ^ /
既然有 JSON 数据交换格式,就应当有算法交换格式,就好象是输出产品,也输出技术:工具
正则表达式是一种描述规则的语言,而传统语言是描述算法的语言。regex 就好象 Prolog,咱们把想要的描述出来,计算机会帮咱们算出符合条件的序列。学习
Perl 6 将 regex 做为第一类对象抽象出来并不奇怪,但他将 Grammar 也抽象出来了。测试
像一个类或模块同样设计 Grammar,那么就要学习 Perl 6 设计类的规则。spa
若是 regex 以点 dot(.) 开始,那么这个 regex 将不会保存在 Match Object 中,也就是 <regex> 在 Match 中默认是命名捕获的。设计
regex foo { <.bar> }
那么在 regex 也尽可能使用 bracket 来进行设计。
在 Grammar 中,regex 也是有关键字的:
my $match = YourGrammar.parse($some-string);
只有括号和命名 regex 才会捕获东西,但内置的 <:LC> 会捕获东西吗?
默认,调用 .parse() 这个方法,将首先查找 Grammar 中 TOP 的 regex, 用这个 规则来解析字符串。若是没有找到 TOP,就会报错。因此 <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> 来获取指定位置的数据结构。
token 定义的 regex 永远不会回溯:
token ident { [ <alpha> | \- ] \w* }
等价于:
regex ident { [ <alpha>: | \-: ]: \w*: }
rule 定义的规则不但不能回溯,并且缺省是 :sigspace 模式:
regex :ratchet :sigspace { ... }
token, rule 都是从 regex 演化而来: