06 June 2005
This post may be outdated due to it was written on 2005. The links may be broken. The code may be not working anymore. Leave comments if needed.

preface

终于将 embed parrot in pugs, 现在可以试试 Perl6 的 Rule 了。
Thank God.

我们已经有一些中文文章介绍或详细描述了 Rule. 里面的一些基本东西我就不赘述了,我只写点我自己需要理解的东西。

Immediate Match

立即匹配,这是一种最简单最常用的匹配方式。由操作符 m// 或 s/// 定义的规则都是属于立即匹配的。
if ($string ~~ m/\w+/)      { . . . }
if ($string ~~ s/\w+/word/) { . . . }
// 操作符在智能匹配操作符下属于立即匹配,或在空,布尔,字符或数字上下文下属于立即匹配。
if ($string ~~ /\w+/)       { . . . } # ~~ 定义了立即匹配
$truth  = ?/\d+/;       # 布尔上下文,立即匹配 $_ 并返回真假
$count  = +/(\d+\s+)*/; # 数字上下文,立即匹配 $_ 并返回个数 
$string = ~/^\w+/;      # 字符串上下文,理解匹配 $_ 并返回字符串

Deferred Matche

延后匹配,定义一种匿名规则,以后匹配的时候可以调用该规则(复用)。一般这么定义:
$digits = rx/\d+/;
// 操作符除上面的立即匹配环境外,其余都属于延后匹配:
$digits = /\d+/; # store rule
除了上面这两种定义外,还可以使用 rule 关键字定义:
$digits = rule {\d+};
上面其实是定义了一个匿名规则。我们可以用 rule 定义带名字的规则:
rule digits {\d+}
我们可以在迟些时候调用这些规则:
if ($string ~~ $digits) {...}
if ($string ~~ /<$digits>/) {...} # 这种也应当是可用的,但目前 pugs 还没实现
如果是带名规则 rule digits, 我们可以怎么用:
$string ~~ /<digits>/;

Grammar

一个语法规则/grammar 是许多个规则/rule 的集合。事实上一个 grammar 就是一个类,只不过继承了基类 Rule. 而 rule 我们就可以把它看作类 grammar 的方法。
这也意味着 grammar 可以继承其他 grammar,且它们给了 rule 一个命名空间。
grammar Hitchhikers {
    rule name {Zaphod|Ford|Arthur} 
    rule id   {\d+} 
    . . .  
}
如果在该语法规则属于当前包,我们可以像前面一样直接调用 等,而如果该语法规则不属于当前包(外面的),那我们调用的时候就得加命名空间:
if $my_id ~~ /<id>/ { ... } # grammar Hitchhikers 在当前包
f $my_id ~~ /<Hitchhikers.id>/ { ... } # 不属于当前包
语法对于解析复杂的数据结构非常有用。

see u later

learning never stops.


blog comments powered by Disqus