Journal(2005) | Blog(2006) | RandomLink | WhoAmI | LiveBookmark | HomePage

<<Previous: my enum Example17 <<:Perl(6) Today>>  >>Next: m:nth(19)/Perl6Examples/

my $queen; rule me {Perl6|Examples18}

Category: Perl6   Keywords: Rule Perl6

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.

<<Previous: my enum Example17 <<:Perl(6) Today>>  >>Next: m:nth(19)/Perl6Examples/

Options: +Del.icio.us

Related items Created on 2005-06-06 12:26:32, Last modified on 2005-06-06 21:57:14
Copyright 2004-2005 All Rights Reserved. Powered by Eplanet && Catalyst 5.62.