Использование 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 без использования каких-либо токенов), что делает цикл синтаксического анализатора вечным. Я не совсем уверен, как это исправить, потому что сама природаstar
является то, что он потребляет свой обязательный токен в конце.
есть идеи?