Использование Parsec для синтаксического анализа регулярных выражений

Я пытаюсь изучить Parsec, реализуя небольшой синтаксический анализатор регулярных выражений. В BNF моя грамматика выглядит примерно так:

EXP  : EXP *
     | LIT EXP
     | LIT

Я пытался реализовать это в Haskell как:

expr = try star
       <|> try litE
       <|> lit

litE  = do c <- noneOf "*"
           rest <- expr
           return (c : rest)

lit   = do c <- noneOf "*"
           return [c]

star = do content <- expr
          char '*'
          return (content ++ "*")

Здесь есть несколько бесконечных циклов (например, expr -> star -> expr без использования токенов), что делает цикл парсера навсегда. Я не совсем уверен, как это исправить, потому что сама природа звезды такова, что в конце она потребляет свой обязательный токен.

Есть мысли?

8
задан Xodarap 26 January 2012 в 15:11
поделиться