2012-01-12 41 views
0

我用模块解析:: RecDescent的
,并尝试建立语法赶上perl的子名 为什么在我的代码 https://gist.github.com/1595532解析:: RecDescent的解析子名

不行伽马 get_sub: NOWORD TEST NOWORD 'test1 $'?

on'> test1 $'? (variabble $ 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); 
} 
+6

如果您尝试解析Perl代码,则需要[PPI](http://search.cpan.org/perldoc?PPI),而不是Parse: :RecDescent的。 – cjm 2012-01-12 09:47:52

回答

2

$perl_code1开始用绳子my,这是不被规则匹配。您需要在文法中使用以下内容:

get_sub: 
     WORD NOWORD TEST NOWORD 
      ...