【问题标题】:convert a perl6 grammar to perl5将 perl6 语法转换为 perl5
【发布时间】: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。从&lt;Var-Decl&gt; 和其他人中删除-,当然还有use Regexp::Grammars;use Data::Dumper;

标签: perl


【解决方案1】:

&lt;debug: on&gt; 很有帮助。经过一些更改后它正在工作

perl5 代码

my $text = q[my $x = 23; say $x;];

my $parser = qr {
    <nocontext:>
    #<debug: on>
    <Statements>
    <rule: Statements>    <[Statement]>+ % <Separator>
    <rule: Statement>     <VarDecl> | <FunCall>
    <rule: VarDecl>       my <VarName> = <Value>
    <rule: VarName>       \$ [a-zA-Z]+
    <token: Value>        \d+
    <rule: FunCall>       <FunName> <VarName>
    <token: FunName>      say
    <token: Separator>    ;
}xms;


if( $text =~ $parser ) {
    my %res = %/;
    print Dumper \%res;
}

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2018-10-09
    • 2018-09-11
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多