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!!]”なんて文字列が帰ってきますねぇ。
‥‥まあ、この先はとっても長い道のりな気がするんですが、その辺は気にしない方針で進めてみよう(^^;