フィールド名変更機能の自動生成

先日の続き.プログラムの元の意味を変えずに,フィールド名変更を行う機能ができた.

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.

これを使って,出身地の違うもの同士に紐付けを行っていく...という流れなんだけど説明ぜんぜんできてないなあ.