質問
私は正式な言語について疑問に思っています。私は一種のパーサーを持っています:それはàxmlのようなシリアル化されたツリー構造を読み取り、それを多桁のアレイに変換します。
私のポイントは、使用されているアルゴリズムと異なる種類のオートマトン(ステートマシンのチューリングマシンスタック...)の類似点です。
質問は、ここで暗黙のうちに使用しているオートマトンはどれですか?そして、再帰はどうですか?
「オートマトンは暗黙的に使用する」という意味です。「同じジョブを行うための最小限のオートマトンです」です。
これが完全なソースです:
$ words; // XMLタグの配列 'u003Ctag> '、'u003C/tag> 'そしてシンプルなテキストコンテンツ
$ tree = array( 'type' => 'root'、 'sub' => array());
$ ptree = array(&$ tree);
$ deep = 0;
foreach($ words as $ elem){
if ( preg_match($openTag, $elem) ) { // $elem is an open tag
$pTree[$deep++]['sub'][] = array( // we add an element to the multidim array
'type' => 'block',
'content' => $elem,
'sub' => array()
);
$size = sizeof($pTree[$deep - 1]['sub']);
$pTree[$deep] = &$pTree[$deep - 1]['sub'][$size - 1]; // down one level in the tree
} elseif ( preg_match($closeTag, $elem) ) { // it is a close tag
$deep--; // up in the tree
} else { // simple element
$pTree[$deep]['sub'][] = array(
'type' => 'simple',
'content' => $elem
);
}
}
解決
もう一度質問を見てください。あなたはaを参照しています $words
変数、これはあなたの例にはありません。また、コードはありません。何が行われているのか分からないと、あなたに答えるのは難しいです。
変数の名前から判断します $deep
, 、おそらく国家ではありません。オートマトンの状態は、オートマトンに固有のセットの要素です。 $deep
深さ、正の整数が含まれているように見えます。繰り返しますが、コードなしでは伝えるのは難しいです。
とにかく、あなたはおそらく、コードを実装として設計しなかった場合、「暗黙的にオートマトンをまったく使用していません」。
あなたのシンプルなXMLのようなファイルは、おそらく決定論的なスタックマシンによって認識されるか、決定論的なコンテキストフリーの文法によって生成され、チョムスキー階層のタイプ-2になります。繰り返しになりますが、これは単なる推測であり、「XMLのようなシリアル化されたツリー構造」は、あらゆる種類の形式ではあいまいです。
要するに、正式な理論を使用しようとしている場合は、質問をより正式に語ってください。
編集(コードを確認した後):
あなたは木を作っています。これは、オートマトン(少なくとも「標準」のもの)の手の届かないところにあります。有限オートマトンは入力と状態でのみ動作し、スタックマシンがスタックを追加し、チューリングマシンには両方向に移動できる読み取りワイトテープがあります。
オートマトンの「出力」は、単純な「はい」(受け入れられている)または「いいえ」(受け入れられていない、または無限のループ)です。 (チューリングマシンを定義して、テープでより多くの出力を提供することができます。)「同じジョブを行うための最小限のオートマトンです」に答えることができる最善のことは、スタックマシンで言語を受け入れることができることです。しかし、それは非常に異なって機能し、木を与えません。
ただし、調べることができます 文法 - の概念を紹介する別の正式な言語構成 解析ツリー。ここでやっていることは、トップダウンパーサーを備えたそのような解析ツリーを作成することです。