我正在开发一个简单的计算器,它接受一行输入,使用 parsec 对其进行解析,然后对其进行处理。
我想让 parsec 解析错误消息更小。它们包括单行输入不需要的位置信息。我试过使用<?>
,但它并没有完全满足我的要求。
试图提取解析错误的原因并没有产生好的结果。
为不匹配的括号指定错误的某种方法,或者只是一条syntax error
消息会很好。
我正在开发一个简单的计算器,它接受一行输入,使用 parsec 对其进行解析,然后对其进行处理。
我想让 parsec 解析错误消息更小。它们包括单行输入不需要的位置信息。我试过使用<?>
,但它并没有完全满足我的要求。
试图提取解析错误的原因并没有产生好的结果。
为不匹配的括号指定错误的某种方法,或者只是一条syntax error
消息会很好。
errorMessages
您可以使用、和messageString
中的函数获取错误消息和错误源位置。errorPos
sourceColumn
Text.Parsec.Error
这是取自这篇博文的示例。它演示了使用<?>
和使用上述函数来自定义错误处理:
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Expr
import Text.Parsec.Error
expr :: Parser Integer
expr = buildExpressionParser table factor <?> "expression"
table :: [[ Operator Char st Integer ]]
table = [
[ op "*" (*) AssocLeft, op "/" div AssocLeft ],
[ op "+" (+) AssocLeft, op "-" (-) AssocLeft ]
]
where
op s f assoc = Infix (do { string s ; return f }) assoc
factor = do { char '(' ; x <- expr ; char ')' ; return x }
<|> number
<?> "simple expression"
number :: Parser Integer
number = do { ds <- many1 digit; return (read ds) } <?> "number"
doit str =
case parse expr "blah" str of
Left e -> do let msgs = filter (not.null) $ map messageString (errorMessages e)
let col = sourceColumn (errorPos e)
putStrLn $ "error at column " ++ show col ++ ": " ++ show msgs
Right x -> putStrLn $ "ok - got: " ++ show x
main = do
doit "3+5"
doit "5-"
doit "("