えちょ記

語らないブログ

流行には乗っておく主義(ぉ

Haskellが良いらしい。なんか完成したらバグが無いらしい(そんなことは無い)。それに今はやりだし、というものすごく三日坊主になりそうな動機で、勉強がてら純粋関数言語の世界に触れてみたり。

で、題材はやっぱりSHIORIなわけですが。

まずは1行パーサでお勉強。最初はこれをなんとかしてみる。

1:Hello,World!!

なんか里っぽい軟弱記法なのは気にしない方向で。えーと今はGHCを使ったプログラムなんですが、最初から日本語を扱うのは色々とハードルがあるらしいので‥‥(^^;

さて、この構文に含まれるルールは以下の通り

  1. 「トーク」は「トーク属性」「セパレータ」「トーク本体」で構成される
  2. 「トーク属性」は、1または2が含まれる文字列
  3. 「セパレータ」は、任意の空白+[:]+任意の空白
  4. 「トーク本体」は、任意の文字列

で、これを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!!]"なんて文字列が帰ってきますねぇ。

‥‥まあ、この先はとっても長い道のりな気がするんですが、その辺は気にしない方針で進めてみよう(^^;