itl_expr_cli 设计

设计目标

将 frontend/itl_expr 暴露为一个进程,其 JSON 报告按结果列出每个用例,使区间工具通过一次调用即可检查一个阶段的结论(“这些文件中这些操作的所有用例都可执行且通过”)。

数学背景

一个阶段是一个二元组(文件 FF,操作 OO)。运行器执行集合 {c∈cases⁡(F):O=∅∨op⁡(c)∈O}\{ c \in \operatorname{cases}(F) : O = \emptyset \vee \operatorname{op}(c) \in O \},并报告该集合划分为通过、失败、不支持和诊断用例的结果(参见 itl_expr 设计)。一个阶段的严格判定为“失败、诊断和不支持三类均为空”。

设计决策

自带的小型选项解析器

本运行器不使用共享的 parse_common_options:它既没有分片,也没有文本模式,因为 ITF1788 文件较小,工具改为并行运行各阶段。它自行解析 --strict-supported、可重复的 --operation 以及路径,并拒绝其他所有选项,因此拼错的选项永远不会静默地改变一个阶段。

JSON 给出列表,而不仅是计数

除计数器外,报告还列出带消息的 failedIds、unsupportedIds 和 diagnosticIds。区间失败通常很少,而复现需要确切的用例;列出它们使报告自成一体。

诊断总是判为失败

前端的 success() 已经会在出现诊断用例时判为失败;本运行器只增加对不支持用例的严格检查。固定版本语料中的不可读数据绝不是可以接受的排除项。

正确性 / 不变式

  • 退出码 0 意味着没有失败用例和诊断用例,在严格模式下还意味着没有不支持的用例。
  • totalCases = executableCases + unsupportedCases + diagnosticCases 且 executableCases = passedCases + failedCases。
  • 列出的 id 恰好是每一类中的用例,按执行顺序排列。

被否决的替代方案

  • 分片。 对于只有几千个用例的语料没有必要。
  • 目录展开。 各阶段显式列出文件名(interpreter_stages.json),这使结论保持精确。

边界

  • 精度固定为前端的默认值(53 位)。
  • 不支持反向运算、字符串转换或信号(适用前端的边界)。
  • 没有文本输出模式。