ホームページ バックエンド開発 PHPチュートリアル コンパイル原理に興味のある方

コンパイル原理に興味のある方

Jun 13, 2016 pm 01:12 PM
array gt this

コンパイル原理に興味のある方へ
最近文法解析をやってみたのですが、問題がたくさんあります。
提案してください。コードが入りきらなかったので2ページに分けました。ダウンロードアドレス http://download.csdn.net/detail/xuzuning/4529066

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->「ttrie.php」をインクルードします。

class Rule extends TTrie {
  パブリック $rule = array();
  パブリック $savematch = 0;

  関数 __construct($s='') {
    $this-&gt;set( array(
        ' ' =&gt; 「別居」、
        "rn" =&gt; 'セットルール',
        "n" =&gt; 'セットルール',
        "t" =&gt; 「別居」、
        「-&gt;」 =&gt; 「別居」、
        '→' =&gt; 「別居」、
        '|' =&gt; 'set_Parallel_rule',
        ));
    $this-&gt;match($s);
    if($this-&gt;rule[0][0] == $this-&gt;rule[0][1]) {
        if(count($this-&gt;rule[0]) == 2) $this-&gt;rule[0][0] .= "'";
        else array_unshift($this-&gt;rule, array($this-&gt;rule[0][0]."'", $this-&gt;rule[0][0]));
    }それ以外 {
        $c = $this-&gt;ルール[0][0];
        $n = 0;
        foreach($this-&gt;rule as $r) if($r[0] == $c) $n++;
        if($n &gt; 1) array_unshift($this-&gt;rule, array($this-&gt;rule[0][0]."'", $this-&gt;rule[0][0])) ;
    }
  }
  関数 Separated() {
  }
  関数 set_rule() {
    $this-&gt;rule[] = $this-&gt;buffer;
    $this-&gt;buffer = array();
  }
  関数 set_Parallel_rule() {
    $t = $this-&gt;buffer[0];
    $this-&gt;set_rule();
    $this-&gt;buffer[] = $t;
  }
}


