【问题标题】:Show custom errors while parsing Happy Haskell在解析 Happy Haskell 时显示自定义错误
【发布时间】:2016-05-05 20:29:28
【问题描述】:

我正在用 Haskell 中的 Alex 和 Happy 编写一元解析器。

我的错误函数是这样定义的:

parseError :: Token -> Alex a
parseError _ = alexError "error occurred"

如何在解析期间发送自定义错误(例如尝试将字符串添加到数字时的类型不正确)?


更新

解析器不需要进行类型检查,因为我跟踪操作数类型,所以我在生产中进行检查。 正如评论中所说,我不能使用parseError,那么有没有办法打印错误并停止解析器?

【问题讨论】:

  • 只需将与"error occurred" 不同的字符串传递给alexError...?
  • 好的,但是我需要从我的生产规则中传递字符串,而parseError 函数只需要一个Token 参数,而不是我想要的任何字符串
  • 我承认我对alex或happy不是很熟悉,所以如果这是一个愚蠢的问题,请原谅我,但是:如果parseError没有做你想做的,为什么不改变@ 987654328@,或者完全避免使用它来支持alexError 功能,它确实可以满足您的需求?
  • 嗯,parseError的定义是这样的,因为这是Happy想要的定义,所以我不能改变它。我也不能直接使用alexError,因为它返回一个Alex a类型,而我只需要停止解析打印错误
  • “在尝试将字符串添加到数字时喜欢不正确的类型” - 解析器不是类型检查器,Happy 不会提供任何轻松将其转换为类型检查器的功能。如果你想对你的语言进行类型检查,你应该把它解析成一个无类型的版本,然后进行类型检查。如果你真的必须走这条路,那么你生产中的代码(例如“添加”规则)必须实现类型检查 - parseError 不会这样做。

标签: parsing haskell happy


【解决方案1】:

我已经通过实现这个功能解决了:

fatalError :: (Show a1, Show a) => [Char] -> a -> a1 -> t
fatalError s l c = error ("Error at line " ++ (show l) ++ " column " ++ (show c) ++ ": " ++ s)

当检测到错误时,我从生产中调用它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多