Haskell 使Parsec函数失败,而不是期望更多的输入

Haskell 使Parsec函数失败,而不是期望更多的输入,haskell,parsec,Haskell,Parsec,我正在使用Parsec解析一些表达式(有关更多上下文,请参阅),我的代码中最相关的部分是: statement :: Parser Stmt statement = assignStmt <|> simpleStmt assignStmt :: Parser Stmt assignStmt = do var <- identifier reservedOp "=" expr <- expression return $

我正在使用Parsec解析一些表达式(有关更多上下文,请参阅),我的代码中最相关的部分是:

statement :: Parser Stmt
statement = assignStmt <|> simpleStmt

assignStmt :: Parser Stmt
assignStmt =
    do var  <- identifier
       reservedOp "="
       expr <- expression
       return $ Assign var expr

simpleStmt :: Parser Stmt
simpleStmt =
    do expr <- expression
       return $ Simple expr
语句::解析器Stmt
语句=assignStmt simpleStmt
assignStmt::解析器Stmt
转让STMT=

do var您缺少
try
功能

默认情况下,
操作符将尝试左解析器,如果失败而不使用任何字符,它将尝试右解析器

但是,如果——就像您的情况一样——解析器在使用了一些字符后失败,并且从未尝试过正确的解析器。请注意,这通常是您想要的行为;如果你有

parseForLoop <|> parseWhileLoop
parseForLoop parseWhileLoop
然后,如果输入类似于“
for break
”,那么这不是一个有效的for循环,尝试将其解析为while循环也没有意义,因为这肯定会失败


try
combinator会更改此行为。具体地说,它使失败的解析器看起来没有使用任何输入。(这有一个空格惩罚;输入可能会被丢弃,但是
try
会使它挂起。)

我想你需要说
try assignStmt simpleStmt
。在文档中查找
try
@MathematicalOrchid,它可以工作。请将其作为一个答案发布,并对正在发生的事情进行一点描述。如果你不想浪费时间,就说-我会把它作为社区维基发布:-)