top page > computer > haskell > web_lecture > for_programmer > parser_calculator.html
更新日:
文責: 重城良国

パーサ: 計算機

仕様

整数の四則演算のみを扱う。演算子の優先順位は考慮しない。必ず丸括弧を使う。

演算子のパース

type Op = Integer -> Integer -> Integer

op, ad, sb, ml, dv :: Parse Op
op = ad `alt` sb `alt` ml `alt` dv
ad = char '+' `build` const (+)
sb = char '-' `build` const (-)
ml = char '*' `build` const (*)
dv = char '/' `build` const div

*Main> :reload
*Main> fromJust (parse op "+") 9 4
13
*Main> fromJust (parse op "-") 9 4
5
*Main> fromJust (parse op "*") 9 4
36
*Main> fromJust (parse op "/") 9 4
2

式のパース

expr :: Parse Integer
expr = (term >*> op >*> term) `build` \((x, o), y) -> x `o` y

項のパース

term :: Parse Integer
term = number `alt` (char '(' *> expr >* char ')')

計算機

*Main> :reload
*Main> expr "3*(5-2)"
[(9,"")]
*Main> parse expr "3*(5-2)"
Just 9

計算機として使いやすい関数calcを定義しておく。

calc :: String -> Maybe Integer
calc = parse expr

*Main> :reload
*Main> calc "3*(5-2)"
Just 9

まとめ

単純なパーサコンビネータを定義した。実行効率の問題で実用的ではない。プロトタイプを簡単にきれいに書ける。関数listとlist1は相互再帰の美しい例だ。

「数の並びのパーサ」へもどる 「列挙型」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics