【发布时间】: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不会这样做。