Haskellで処理系のテストを書く
言語処理系って幾層になっているが各入力と出力を一つのテストケースで書きたい、みたいな欲求がある
引数に欲しい物
テスト名
input ~ evaledの6項目
難点
これは、lexer, parser, evalもろもろがすべて揃っている状況が想定されている
単体のテストが出来ない
すべてのテストにlexerのtoken書くのダルいな
順番がわかりにくい
例えばTokenの並び順を間違えたときに、parserがエラーした感じに表示される
新しい文法などを作ったときに、コンパイラやtypeInferなどを全て実装しないとテストに落ち続ける
参考
却下
hsmain = do
it "add"
$ "1*3;"
|>> [TokenInt 1, TokenTimes, TokenInt 3, TokenSemicolon]
|>> Program [Exp (Mul (Nat 1) (Nat 3))]
|>> C.CInt
|>> 3
it "add"
$ "1*3;"
|>> [TokenInt 1, TokenTimes, TokenInt 3, TokenSemicolon]
|>> Program [Exp (Mul (Nat 1) (Nat 3))]
|>> C.CInt
|>> 3
it
自体が Test
に特化した関数になっている
it :: String -> (String -> [Token] -> Program -> C.Constriant -> Integer -> Test)
たぶんちがうけどこんな感じ
|>>
が本質的な意味をなしていない
無駄に冗長に書いている感じになっている
f a b c
を f a |>> b |>> c
と書いているだけ
試していないが |>>
をoverloadすれば実現はできる
却下
hs"x = 1 * 2;"
l> ["x","=","1","*","2",";"]
p> Assign "x" (Add (Nat 1) (Nat 2))
t> CInt
e> 3