3

構文指向の翻訳についてサポートが必要です。文法を4倍に生成できるように、文法を因数分解する方法がわかりません。

この例を見てください:

S ::= If E then S1 else S2 

これに因数分解されます(ジャンプターゲットがわからないため)

1. <ifstmt> ::= <truepart> S2
2. <truepart> ::= <ifclause> S1 else
3. <ifclause> ::= if E then

因数分解するときの一般的なアプローチは何ですか?

4

1 に答える 1

1

通常、コードを生成する必要がある場所ですべての構文構造を分解し(if-then-elseで示したように)、パーサーの文法規則削減アクションにコード生成アクションを付加します。

これを行うことはできますが、かなり不器用なコードを取得します。基本的に、純粋な文法ではコンテキストを追跡できないため、スタックマシンを実装することになります。したがって、再帰的に構築されている(たとえば、スタックのような)と想定する必要があります。これを行うと、実際に必要な数よりも多くの、ばかげた4倍で終了します。最適化されている場合はバックエンドの時間を無駄にし、そうでない場合はバックエンドにダムコードを生成させるだけです。

ほとんどの場合、クワッドを生成しているときは、「構文指向の変換」よりもかなり洗練されたものに興味があります。この場合、ASTを構築し、シンボルテーブルを構築し、フローグラフ、場合によってはデータフローグラフを制御してから、そこから4倍を構築することをお勧めします。

次に、これらのクワッドを処理するための優れたバックエンドの構築に集中できます。

于 2012-12-18T01:24:04.330 に答える