言語仕様書き直し

http://d.hatena.ne.jp/hoge1e3/20071023 に書いたサンプル言語の言語仕様はS式で読みづらいので,もうすこし理解可能な形に整理した(azuki からはまだ読めないけど)

program := empty | stmt program
stmt := decl | let | typedef
typedef := 'type' name '{' decls '}'
    nameOf(typedef) = name
    ownerOf(decls) = typedef 
decls := empty | declseq
declseq := decl decls
    ownerOf(decl)  = ownerOf(declseq)
    ownerOf(decls) = ownerOf(declseq)
decl := 'var' name 'as' type
   typeOf(decl) = type
   nameOf(decl) = name
let := var '=' val
  constraint
     typeOf(var) = typeOf(val)
val := num | str | var
num := [0-9]+
   typeOf(num) = int
str := "[^"]*"
   typeOf(str) = String
var := name '.' name_2
   typeOf(var) = typeOf(v)
      where nameOf(v) = name_2 && ownerOf(v) = w
        where nameOf(w) = name && ownerOf(w) = undefined

たとえば,

decl := 'var' name 'as' type
   typeOf(decl) = type
   nameOf(decl) = name

は,

var c as int

みたいな変数宣言の文法.仮にこの変数宣言がソースファイルに出現したとすると.

   typeOf(decl) = int
   nameOf(decl) = c

という式が成立する.ここでdecl は,この変数宣言をあらわす構文木そのものを指す.