2010-01-11 116 views
1

我正在嘗試爲lemon port to PHP創建簡單語言的解析器,它幾乎可以工作。PHP_ParserGenerator - 語法或解析器生成器中的錯誤?

以下語法:

%name SP_ 
%declare_class { class SpecParser } 
%token_prefix SP_ 
%include_class { 
public $retvalue = '<todo: error handling>'; 
public function singleKey($elem) { 
    end($elem); 
    return key($elem); 
} 
} 
%parse_accept { 
$this->retvalue = $this->_retvalue; 
} 

%right ASSIGN. 

start(A) ::= spec(B) . { A = B; } 

spec(A) ::= top_stmt(B) . { A = B; } 

top_stmt(A) ::= . { A=array('empty' => NULL); } 
top_stmt(A) ::= conditional(B) . { A = B;} 
top_stmt(A) ::= retval(B) . { A = B; } 
top_stmt(A) ::= assignment(B) . { A = array('assignment' => B); } 
top_stmt(A) ::= MOD STRING(B) top_stmt(C) . {C['rulename'] = B; A=B;} 

conditional(A) ::= IF stmt_list(B) . { A = array('condbreak' => array('stmt_list' => B)); } 
conditional(A) ::= IF stmt_list(B) stmt(C) . { A = array('condexec' => array('cond' => B,'exec' => C)); } 

retval(A) ::= access(B) . { A = array('access' => B); } 
retval(A) ::= invoke(B) . { A = array('invoke' => B); } 

assignment(A) ::= access(B) ASSIGN expr(C) . {A = array('lval' => B, 'rval' => C);} 

expr(A) ::= retval(B) . { A = array('retval' => B); } 
expr(A) ::= NOT retval(B) . { A = array('!retval' => B); } 

stmt(A) ::= expr(B) . { A = array('expr' => B); } 
stmt(A) ::= assignment(B) . { A = array('assignment' => B); } 

empty_stmt_list(A) ::= . {A = array();} 
empty_stmt_list(A) ::= stmt(B) . { 
    A = array(B); 
} 
empty_stmt_list(A) ::= empty_stmt_list(B) COMMA stmt(C) . { 
    B[] = C; 
    A = B; 
} 

stmt_list(A) ::= stmt_list(B) COMMA stmt(C) . {B[] = C; A=B; } 
stmt_list(A) ::= stmt(B) . { A = array(B); } 

invoke(A) ::= access(B) LPAREN empty_stmt_list(C) RPAREN . { A = array('target' => B,'args' => C); } 

access(A) ::= VARIABLE(B) . { A = array('variable' => B); } 

應解析輸入等:

  1. 「如果$ COND1,$ COND2,$ COND3()是$ var = $這個($ A() $ INST1 = $ b())」
  2. '$變種'
  3. '%RuleName中是$ var'

雖然像1和2這樣的輸入按預期工作,但不知何故,輸入3返回字符串(8)「rulename」。我不知道應該發生哪些削減。語法錯了嗎?還是我應該開始調試PHP_ParserGenerator本身?

謝謝

回答

1

我一定很累。這個錯誤是壞的分配:

top_stmt(A) ::= MOD STRING(B) top_stmt(C) . {C['rulename'] = B; A=B;} 

這應該是:

top_stmt(A) ::= MOD STRING(B) top_stmt(C) . {C['rulename'] = B; A=C;}