【问题标题】:Parse::RecDescent parse sub nameParse::RecDescent 解析子名称
【发布时间】:2012-01-12 07:25:44
【问题描述】:

我使用模块 Parse::RecDescent
并尝试构建语法以捕获 perl 子名称 为什么在我的代码中 https://gist.github.com/1595532

语法无效 get_sub: NOWORD 测试 NOWORD

在 '>test1$' 上? (变量 $perl_code1 )

use Modern::Perl;
use Parse::RecDescent;

my $perl_code1  = q{my >test1$ string3 = $object->oldSub(6,7);};
my $perl_code2  = q{test1$ string3 = $object->oldSub(6,7);};
my $perl_code3  = q{my test1$ string3 = $object->oldSub(6,7);};
my @perl_lines  = ( $perl_code1, $perl_code2, $perl_code3 );
my $var         = 'test1';
my $sub_grammar = q{

    get_sub: 
           NOWORD TEST NOWORD
               {print $item[2]}      
           |TEST NOWORD
              {print $item[1]}     

    get_sub2: 
           WORD TEST NOWORD
               {print $item[2]}      
           |TEST NOWORD
              {print $item[1]}     

    WORD: 
        /\w+/    
    NOWORD: 
        /\W+/            
    TEST: 
        /} . $var . q{/
    };
my $sub_parse = new Parse::RecDescent($sub_grammar);
say 'example1:';

for my $string1 (@perl_lines) {
    say "Valid sub:$string1\n" if $sub_parse->get_sub($string1);
}

say 'example2:';
for my $string2 (@perl_lines) {
    say " Valid sub:$string2\n" if $sub_parse->get_sub2($string2);
}

【问题讨论】:

  • 如果你试图解析 Perl 代码,你需要PPI,而不是 Parse::RecDescent。

标签: perl grammar parser-generator parse-recdescent


【解决方案1】:

您的$perl_code1 以字符串my 开头,该字符串与规则不匹配。您需要在语法中类似以下内容:

get_sub:
       WORD NOWORD TEST NOWORD
           ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    相关资源
    最近更新 更多