2016/10/22 13:00- compiler seminer [前回] 14:00 からお客さんがきて、「ユーザ関数機能の追加の準備」でおわった その準備も、不十分だったので、実質、「前回はなかった」事にして、 今回は、前々回の続きから... [前々回] ユーザ関数機能の追加準備を行った 準備が足りない 「型」の問題 「3 % 2」は適切な式だが 「3.0 % 2.0」は不適切な式になる why ? : % (余りを求める演算子) は、整数同士のみ意味がある 実は、変数の導入の時にも、問題があった 「定数」は、型の情報をもっている # 「3」は、(数の) 3 という「値」と、「整数」という型を持つ # 「3.0」は、(数の) 3 という「値」と、「浮動小数点数」という型を持つ # 「型」: 「値の集合」、「その上の演算」の対(数学上の「空間」) 構文上、「型」の情報をどうあつかうか ? 構文規則で、その情報を利用する ( 現在の calc がそうなっている) calc.y の mixed_expression と expression の違い 構文要素が型情報をもっている 型がマッチしていないと構文エラーになる !! エラーは構文でチェックしたい !! 構文エラーは、その場判断される 意味規則で、その情報を利用する 構文上では、型を観ることができない 型誤りを構文チェックで検出できない 意味エラーでチェックする !! 意味エラーは、先をよまないと解らない ! 構文エラーは、コンパイル時に、その場でチェックできる ! -> エラー発見が容易 ! -> コンパイラは、できるだけ、こうする(選択の余地がない) ! 意味エラーは、後になって、矛盾検出時 or 実行時にチェックする事になる ! -> 柔軟性がでてくる ! -> インタープリター、こちらでもよい 元 calc 式を直に値に変換 今 calc 式の構文木を作り、それを評価して、値を計算する 構文木(構文規則)と値の計算(意味規則)が分離した結果 「構文木」が再利用できる ユーザ定義関数の可能性が生れた ユーザ定義関数の設計 ユーザ定義関数は、引数は一つにする 実引数は一つで、() の中にいれる -> 構文規則 仮引数(引数変数)は、「$1」にする 関数名は大文字 関数定義 関数名 := 式 ( $1 を含む[場合もある] ) 具体例: 関数定義の例 : A := $1 + 3 関数使用の例 : A(5) -> 5 + 3 -> 8 コーディング # ビデオ参照