クラス文法 {
  var $closure = array();
  var $first = array();
  var $follow = array();
  var $rule = array();
  var $identifier = array();
  var $leay = array();
  var $forecast = array();
  var $stack = array();
  var $ll = 'LL(0)';
  var $lr = 'LR(0)';

  関数 __construct($s='') {
    $p = 新しいルール($s);
    $this-&gt;rule = $p-&gt;rule;
    $this-&gt;set_grammar();
  }

  関数 set_grammar() {
    foreach($this-&gt;rule as $rule) {
        if(! in_array($rule[0], $this-&gt;identifier)) $this-&gt;identifier[] = $rule[0];
    }
    foreach($this-&gt;rule as $rule) {
        foreach($rule as $v)
            if(! in_array($v, $this-&gt;identifier) &amp;&amp; ! in_array($v, $this-&gt;leay))
                $this-&gt;leay[] = $v;
    }
    $this-&gt;set_first();
    $this-&gt;set_follow();
    $this-&gt;set_closure();
    $this-&gt;set_select();
    $this-&gt;set_forecast();
  }
  関数 set_first() {
    foreach($this-&gt;rule as $rule) $this-&gt;first[$rule[0]] = array();
    // 形のような U-&gt;a… の生成式 (その中 a は终结符) を直接取得し、a を First(U) に挿入します
    foreach($this-&gt;rule as $v) {
        if(in_array($v[1], $this-&gt;leay)) $this-&gt;first[$v[0]][] = $v[1];
    }
    // 逆転送形式入力 U-&gt;P1P2P3…Pn の生成式 (P は终结符),应先制 First(P1) 内のすべての内容が First(U) 中へ転送され、結果 P1 中にεがある場合、 First(P2) 内の内容は First(U) に送信され、Pi に到達するまでは転送されません
    する {
        $t = シリアル化($this-&gt;first);
        foreach($this-&gt;rule as $rule) {
            for($i=1; $i<count if>identifier)) {
                    $this-&gt;first[$rule[0]] = array_unique(array_merge($this-&gt;first[$rule[0]], $this-&gt;first[$v]));
                    if(! in_array('#', $this-&gt;first[$v])) ブレーク;
                }それ以外の場合は中断します。
            }
        }
    }while($t != Serialize($this-&gt;first));
  }
  関数 set_follow() {
    foreach($this-&gt;rule as $rule) $this-&gt;follow[$rule[0]] = array();
    // 形如 …Ua… 的、掴a 直接Follow(U)中に直接收入
    foreach($this-&gt;rule as $rule) {
        for($i=1; $i<count if>identifier) &amp;&amp; in_array($rule[$i+1], $this-&gt;leay))
                $this-&gt;follow[$rule[$i]][] = $rule[$i+1];
        }
        if(in_array($rule[$i], $this-&gt;identifier)) $this-&gt;follow[$rule[$i]][] = '#';
    }
    foreach($this-&gt;follow as &amp;$v) if(! $v) $v[] = '#';
    // 直接收取形例 …UP…(P是终结符)的,最初(P)中非ε收入toFollow(U)中
    foreach($this-&gt;rule as $rule) {
        for($i=1; $i<count if>identifier) &amp;&amp; in_array($rule[$i+1], $this-&gt;identifier)) {
                $this-&gt;follow[$rule[$i]] = array_unique(array_merge($this-&gt;follow[$rule[$i]], array_diff($this-&gt;first[$rule[$i+1] ]]、 配列('#'))));
            }
        }
    }//逆転送形式の場合、U-&gt;aPの(Pは终结符)またはU-&gt;aPQ(P,Qは非终结符でQ中に含まれます)、应ハンドルFollow(U)中の全コンテンツ転送フォロー(P)中
    する {
        $t = シリアル化($this-&gt;follow);
        foreach($this-&gt;rule as $rule) {
            $s = $rule[0];
            $d = 終了($rule);
            if(in_array($d, $this-&gt;leay)) 続行;
            $p = 前($rule);
            if(in_array($p, $this-&gt;leay)) $this-&gt;follow[$d] = array_unique(array_merge($this-&gt;follow[$d], $this-&gt;follow[$s] ]));
            elseif(in_array('#', $this-&gt;follow[$d])) $this-&gt;follow[$p] = array_unique(array_merge($this-&gt;follow[$p], $this-&gt; ;フォロー[$s]));
        }
    }while($t != Serialize($this-&gt;follow));
  }
  関数 set_closure() {
    $shift = 配列();
    $this-&gt;closure[0][] = array('offs' =&gt; 1, 'rule' =&gt; 0);
    for($i=0 ; $i <count>closure); $i++) {
        $cnt = count($this-&gt;closure);
        //建設闭包クロージャー
        $ex = 配列();
        $j = 0;
        $tmp = 配列();
        する {
            $size = count($this-&gt;closure[$i]);
            for($j=0; $j<count>closure[$i]); $j++) {
                $dfa = $this-&gt;クロージャ[$i][$j];
                $rule = $this-&gt;rule[$dfa['rule']];
                if(isset($rule[$dfa['offs']])) {
                    $ch = $ex[] = $rule[$dfa['offs']];
                }
                foreach($this-&gt;rule as $r=&gt;$rule) {
                    if(in_array($rule[0], $ex)) {
                        $t = array('offs' =&gt; 1, 'rule' =&gt; $r);
                        if(!isset($tmp[$r][1])) $this-&gt;closure[$i][] = $t;
                        $tmp[$r][1] = 1;
                    }
                }
            }
        }while(count($this-&gt;closure[$i]) != $size); //まで不再增大

        // 判断状態态转向に行く
        $out = 配列();
        foreach($this-&gt;closure[$i] as $k=&gt;$dfa) {
            $rule = $this-&gt;rule[$dfa['rule']];
            if(isset($rule[$dfa['offs']])) {
                $t = "$dfa[ルール],$dfa[オフ]";
                $ch = $rule[$dfa['offs']];
                $this-&gt;closure[$i][$k]['char'] = $ch;
                if(isset($out[$ch])) $shift[$t] = $out[$ch];
                if(isset($shift[$t])) {
                    $this-&gt;closure[$i][$k]['target'] = $shift[$t];
                    $dfa['offs']++;
                    if(!$this-&gt;in_closure($dfa, $this-&gt;closure[$shift[$t]])) $this-&gt;closure[$shift[$t]][] = $dfa;

                } それ以外 {
                    $cnt = count($this-&gt;closure);
                    $this-&gt;closure[$i][$k]['ターゲット'] = $cnt;
                    $shift[$t] = $cnt;
                    $dfa['offs']++;
                    $this-&gt;closure[count($this-&gt;closure)][] = $dfa;
                    $out[$ch] = $cnt;
                }
            }
        }

        //造造状態态转换表
        foreach($this-&gt;closure[$i] as $k=&gt;$dfa) {
            if(isset($dfa['target'])) {
                $v = $dfa['char'];
                if(in_array($v, $this-&gt;identifier)) $this-&gt;goto[$i][$v] = $dfa['target'];
                それ以外 {
                    $this-&gt;action[$i][$v][] = "S$dfa[ターゲット]";
                    $this-&gt;request[$i][$v] = $dfa['rule'];
                }
            } それ以外 {
                $ch = $this-&gt;rule[$dfa['rule']][0];
                foreach($this-&gt;follow[$ch] as $v) {
                    $this-&gt;action[$i][$v][] = "r$dfa[ルール]";
                    $this-&gt;request[$i][$v] = $dfa['rule'];
                }
            }
        }
        foreach($this-&gt;action[$i] as $c=&gt;$v) {
            $v = 配列固有($v);
            if(count($v) &gt; 1) $this-&gt;lr = 'SLR(1)';
            $this-&gt;アクション[$i][$c] = $v;
        }
    }
  }

  関数 in_closure($t, $s) {
    foreach($s as $r) if($t['offs'] == $r['offs'] &amp;&amp; $t['rule'] == $r['rule']) return true;
    false を返します。
    return in_array(serialize($t), array_map('serialize', $s));
  }
  関数 set_select() {
    foreach($this-&gt;rule as $i=&gt;$rule) {
        $y = 配列($rule[1]);
        if(in_array($y[0], $this-&gt;leay)) {
            if($y[0] != '#') {
                $this-&gt;select[$i] = $y;
                続く;
            }
        }else $y = $this-&gt;first[$rule[1]];
        $x = $this-&gt;follow[$rule[0]];
        //SELECT(X-&gt;Y)=(FIRST(Y)-{ε})并FOLLOW(X)
        $this-&gt;select[$i] = array_unique( array_merge(array_diff($y, array('#')), $x) );
    }
  }/**※予測分析テーブルの構築
   **/
  関数 set_forecast() {
    foreach($this-&gt;select as $i=&gt;$r) {
        $c = $this-&gt;ルール[$i][0];
        $v = array_reverse(array_slice($this-&gt;rule[$i], 1));
        foreach($r として $k) {
            $this-&gt;forecast[$c][$k][] = $v;
        }
    }
    //检查冲突
    foreach($this-&gt;forecast as $c=&gt;$r) {
        foreach($r として $k) {
            if(count($k) &gt; 1) {
                $this-&gt;ll = 'LL(1)';
            }
        }
    }
  }

 <div class="clear"></div></count></count></count></count></count>
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Huawei GT3 ProとGT4の違いは何ですか? Huawei GT3 ProとGT4の違いは何ですか? Dec 29, 2023 pm 02:27 PM

Huawei GT3 ProとGT4の違いは何ですか?

修正: Windows 11 で Snipping ツールが機能しない 修正: Windows 11 で Snipping ツールが機能しない Aug 24, 2023 am 09:48 AM

修正: Windows 11 で Snipping ツールが機能しない

iPhoneでApp Storeに接続できないエラーを修正する方法 iPhoneでApp Storeに接続できないエラーを修正する方法 Jul 29, 2023 am 08:22 AM

iPhoneでApp Storeに接続できないエラーを修正する方法

C# の Array.Sort 関数を使用して配列を並べ替える C# の Array.Sort 関数を使用して配列を並べ替える Nov 18, 2023 am 10:37 AM

C# の Array.Sort 関数を使用して配列を並べ替える

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决

PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 Jun 27, 2023 pm 01:48 PM

PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法

PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 Jun 26, 2023 pm 01:41 PM

PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法

PHPのarray_fill()関数の使い方の詳しい説明 PHPのarray_fill()関数の使い方の詳しい説明 Jun 27, 2023 am 08:42 AM

PHPのarray_fill()関数の使い方の詳しい説明

See all articles