由于Raku内置的语法,我被Raku吸引住了,以为我会玩弄它并编写一个简单的电子邮件地址解析器,唯一的问题是:我无法使它正常工作。
[在尝试实际可行的东西之前,我尝试了无数次迭代,但我一直在努力理解原因。
归根结底是将token
更改为rule
。
这是我的示例代码:
grammar Email {
token TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }
token name { \w+ ['.' \w+]* }
token domain { \w+ }
token subdomain { \w+ }
token tld { \w+ }
}
say Email.parse('[email protected]');
无效,它只打印Nil
,但是
grammar Email {
rule TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }
token name { \w+ ['.' \w+]* }
token domain { \w+ }
token subdomain { \w+ }
token tld { \w+ }
}
say Email.parse('[email protected]');
does可以正常打印
「[email protected]」
name => 「foo.bar」
subdomain => 「baz」
domain => 「example」
tld => 「com」
我所做的只是从token TOP
到rule TOP
。
从我可以从文档中得到的信息来看,这两个关键字之间的唯一区别是,空格在rule
中很重要,但在token
中却没有。如果是这样,第一个示例应该可以工作,因为我想忽略模式中各个部分之间的空白。
删除两部分之间的空格rule TOP { <name>'@'[<subdomain>'.']*<domain>'.'<tld> }
将行为恢复为打印Nil
。
任何人都可以了解我在这里发生的事情吗?
EDIT:改为将TOP
规则更改为regex
,这允许回溯使其也起作用。
问题仍然存在,当rule { }
(与regex {:ratchet :sigspace }
相同)不匹配时,token { }
(与regex {:ratchet }
相同)如何匹配?
电子邮件地址中没有空格,因此,出于所有意图和目的,它应该立即失败