Ben lemon port to PHP ile basit bir dil için bir ayrıştırıcı oluşturmak çalışıyorum ve neredeyse çalışır.
Aşağıdaki dilbilgisi:
%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); }
gibi girdiler ayrıştırmak gerekir:
- 'Eğer $ cond1! $ Cond2, $ cond3 () $ var = $ this ($ a (), $ Inst1 = $) (b)'
- '$ Var'
- '% Kuralismi $ var'
1 ve 2 iş gibi giriş beklendiği gibi olsa da, her nasılsa, benim için anlaşılır değil, nasıl girdi 3 döner string (8) "kuralismi". Bunun gerçekleşmesi için indirimlerin yer almalıdır hiçbir fikrim yok. Bu dilbilgisi ile yanlış bir şey mi, yoksa ben PHP_ParserGenerator kendisi ayıklama başlar?
Teşekkürler