Haskell 使Parsec函数失败,而不是期望更多的输入
我正在使用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 $
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,它可以工作。请将其作为一个答案发布,并对正在发生的事情进行一点描述。如果你不想浪费时间,就说-我会把它作为社区维基发布:-)