Parsec-Haskell,格式化解析错误

Parsec-Haskell, formatting parse errors

我正在开发一个简单的计算器,它接受一行输入,使用 parsec 对其进行解析,然后对其进行处理。

我想缩小 parsec 解析错误消息。它们包括单行输入不需要的位置信息。我试过使用 <?> 但它并不能完全满足我的要求。

尝试找出解析错误的原因并没有得到好的结果。

为不匹配的括号指定错误的一些方法,或者只是一个 syntax error 消息会很好。

您可以使用来自 Text.Parsec.ErrorerrorMessagesmessageStringerrorPossourceColumn 函数获取错误消息和错误源位置.

这是取自 this blog post 的示例。它演示了<?>的使用,并使用上面提到的函数来自定义错误处理:

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 "("