2012-07-22 19 views
3

我設法使用的所有功能是STRING,PARAMS,VARIABLE和FUNCNAME FUNCTION似乎存在問題,但我無法看到它。Parse :: RecDescent語法不按預期方式工作

use strict; 
use Parse::RecDescent; 

$::RD_ERRORS = 1; # Make sure the parser dies when it encounters an error 
$::RD_WARN = 1; # Enable warnings. This will warn on unused rules &c. 
$::RD_HINT = 1; # Give out hints to help fix problems. 

my $grammar = <<'_GRAMMAR_'; 
      SCRIPT : INSTRUCTION(s /;/) 

      INSTRUCTION: FUNCTION | VARIABLE "=" FUNCTION 

      FUNCTION : FUNCNAME "[" PARAMETERS "]" 

      FUNCNAME : "print" | "add2" | "save" # ok 

      PARAMETERS : STRING | STRING /\s*\,\s*/ PARAMETERS # ok 

      VARIABLE : /\w[A-Za-z-0-9]{0,10}/i # ok 

      STRING : /'(?:[^'\\]|\\.)*'/ # ok 
    _GRAMMAR_ 
my $parser2 = Parse::RecDescent->new($grammar); 
#i test every rule here 
print "STRING OK\n" if $parser2->STRING("'asd'"); 
print "PARAMS OK\n" if $parser2->PARAMETERS("'asd','XCV','vfgdg'"); 
print "SCRIPT OK\n" if $parser2->SCRIPT(q(print['hola','asd'];save['hello'];)); 
print "VARIABLE OK \n" if $parser2->VARIABLE("a1"); 
print "FUNCTION OK\n" if $parser2->FUNCTION(q(print['hola','asd'])); 
print "FUNCNAME OK\n" if $parser2->FUNCNAME(q(print)); 
print "INSTRUCTION OK\n" if $parser2->FUNCTION(q(a0=print['hola','asd'];)); 

任何幫助? BTW我的目標是:

variable=functioname['param1','param2','paramN']; 
function2['param1']; 
etc etc 

回答

3

這對我的作品(尤其是看[A-Za-z0-9]):

my $grammar = <<'_GRAMMAR_'; 
      SCRIPT : INSTRUCTION(s /;/) /\Z/ 

      INSTRUCTION: VARIABLE EQ FUNCTION | FUNCTION 

      FUNCTION : FUNCNAME '[' PARAMETERS ']' 

      FUNCNAME : "print" | "add2" | "save" 

      PARAMETERS : STRING(s /,/) 

      VARIABLE : /(\w[A-Za-z0-9]{0,10})/i 

      EQ: '=' 

      STRING : /'(?:[^'\\]|\\.)*'/ # ok 
_GRAMMAR_ 
+0

我認爲這是工作,可以請你解釋一下我做錯了什麼? – AlfredoVR 2012-07-22 09:28:12

+0

'[A-Za-z-0-9]'在z和0之間有一個額外的' - '。另外,我在參數中改變了'/ \ s *,\ s * /'。 – perreal 2012-07-22 09:38:46

+0

變量名稱匹配模式的括號是否也很重要? – 2012-07-22 15:45:17