【发布时间】:2019-01-11 11:38:07
【问题描述】:
我的代码在:https://gist.github.com/ravbell/d94b37f1a346a1f73b5a827d9eaf7c92
use v6;
#use Grammar::Tracer;
grammar invoice {
token ws { \h*};
token super-word {\S+};
token super-phrase { <super-word> [\h <super-word>]*}
token line {^^ \h* [ <super-word> \h+]* <super-word>* \n};
token invoice-prelude-start {^^'Invoice Summary'\n}
token invoice-prelude-end {<line> <?before 'Start Invoice Details'\n>};
rule invoice-prelude {
<invoice-prelude-start>
<line>*?
<invoice-prelude-end>
<line>
}
}
multi sub MAIN(){
my $t = q :to/EOQ/;
Invoice Summary
asd fasdf
asdfasdf
asd 123-fasdf $1234.00
qwe {rq} [we-r_q] we
Start Invoice Details
EOQ
say $t;
say invoice.parse($t,:rule<invoice-prelude>);
}
multi sub MAIN('test'){
use Test;
ok invoice.parse('Invoice Summary' ~ "\n", rule => <invoice-prelude-start>);
ok invoice.parse('asdfa {sf} asd-[fasdf] #werwerw'~"\n", rule => <line>);
ok invoice.parse('asdfawerwerw'~"\n", rule => <line>);
ok invoice.subparse('fasdff;kjaf asdf asderwret'~"\n"~'Start Invoice Details'~"\n",rule => <invoice-prelude-end>);
ok invoice.parse('fasdff;kjaf asdf asderwret'~"\n"~'Start Invoice Details'~"\n",rule => <invoice-prelude-end>);
done-testing;
}
我无法弄清楚为什么rule <invoice-prelude> 上的解析失败并显示Nil。请注意,即使.subparse 也会失败。
通过运行带有'test' 参数的MAIN 可以看到单个令牌的测试通过(当然<invoice-prelude> 上的.parse 失败,因为它不是完整的字符串)。
应该在rule <invoice-prelude> 中修改什么,以便可以正确解析MAIN() 中的整个字符串$t?
【问题讨论】:
-
Start Invoice Details的行尾似乎有一个空格。这使得前瞻正则表达式<?before 'Start Invoice Details'\n>失败,因为它期望在行尾有一个换行符
标签: regex parsing grammar raku