2009年4月21日作成
Alefコンパイラの中で出てくる型
いろんなところに出てくる以下の型についてのメモ。
定数の名前規則
Node
Nodeは構文木です。 Alef言語のプログラムを、主にtype, left, rightというメンバー変数で扱います。 たとえば、1+1という式の場合、およそ下記のイメージ。
Node = {
.type = OADD
.left = {
.type = OCONST
.ival = 1
}
.right = {
.type = OCONST
.ival = 1
}
式だけではなく、ifやforなどの文、adtの宣言などもすべてNodeで表します。
Type
Typeはプログラムに現れる型。 基本型の場合は単体で完結した型となります(nextがnil)。 派生型の場合は、まずポインタ(type=TIND)、配列(type=TARRAY)などで表現し、 nextにおいてその具体的な型を指します。adtなども同様。
int*の場合。
Type = {
.type = TIND
.next = {
.type = TINT
.next = nil
}
}
Sym
プログラムで現れるすべてのシンボルです。 たとえば、変数名、関数名、型名、ifやforなどの予約語。gotoラベルなど。 それぞれの違いは、lexvalメンバー変数で区別します。 変数の場合はTid, 型名はTtypename, ほか予約語ならTintやTif。
すべてシンボルテーブルに格納され、同じ名前は1つしか存在しません。 ブロック内変数の扱いは次回。 Sym.instanceとTinfoを うまく扱うことで実現しています。
{
int i, j;
{
int i; /* ここでiはブロック外のiとは別の変数 */
}
}