この投稿は xuzuning によって最終編集されました: 2012-08-27 16:40:33
最近文法解析をやってみたのですが、問題がたくさんあります。
提案をお願いします。コードが入りきらなかったので2ページに分けました。ダウンロードアドレス http://download.csdn.net/detail/xuzuning/4529066
「ttrie.php」をインクルードします;<br>
<br>
class Rule は TTrie {<br> を拡張します
public $rule = array();<br>
public $savematch = 0;<br>
<br>
関数 __construct($s='') {<br>
$this->set( array(<br>
' ' => '分離'、<br>
"rn" => 'set_rule',<br>
"n" => 'set_rule',<br>
"t" => '分離'、<br>
'->' => '分離'、<br>
'→' => '分離',<br>
'|' => 'セット_パラレル_ルール',<br>
));<br>
$this->match($s);<br>
if($this->rule[0][0] == $this->rule[0][1]) {<br>
if(count($this->rule[0]) == 2) $this->rule[0][0] .= "'";<br>
else array_unshift($this->rule, array($this->rule[0][0]."'", $this->rule[0][0]));<br>
}else {<br>
$c = $this->rule[0][0];<br>
$n = 0;<br>
foreach($this->rule as $r) if($r[0] == $c) $n ;<br>
if($n > 1) array_unshift($this->rule, array($this->rule[0][0]."'", $this->rule[0][0])) ;<br>
}<br>
}<br>
function Separated() {<br>
}<br>
関数 set_rule() {<br>
$this->rule[] = $this->buffer;<br>
$this->buffer = array();<br>
}<br>
関数 set_Parallel_rule() {<br>
$t = $this->buffer[0];<br>
$this->set_rule();<br>
$this->buffer[] = $t;<br>
}<br>
}<br>
<br>
<br>
クラス文法 {<br>
var $closure = array();<br>
var $first = array();<br>
var $follow = array();<br>
var $rule = array();<br>
var $identifier = array();<br>
var $leay = array();<br>
var $forecast = array();<br>
var $stack = array();<br>
var $ll = 'LL(0)';<br>
var $lr = 'LR(0)';<br>
<br>
関数 __construct($s='') {<br>
$p = 新しいルール($s);<br>
$this->rule = $p->rule;<br>
$this->set_grammar();<br>
}<br>
<br>
function set_grammar() {<br>
foreach($this->rule as $rule) {<br>
if(! in_array($rule[0], $this->identifier)) $this->identifier[] = $rule[0];<br>
}<br>
foreach($this->rule as $rule) {<br>
foreach($rule as $v)<br>
if(! in_array($v, $this->identifier) && ! in_array($v, $this->leay))<br>
$this->leay[] = $v;<br>
}<br>
$this->set_first();<br>
$this->set_follow();<br>
$this->set_closure();<br>
$this->set_select();<br>
$this->set_forecast();<br>
}<br>
関数 set_first() {<br>
foreach($this->rule as $rule) $this->first[$rule[0]] = array();<br>
// 形状 U->a... (a は終端記号) の生成を直接収集し、a を First(U)<br> に含めます
foreach($this->rule as $v) {<br>
if(in_array($v[1], $this->leay)) $this->first[$v[0]][] = $v[1];<br>
}<br>
// 生成形式 U->P1P2P3...Pn を繰り返し転送します (P は非終端記号です) P1 に ε がある場合は、First(P1) のすべての内容が最初に First(U) に転送されます。 、First(P2) の内容は First(U) に転送され、Pi<br> に ε がなくなるまで同様に続きます。
{<br>を実行します
$t = Serialize($this->first);<br>
foreach($this->rule as $rule) {<br>
for($i=1; $i<count class="clear"></count>