記号表
symbol table
名前表、辞書、環境ともいう
束縛の集合
プログラマが付けた名前が何を指しているかなどを表す表を作る
項目の例
名前
ex. hoge, piyo
何の名前か
ex. 変数、配列、関数、自作型
型
ex. int, string, array
語長
ex. 1byte, 4byte, 8byte
種別
ex. global, local, 仮引数
記憶域
その他
インデント、ブロックのレベル
割り当てられた番地
相対番地、絶対番地
その変数がconstなのかletなのか
記号表の構造をどうするか
無難にただのテーブルにすると起こりうる問題点
複雑になりがち
記号によって全ての項目が必要なわけではない
無駄が生じる
記号の長さに30文字まで許容しておいたとしても全ても記号が30文字使うわけではない
記号表の更新
新しいスコープに入る毎に記号表を更新する
前の記号表$ \sigma_0から、$ \sigma_1=\sigma_0+\{a:\mathrm{int},\;b:\mathrm{string}\}などになる
記号表の中の記号がかぶった場合は、より新しい方のものを優先する
スコープから抜けたときは、その記号表を破棄する
$ \sigma_1を破棄して$ \sigma_0を見るように戻る
関数型の場合は再代入がないのでここで容易に$ \sigma_0に戻ることができる
手続き型の場合で、破壊的代入をしている場合は、記憶するなどの必要がある
参考