csnagoya の宿題の続き

そういえば,経緯を言ってませんでした.
前回のcsnagoya で,一日一言語実装するとか冗談で言ったののアレです.
経緯終わり.

ということで,みなさん大好きHaskell です.
Erlang の次に興味津々かと思います.

ふつうのHaskell しか読んでませんが,Web を教科書に頑張ってみよー.

とりあえず,この辺を参考に

haskell_parsec.html んとこ,<?> が見えてなかったので,困った.
原文を読んでわかった.

とあいえ,lexer のところまで全然わかりませんでした><

module Main where
import Text.ParserCombinators.Parsec

data Primitive = Primitive [Item] deriving Show
data Item = Item { def :: String, str :: String } deriving Show

main = do cs <- getContents
          run primitive cs

run :: Show a => Parser a -> String -> IO ()
run p input = case (parse p "" input) of
                Left err -> do { putStr "parse error at ";
                                 print err }
                Right x -> print x

primitive :: Parser Primitive
primitive = do items <- many item
               eof
               return (Primitive items)

item :: Parser Item
item = do r <- reserved
          spaces
          return r
   <|> do id <- identifier
          spaces
          return id
   <|> do sym <- symbol
          spaces
          return sym
   <|> do v <- value
          spaces
          return v

reserved :: Parser Item
reserved = do str <- ( string "MODULE"
                   <|> string "BEGIN"
                   <|> string "END" )
              return (Item str str)

identifier :: Parser Item
identifier = do a <- letter
                b <- many1 ( letter <|> digit )
                return (Item "IDENT" (concat [[a], b]))

symbol :: Parser Item
symbol = do sym <- string "("
            return (Item "OPEN" sym)
     <|> do sym <- string ")"
            return (Item "CLOSE" sym)
     <|> do sym <- string ";"
            return (Item "SEMICOLON" sym)
     <|> do sym <- string ":"
            return (Item "COLON" sym)
     <|> do sym <- string "."
            return (Item "PERIOD" sym)

value :: Parser Item
value = do char '"'
           str <- manyTill anyChar (try (char '"'))
           return (Item "STRING" str)
    <|> do n <- many1 digit
           return (Item "INTEGER" n)

これは持ち越しですね.