記号表の実装
実際にどのように記号表を実装するかを考えます。
記号表自体はただのディクショナリなので特に難しいことをする必要はありません。
ただ、トークンと同様にあちこちで参照されるので、やはり別ファイルのクラスとしてつくります。
まずは、記号表に キー:値 を挿入する関数を考えます。
記号表は、構文解析中の「const」や「var」の処理をする時に作成されます。
構文解析の中でわかった変数等の名前や値などを記号表作成関数に引数として渡せば記号表が作成されていきます。
具体的には以下の様な感じでしょうか。
def insert(self, name, typ, mod, val, alc, uni):
i = 0
id_len = len(name)
while i <= id_len:
id = ''
while i <= id_len: #id1, id2, id3 などの変数宣言の場合
id = id + name[i] #ひとつづつ取り出す為の処理
i = i + 1
if name[i] == ',':
i = i + 1
break
if name in symbol:
エラー:同じ名前を複数回定義しようとしていませんか?
if name in self.token.keyword:
エラー:予約語は変数名などに使えませんよ!
symbol[name] = {type:typ, mode:mod, value:val, alloc:alc, units:uni}
こんな感じかな?
まだ、例の「self」とかはちゃんとしていないけど、処理の流れはこれでOKだと思う。
あと、細かいメソッドをいくつか作れば記号表クラスは完成するでしょう!