【发布时间】:2014-10-13 08:34:23
【问题描述】:
我正在使用 Parsec 解析一些表达式(有关更多上下文,请参阅 this question),我的代码中最相关的部分是:
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
在行动:
boobla> foo = 100 + ~100
167
boobla> 富
解析器错误:(第 1 行,第 4 列):
输入意外结束
期待字母或数字或“=”
第二个表达式应该计算为167,值为foo。
我认为Parsec尝试提取令牌reservedOp "="时应该失败,因为字符串中没有这样的令牌,然后尝试第二个函数simpleStmt并成功。但它的工作方式不同:它需要更多的输入并且只是抛出这个异常。
如果字符串(或当前行)中没有更多字符,我应该使用什么来使assignStmt 失败。 foo = 10 应该用assignStmt 解析,foo 应该用simpleStmt 解析。
【问题讨论】:
-
我想你需要说
try assignStmt <|> simpleStmt。查找try的文档。 -
@MathematicalOrchid,它有效。请将其作为答案发布,并简要说明正在发生的事情。如果您不想浪费时间,请说 - 我会将其发布为社区 wiki :-)