Perl 6 的 Grammar 学习总结

语法解析的目的是为了转换,让这门语言可以逐步进化成一种语言。 这种语言的内核确定是 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 的正则表达式语言,是全部语言中所没有的。

预约义执行 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> 来获取指定位置的数据结构。

token 和 rule

token 定义的 regex 永远不会回溯:

token ident { [ <alpha> | \- ] \w* }

等价于:

regex ident { [ <alpha>: | \-: ]: \w*: }

rule 定义的规则不但不能回溯,并且缺省是 :sigspace 模式:

regex :ratchet :sigspace { ... }

token, rule 都是从 regex 演化而来:

相关文章
相关标签/搜索