parseIdent :: Parser (String)
parseIdent = do
x <- lookAhead $ try $ many1 (choice [alphaNum])
void $ optional endOfLine <|> eof
case x of
"macro" -> fail "illegal"
_ -> pure x
Я пытаюсь проанализировать буквенно-цифровую строку, которая завершается успешно, только если она не соответствует заранее заданному значению (macro
в данном случае).
Однако следующее дает мне ошибку:
*** Exception: Text.ParserCombinators.Parsec.Prim.many: combinator 'many' is applied to a parser that accepts an empty string.
Что не имеет смысла, как many1 (choice [alphaNum])
принимает пустую строку?
Эта ошибка исчезнет, если я удалю lookAhead $ try
. Но это «не получается» с illegal
:
...
*** Exception: (line 6, column 36):
unexpected " "
expecting letter or digit or new-line
illegal
Правильно ли я поступаю? Или есть другой метод для осуществления отрицательного поиска?