多くの詳細を提供しません。単純な実装 (擬似コードであっても) は、ヒントを提供するのに大いに役立ちます。
ウィキペディアから:
入力を n 文字 (a1 ... an) からなる文字列 S とします。させて
これには、単純な文字列または文字のベクトルを使用できます
文法には r 個の非終端記号 R1 ... Rr が含まれています。
非終端記号を bools std::array nonterminal {}; の配列に格納します。次に、文字があるので、文字に対応する位置を true で初期化できます。
非端末[static_cast('C')] = true; ターミナルでも同じことを行うと、非常に高速な検索メカニズムが得られます。
この文法には、開始記号のセットであるサブセット Rs が含まれています。P[n,n,r] をブール値の配列とします。P のすべての要素を false に初期化します。for each i = 1 to n 各単位生産量 Rj -> ai set P[i,1,j] = true for each i = 2 to n -- 各 j = 1 to n-i+1 のスパンの長さ - - 各 k のスパンの開始 = 1 から i-1 -- 各プロダクション RA のスパンの分割 -> RB RC if P[j,k,B] and P[j+k,ik,C] then set P[ j,i,A] = true P[1,n,x] のいずれかが true の場合 (x はセット s に対して反復処理され、s は Rs のすべてのインデックス)、S は language のメンバーである、そうでない場合、S はメンバーではない言語の
その後、アルゴリズムはかなり単純に見えます。タイトなループ内で一時的な値を初期化しないようにしてください。問題ありません。