正規表現エンジン(失敗)

30分プログラム、その69。
正規表現をパースしようとして失敗した。

*Main> parseRegexp "A"
[Char 'A']
*Main> parseRegexp "ABC"
[Char 'A',Char 'B',Char 'C']
*Main> parseRegexp "A*"
[Many (Char 'A')]
*Main> parseRegexp "ABC*"
[Char 'A',Char 'B',Many (Char 'C')]
*Main> parseRegexp "(ABC)*"
*** Exception: "regexp" (line 1, column 3):
unexpected "B"
expecting ")"
import Text.ParserCombinators.Parsec

data Regexp = Char Char -- A
	    | Select Regexp Regexp -- F | G
	    | Connect [Regexp] -- FG
	    | Many Regexp -- F*
              deriving Show

-- parser 
pRegexp =  try pMany <|> pAtom

pAtom = pChar <|> pParen
pParen = do char '('
            r <- pRegexp
            char ')'
            return r
pChar = do c <- letter <|> digit
           return $ Char c

pMany = do r <- pAtom
           char '*'
           return $ Many r
pMain = do x <- many pRegexp;eof;return x

parseRegexp s = case parse pMain "regexp" s of
                  Left err -> error $ show err
                  Right val -> val
  • 正規表現のパースが意外と難しい。少くとも、正則言語のクラスには入ってないよなぁ
  • 本当にLL(k)でできるのかしら
  • ぬぉぉ。インデントがずれとる