2016/10/08 13:00- compiler seminer [お知らせ] 今日 14:00 からお客さん、もどってくるか ?? -> ごめんなさい [前回] ユーザ関数機能の追加準備を行った -> 本質的な事は終って 構文解析を行う(文字列から構文木を作る)部分と、 意味解析を行う(構文木から値を作る)部分を分離した。 # 以前の版は、構文木を作るはしから「食べて」いたので、「目にみえ」なかった # -> 「構文木を表現する」仕組みが必要になった # -> node.c # 逆に、意味解析の部分も作る必要がある # -> eval.c -> node.c/eval.c ができても、機能的にはかわらない -> いままでは、構文解析と意味解析が直接繋っていた -> 分かり易い -> 「直接」だと(「間接」に比べて)、柔軟性がない -> 今回の結果、分離して、間接接続されるようにした。 -> 「柔軟性:式表現(=構文木)の再利用機能」が得られた 残りの作業 再利用をする「表現」と「機能の実装」を作るだけ == [要求分析] 利用者関数を定義できるようにし、式の評価の中で、 その関数を利用できるようにする。 [設計] # 普通に、式に名前を付けて、名前で式を再利用する # -> 他に、「無名関数」や「クロージャ」を許す立場もある # -> 関数が「一級のオブジェクト」になっている # -> 「関数を操作する関数(メタ関数)が作れる」という事を意味する - 名前をどうするか # 自由に名前をつける事が可能にするのが普通 # -> 変数の所で、サボっているし、まあ、 # 一般に「シンボルテーブル」の問題なので、 # そこで、まとめてやる -> 「大文字一文字で、利用者関数とする」とする # 複数の実現方式から、どれを選ぶかが「設計」 -> 「変数と、関数を分ける」という決定をしている # 関数(定義)を「一級のオブジェクト」にしないとう決定 - 引数をどうするか # 自由な個数で.. # -> さぼっている -> 変数の個数は、0,1,2 のいずか # node.c を変更したくない -> 変数名も $n ( n = 1, 2 ) にしてしまう - 表現 - 「関数の利用の表現」は、「関数適用」なので、 これは、「関数名(引数列)」 - 「関数定義の表現」は、 関数名 := 式(内部で、$n を許す) - エラーチェック 定義と利用で、(型[式]が)対応していない場合にどうするか ? 評価時に行う(そもそも、しない) # 「しない」:デフォルト値を設定してしまう # 未定義な関数 : デフォルト関数(0)がかえる # 少ない引数 : デフォルト値(0)が設定される # 多い引数 : 無視(利用されない) # 型の違い : 実行時にエラーになる(かもしれない) !!! 構文解析時に行う [用語] シンボルテーブル def シンボルの表 シンボルテーブルは、シンボルとその意味(値)の対応表を指す 例: 変数名のシンボルテーブル 変数名とその値の表 例: 関数名のシンボルテーブル 関数名とその定義の表 シンボル def (文字で表現された)名前