正規化された形式の文法モデルがある場合 (すべてのルールは次のようになります):
LHS = RHS1 RHS2 ... RHSn ;
および言語の prettyprinter (たとえば、AST からテキストへの変換ツール) を使用すると、これらのいずれかを非常に簡単に構築できます。
ユニットツリーとして目標シンボルから始めるだけです。
Repeat until no nonterminals are left:
Pick a nonterminal N in the tree;
Expand by adding children for the right hand side of any rule
whose left-hand side matches the nonterminal N
値 (変数名、数値、文字列など) を運ぶ端末では、ランダムなコンテンツを生成する必要があります。
上記のアルゴリズムの複雑な点は、明確に終了しないことです。実際にやりたいことは、ツリーのサイズの制限を選択し、すべての非終端記号がなくなるか、制限を超えるまでアルゴリズムを実行することです。後者の場合、バックトラックし、最後の置換を元に戻し、別のことを試してください。これにより、決定されたサイズの AST に対する制限付きの深さ優先検索が行われます。
次に、結果をきれいに印刷します。正しく取得するのが難しいのは、かなりプリンターの部分です。
[prettyprinter を含め、これらすべてのものを自分で作成できますが、かなりの作業量です。私は、このすべての機構を言語でパラメーター化された方法で直接含むツールを作成します。私の経歴を参照してください]。
整形式の AST であっても厄介な問題は、AST が無意味である可能性があることです。整数 X の宣言を生成し、文字列リテラル値をそれに割り当てますが、それが許可されていない言語の場合です。おそらくいくつかの単純な問題を排除できますが、言語のセマンティクスは信じられないほど複雑になる可能性があります。例として C++ を検討してください。意味的に意味のあるプログラムになるようにすることは非常に困難です。本質的に、結果のテキストを解析し、名前と型の解決/チェックを実行する必要があります。C++ の場合、完全な C++ フロント エンドが必要です。