エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

計算機、のパーサ

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