0

パターン指向ソフトウェア アーキテクチャのパイプとフィルタ アーキテクチャ パターンについて読んでいます。ここでは、コンパイラの設計を知らなくても構いませんが、著者はコンパイラの設計で例を挙げました。私はそれのほとんどをフォローしましたが、フォローを理解するのが難しいです。

コンパイラー設計と同様に、スキャナー、パーサー、意味解析、中間コード生成、バックエンド (MIPS バックエンド、Intel バックエンドなど) などのさまざまなフェーズがあります。

ここで著者は、パーサー、意味解析、中間コード生成などのフロント エンド ステージについて言及しました。バックエンドはMIPSバックエンドです。

以下はテキストスニペットです

パーサーからセマンティック アナライザーに渡される抽象構文ツリーを明示的に構築しないことにします。代わりに、セマンティック アナライザー (sa) とコード ジェネレーター (cg) の呼び出しを yacc の文法規則に埋め込みます。

addexpr  : team
         | addexpr '+' term
           { sa.checkCompat($1,$3); cg.genAdd($1,$3);}
         | addexpr '-' term
           { sa.checkCompat($1,$3); cg.genSub($1,$3);}

上記のテキストに関する私の質問 1.「抽象ツリーを明示的に構築しない」という著者の意味は何ですか? 2. 上記の文法規則を理解する必要があるだけですが、それは何をしているのでしょうか? 私は言語を設計していないので、パターンを理解する必要があります。上記の例をよく理解していれば、パターンを効果的にたどることができますか?

お時間をいただきありがとうございます。

4

3 に答える 3

1

@MortenJensen が最初の質問に答えてくれたと思います。

Web 開発を行ったことがある場合は、おそらくパイプラインが何であるかを既に知っているでしょう。Web サーバーでのリクエスト処理を想像してみてください。入力 (行内の前のモジュールの出力) を解析する独立したモジュールの行があり、最後のモジュールは出力 http 応答を生成します。(サーバー オブジェクトに変換された http 要求に変換された tcp パッケージ、要求が解析され、応答サーバー オブジェクトが作成され、オブジェクトが html にレンダリングされ、html が http 応答にラップされ、tcp パッケージにラップされます)。

同じことがコンパイラについてです。それはあなたのソースコードを取得し、いくつかの結果的な変換の後、実行可能ファイルを取得します. これはパイプライン パターンのかなり良いサンプルですが、主な問題から注意をそらす可能性のあるような詳細は含まれていない可能性があります。

于 2012-10-05T18:15:26.403 に答える
1

Morten Jensen が文法の解釈に関する質問に答えたと思います。さらに、私は推測しています:

  • sa.checkCompat が参照している - セマンティック アナライザー、2 つのオペランドの互換性を確認する
  • cg.genAdd が参照している - コード ジェネレーター、2 つのオペランドを追加するコードを生成する

著者が指摘している主な点は、コンパイル、SA、および CG の「次の」段階への呼び出しが解析段階内で呼び出されることです。つまり、セマンティック分析とコード生成を実行する「前に」、パーサー ツリー全体が生成されるのを待ちません。

于 2012-10-06T06:20:52.690 に答える
0

この例は、yacc-lex/bison-flex のような語彙パーサーの文法規則のように見えます。あなたが説明しているような規則は、 BNFなどの一種の階層的な文法規則です。

あなたが投稿している「コード」は、「addexpr」と呼ばれるタイプの式の文法規則を示しています。

addexpr := term | addexpr + term | addexpr - term

これは次のようになります。

add-expression は、項または別の add-expression + 項または別の add-expression - 項です。

これらの再帰的な文法規則を使用して、言語表現を構築できます。このコード{ sa.checkCompat($1,$3); cg.genAdd($1,$3);}は、$1 と $3 で入力検証を行っているように見えます。引数 1 と 3 のように、"X + Y" では $1 は 'X'、$2='+' および $3='Y' になります。への呼び出しcg.genAddはおそらく、抽象構文ツリーに「追加」式を追加する関数呼び出しです。

つまり、ソース コードを解析しながら、一度に 1 要素ずつ抽象構文ツリーを生成していることになります。

于 2012-10-03T13:52:50.307 に答える