流行には乗っておく主義(ぉ
Haskellが良いらしい。なんか完成したらバグが無いらしい(そんなことは無い)。それに今はやりだし、というものすごく三日坊主になりそうな動機で、勉強がてら純粋関数言語の世界に触れてみたり。
で、題材はやっぱりSHIORIなわけですが。
まずは1行パーサでお勉強。最初はこれをなんとかしてみる。
1:Hello,World!!
なんか里っぽい軟弱記法なのは気にしない方向で。えーと今はGHCを使ったプログラムなんですが、最初から日本語を扱うのは色々とハードルがあるらしいので‥‥(^^;
さて、この構文に含まれるルールは以下の通り
- 「トーク」は「トーク属性」「セパレータ」「トーク本体」で構成される
- 「トーク属性」は、1または2が含まれる文字列
- 「セパレータ」は、任意の空白+[:]+任意の空白
- 「トーク本体」は、任意の文字列
で、これをParsec, 高速なコンビネータパーサとか参考にHaskellっぽくしてみる。
parse1.hs
module Main where import Text.ParserCombinators.Parsec talk :: Parser String talk = do attr <- talkAttrs talkSeparator body <- talkBody return ("attr=[" ++ attr ++ "] body=[" ++body ++"]") talkAttrs :: Parser String talkAttrs = many1 talkAttr talkAttr :: Parser Char talkAttr = do char '1' <|> char '2' talkSeparator :: Parser () talkSeparator = do many space char ':' many space return () talkBody :: Parser String talkBody = do many anyChar 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
さて、GHCでこれを実行するときは「ghci parse1.hs」とかやってから、「run talk "1:Hello,World!!"」とすれば、ちゃんとパースして"attr=[1] body=[Hello,World!!]"なんて文字列が帰ってきますねぇ。
‥‥まあ、この先はとっても長い道のりな気がするんですが、その辺は気にしない方針で進めてみよう(^^;