Parsecを使ってパーサを作ってみる。今のところ単純に要素を読み出しただけ。
Elemの定義は昨日と一緒。
import Text.ParserCombinators.Parsec -- 数値パーサ number :: Parser Elem number = do ds <- many1 digit return $ Value $ read ds -- 演算子パーサ plus = do { char '+'; return Plus } minus = do { char '-'; return Minus } times = do { char '*'; return Times } divide = do { char '/'; return Divide } -- 要素パーサ element = (plus <|> minus <|> times <|> divide <|> number) -- 数式パーサ(逆ポーランド表記) expression :: Parser [Elem] expression = many1 elements where elements = do e <- element many space return e
昨日のcalcと組み合わせると、一応、計算機。相変わらず逆ポーランド表記。
main = do line <- getContents case (parse expression "" line) of Left e -> print e Right x -> print $ calc x