【发布时间】:2019-03-11 04:48:38
【问题描述】:
我正在将 Perl6 语法转换为 Perl5。下面的 Perl5 代码不起作用,我正在使用 Regexp::Grammars 模块。请帮我举一个可行的例子。
我在发布时收到此错误 - 您的帖子似乎主要是代码;请添加更多细节。所以我重复它来添加一些文字
perl6 代码
my $program = 'my $x = 23; say $x;';
grammar G {
rule TOP {
<statement>* %% ';'
}
rule statement {
| <variable-declaration>
| <function-call>
}
rule variable-declaration {
'my' <variable-name> '=' <value>
}
token variable-name {
'$' <alpha>+
}
token value {
<digit>+
}
rule function-call {
<function-name> <variable-name>
}
token function-name {
'say'
}
}
say G.parse($program);
perl5 代码
my $text = q[my $x = 23; say $x;];
my $parser = qr {
<nocontext:>
<Statements>
<rule: Statements> <[Statement]>* % <Separator>
<rule: Statement> <Var-Decl> | <Fun-Call>
<rule: Var-Decl> my <Var-Name> = <Value>
<rule: Var-Name> $ [a-zA-z]+
<token: Value> \d+
<rule: Fun-Call> <Fun-Name> <Var-Name>
<token: Fun-Name> say
<token: Separator> ;
}xms;
if( $text =~ $parser ) {
my %res = %/;
print Dumper \%res;
}
【问题讨论】:
-
您可以尝试use re 'debug' 或Regexp::Debugger 来缩小问题范围。
-
$ [a-zA-z]+应该是\$ [a-zA-Z_]\w*大写 Z,$之前的反斜杠,因为它是正则表达式中的元字符,并允许在变量名中使用_和 0-9。从<Var-Decl>和其他人中删除-,当然还有use Regexp::Grammars;和use Data::Dumper;。
标签: perl