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