秒差距负匹配
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
已经负责将您的输入流重置为之前的状态
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
已经负责将您的输入流重置为之前的状态