7

私は現在、MiniJavaプログラムのタイプチェックに成功するTypeCheckerを作成しようとしています。私は過去10時間、それを見つめながら取り組んできましたが、どこから始めればよいのかさえわかりません。私はプロジェクトを時間内に終わらせることをあきらめましたが、それでもそれがどのように成し遂げられるかを学びたいと思います。MiniJavaの完全なパーサーと、抽象構文ツリーをトラバースするために使用されるクラスのセット、および2つの異なるデフォルトのVisitor、DepthFirstVisitorとGJDepthFirstが提供されます。プロジェクトを完了するために、これらの訪問者を拡大することになっています。

何をする必要があるかという非常に基本的な概念を理解しています。パーサーがキャッチできなかったコードのエラーをキャッチする必要があります。2パスでコードを実行する必要があります。最初のパスはシンボルテーブル(?)を作成し、2番目のパスはシンボルテーブルを使用してチェックします。これは正しいです?しかし、コードでこれを実装し始める場所や方法がわかりません。

これは本当に問題ではないことを私は理解しています.......しかし、どんな種類のガイダンスや助けも大歓迎です。私のクラスには、私とまったく同じボートに乗っている友人が何人かいます。

ありがとうございました!

4

1 に答える 1

6

あなたの言語はJavaに似ているので、より一般的な型推論の代わりに単純な型伝播を行うことができます。まず、新しいASTを定義する必要があります。各式には、そのタイプの注釈が付けられています。次に、各ノードに単純なルールを適用して、古いASTから新しいASTへの深さ優先(式の場合)/幅優先(ブロックステートメントの場合)変換を実行します。

  • すべての変数にはその型の注釈が付けられています。ブロック全体を最初に調べてきたので、変数が参照される瞬間までにすべての変数の型を修正する必要があります。これは、クラスフィールド、メソッド引数、およびローカルスコープの変数に適用されます。
  • すべてのリテラルはデフォルトの型を生成します(文字列は文字列、整数はたとえば32ビット整数、浮動小数点数はdoubleなど)。
  • バイナリ算術演算は、いくつかのランキングルールに基づいて暗黙のキャストを挿入します(いずれかを選択してください、それは実際には重要ではありません)
  • 三項演算子は、最初の引数がブール値であり、他の2つの引数が同じ型であるかどうかを確認します
  • ここで最も複雑なのはメソッド呼び出しです。すべての引数を暗黙的にキャストできる引数タイプを使用して、最初に可能なオーバーロードされたメソッドを取得する必要があります。競合がある場合にどうするかはあなた次第です。
  • 等々...

ステートメントに型で注釈を付けることはできませんが、式の引数の型を確認し、場合によっては暗黙的なキャストを行う必要があります。また、この段階で推論varまたはauto型指定することもできます(これは「型推論」ではなく、型伝播の特殊なケースであることに注意してください)。

于 2012-11-02T09:40:17.300 に答える