秒差距负匹配

Parsec negative match

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,这个错误就会消失。但它 'fails' 与 illegal:

...
*** Exception: (line 6, column 36):
unexpected " "
expecting letter or digit or new-line
illegal

我这样做正确吗?或者是否有另一种技术来实现否定搜索?

你几乎拥有它:

import Text.Parsec
import Text.Parsec.Char
import Text.Parsec.String
import Control.Monad

parseIdent :: Parser (String)
parseIdent = try $ do
  x <- many1 alphaNum
  void $ optional endOfLine <|> eof
  case x of
    "macro" -> fail "illegal"
    _ -> pure x

那么,为什么您的代码不起作用?

  • try 放错了地方。真正的回溯部分是在你找回你的字母数字单词 检查它不是 "macro"
  • 之后回溯
  • lookAhead这里没有生意。如果你最终得到了你想要的词,你 do 希望从输入中使用这个词。 try 已经负责将您的输入流重置为之前的状态