csnagoya の宿題の続き
そういえば,経緯を言ってませんでした.
前回のcsnagoya で,一日一言語実装するとか冗談で言ったののアレです.
経緯終わり.
ということで,みなさん大好きHaskell です.
Erlang の次に興味津々かと思います.
ふつうのHaskell しか読んでませんが,Web を教科書に頑張ってみよー.
とりあえず,この辺を参考に
- http://sky.zero.ad.jp/~zaa54437/programming/clean/CleanBook/part2/Chap5.html
- http://kzk9.net/column/haskell_parsec.html
- http://www.wikiroom.com/sakurai/index.php?FrontPage
http://www.lab2.kuis.kyoto-u.ac.jp/~hanatani/tmp/Parsec.html←古いらしい
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)
これは持ち越しですね.