フィールド名変更機能の自動生成
先日の続き.プログラムの元の意味を変えずに,フィールド名変更を行う機能ができた.
http://www2.eplang.jp/tonyu/adaptive/AdaptiveParser071025.zip
(zip解凍後,test.batを起動すれば一応動きます)
Before Refactoring:
type String {} type int {} type Coord { var x as int // ここの'x' を 'aaa' に変更,というRefactoring をする var y as int } type Equa { var x as int var expr as String } var c as Coord var d as Coord var e as Equa c.x=3 c.y="cde" e.x=c.y d.x=c.x e.expr="abc"
After Refactoring:
type String {} type int {} type Coord { var aaa as int // x -> aaa var y as int } type Equa { var x as int // このxは変化しない var expr as String } var c as Coord var d as Coord var e as Equa c.aaa=3 // x -> aaa c.y="cde" e.x=c.y // このxは変化しない d.aaa=c.aaa // x -> aaa e.expr="abc"
原理
先日の文法定義に,次のような部分があった
(eq (typeOf (varRef _target _name)) (typeOf (select var from Var where (and (assertEq (nameOf var) _name) (assertEq (ownerOf var) (typeOf _target)) ) )) )
これをもうちょっとくだくと
"_target._name" という形式の変数参照式の型 はフィールド var の型に等しい.
ただし,var とは,名前が _name で,varの所属する型と _target の型が 等しいような varである
例をあげると
"c.x" の型は フィールド var の 型に等しい.
ただし,var とは 名前が 'x' で, varの所属する型が c の型 (つまり,Coord)と等しいものである
一方
type Coord { var x as int var y as int }
という型(構造体)宣言の "var x as int" において,次の知識が生成されている:
- ($result isa Var)
- (nameOf $result)->x
- (typeOf $result)->int
- (ownerOf $result)->Coord
日本語にすると
- $result (= 'var x as int' のセマンティクス) は Var(フィールド) である
- $result の 名前は 'x' である
- $result の 型は int である
- $result の 所属する型は Coord である
ここでポイントは
"c.x" の型は フィールド var の 型に等しい.
ただし,var とは 名前が 'x' で....
の'x' と
- $result の 名前は 'x' である
の'x' は,文字列の中身は一緒だけど,「出身地」が違うというところ.
前者は c.x の x だし,後者は var x as int の x.
これを使って,出身地の違うもの同士に紐付けを行っていく...という流れなんだけど説明ぜんぜんできてないなあ.