【发布时间】:2018-02-07 09:47:40
【问题描述】:
我想学习如何使用带有嵌入式代码执行的 Perl 正则表达式为嵌套元组创建抽象语法树。我可以使用 Perl 6 语法轻松地进行编程,并且我知道使用解析模块会简化 Perl 5 中的任务,但我认为对于如此简单的任务,我应该能够通过学习如何从语法定义。我找不到取消引用 $^R 的方法,所以我尝试撤消 TUPLE 规则定义末尾的非自愿嵌套,但输出不正确,例如一些子串出现两次。
use v5.10;
use Data::Dumper;
while (<DATA>) {
chomp;
/(?&TUPLE)(?{$a = $^R})
(?(DEFINE)
(?<TUPLE>
T \s (?&ELEM) \s (?&ELEM)
(?{ [$^R->[0][0],[$^R->[0][1],$^R[1]]] })
)
(?<ELEM>
(?: (a) (?{ [$^R,$^N] }) | \( (?&TUPLE) \) )
)
)/x;
say Dumper $a;
}
__DATA__
T a a
T (T a a) a
T a (T a a)
T (T a a) (T a a)
T (T (T a a) a) (T a (T a a))
预期的输出数据结构是一个嵌套列表:
['a','a'];
['a',['a','a']];
[['a','a'],'a'];
[['a','a'],['a','a']];
[[['a','a'],'a'],['a',['a','a']]]
作为参考,我还将分享我的工作 Perl 6 代码:
grammar Tuple {
token TOP { 'T ' <elem> ' ' <elem> }
token elem { 'a' | '(' <TOP> ')'}
}
class Actions {
method TOP($/) {make ($<elem>[0].made, $<elem>[1].made)}
method elem($/) {make $<TOP> ?? $<TOP>.made !! 'a'}
}
【问题讨论】: