言語仕様書き直し
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 は,この変数宣言をあらわす構文木そのものを指す.