分析器错误

解析的错误处理完全在IO中完成。错误作为异常抛出,然后由TCM monad捕获。这有两个缺点:

  • 抛出错误的代码部分(ParseError`类型)与捕获错误的代码(仅捕获ParseError`类型的异常)。然而,这种耦合并没有反映出来在类型上。
  • 解析过程中产生的所有错误都必然是致命的。也就是说,不可能生成警告,然后进行类型检查。

建议的解决方案:

  • 创建一个Parser monad(我们称之为ParserM,类型为ParserMa=ExceptT-ParserError(WriterT[ParserWarning]a)
    • 注意变压器的顺序:我们希望恢复警告,即使我们也会收到错误。
  • 编写一个函数liftParse::ParserM a->TCM a,该函数:
    1. 输出解析产生的警告(如果有)。
    2. 如果解析导致ParseError(即未返回“a”),则失败并返回错误。

用例:

目前,唯一的用例是在一个文本文件中跨越多个代码块的注释。这是一个错误现在,但它不是必须的。唯一导致问题的情况是在呈现有文字的文件时使用LaTeX或HTML后端。在这种情况下,注释标记将与它重叠的识字文本分开呈现。

页面上次修改时间:2016年10月10日下午01:36
技术支持PmWiki