用 Perl5 构建 Grammar 的思索
发布时间:2020-12-15 23:44:04 所属栏目:大数据 来源:网络整理
导读:由于 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$
由于 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 这样就能推送出带嵌套的数据结构了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |