由于 Perl5 的字符串本身就是正则表达式的代码,而正则表达式中可以内嵌代码:
$ use 5.020$ my $tokens = []$ my $token = qr/ ([\w\-]+) (?{push @$tokens,$+}) /xms$ my $top = qr/\A (?: $token | \s+)+ \z/xms;$ 'hello world come-on' =~ / $top /xms$ say @$tokens.join(' ');hello world come-on
而如何生成数据结构呢?
一方面可以先生成 tokens,然后再生成数据结构,也可以用稍微复杂的办法直接生成数据结构:
用一个数据结构来代替 @tokens,可以向这个数据结构的一个数组子元素推送数据。
push-token($tokens,$element,$depth);
当 $depth == 1
push @token[-1],$element;
当 $depth == 2
push @token[-1][-1],$element;
要设计一个动态创建指定深度元素的函数:
create_depth_container($tokens,$depth);my $data_expr = '$tokens' . '[-1]' x $depth ' = []';## $tokens->[-1] = []; $tokens->[-1][-1] = [];
其中 $depth 代码嵌套的深度,而深度是由匹配特定的字符触发的:
/ \( (?{ $depth++ }) /xms/ \) (?{ $depth-- }) /xms
这样就能推送出带嵌套的数据结构了
总结以上是内存溢出为你收集整理的用 Perl5 构建 Grammar 的思索全部内容,希望文章能够帮你解决用 Perl5 构建 Grammar 的思索所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)