资讯详情

META ← 测试元信息:描述与分类

📅 2026/9/18 23:33:46 | 华诺云谱 👁 阅读
META          ← 测试元信息:描述与分类
META ← 测试元信息描述与分类【免费下载链接】rocA fast, friendly, functional language.项目地址: https://gitcode.com/GitHub_Trending/ro/rocdescriptionNegative float literal typeexprSOURCE ← 被测输入源码-2.5EXPECTED ← 期望结果NIL 表示无错误NILPROBLEMS ← 诊断问题列表NIL 表示无诊断NILTOKENS ← 词法分析Lexer输出的 Token 序列Float, EndOfFile,PARSE ← 语法分析Parser产出的 ASTS-表达式(e-frac (raw -2.5))FORMATTED ← 格式化器输出NO CHANGE 表示已是最佳格式NO CHANGECANONICALIZE ← 规范化阶段产出的 CIR规范化内部表示(e-dec-small (numerator -25) (denominator-power-of-ten 1) (value -2.5))TYPES ← 类型检查后的结果(expr (type Dec))这份文件按编译管线顺序词法→解析→格式化→规范化→类型检查依次展示了 -2.5 在每一阶段的体检结果。下面我们逐阶段深入。 ## 阶段一词法分析 —— 一个 Float Token zig Float, EndOfFile,词法层面-2.5被整体识别为一个Float类型的 Token而不是负号运算符 数字两个 Token。这与普通表达式-foo形成鲜明对比——参考 unary_negation.md后者被切分为OpUnaryMinus, LowerIdent, EndOfFile三个 Token。也就是说负号紧贴在数字字面量前时负号属于字面量的一部分词法器不会为它单独产生运算符 Token。这一设计在 docs/langref/numbers.md 中有明确的语义解释负数前的减号是字面量语法与对表达式生效的一元取负运算符negate是两回事——例如-x是把一元取负运算符作用于x而-1只是一个普通数字字面量不会触发任何取负运算。阶段二语法解析 ——e-frac节点(e-frac (raw -2.5))解析器Parser把该 Token 构建为一个e-frac表达式节点raw字段保留源码原文-2.5。这里的frac即分数/小数fractional之意与整数int相对。在 src/parse/NumericLiteral.zig 中可以看到词法-解析层对数字字面量的分类pub const Kind enum(u8) { int, frac, };该文件注释明确指出数字语法在解析阶段被解释interpreted后续阶段直接消费这些解析结果不得再次解析数字 Token 文本。这正是快照中PARSE与CANONICALIZE两阶段产物彼此独立、层层递进的原因。阶段三格式化 —— 已是最佳格式NO CHANGE-2.5经过 Roc 格式化器formatter处理后不需要任何改动。从源码结构看这说明该字面量的排版负号位置、小数点、数字分布已经符合格式规范属于保持原样的稳定快照——同样的结论也出现在 float_simple.md3.14与 float_scientific.md1.23e-4中。阶段四规范化 ——SmallDecValue紧凑十进制表示(e-dec-small (numerator -25) (denominator-power-of-ten 1) (value -2.5))这是全文最核心的一行。规范化canonicalization阶段把 AST 转换成编译器的规范化内部表示CIR而e-dec-small代表small decimal紧凑小数表达式。它携带三个信息字段值含义numerator-25去掉小数点的整数分子含符号denominator-power-of-ten1分母为 10 的幂次即 $10^{-1}$value-2.5保留的原始字面量文本于是 $-2.5 -25 / 10^1$。之所以叫small是因为它的分子用i16存储。在 src/canonicalize/CIR.zig 中可以看到其定义/// Represents an arbitrary precision smallish decimal value pub const SmallDecValue struct { numerator: i16, denominator_power_of_ten: u8,numerator: i16分子为 16 位有符号整数取值范围 $[-32768, 32767]$负号直接编码在分子上所以-2.5的分子是-25符号没有丢失denominator_power_of_ten: u810 的幂次分母位数无符号 8 位。同一结构体还提供了两种实用的转换方法CIR.zig/// Convert a small dec to f64 (use for size comparisons) pub fn toF64(self: This()) f64 { const numerator_f64 as(f64, floatFromInt(self.numerator)); const divisor std.math.pow(f64, 10, as(f64, floatFromInt(self.denominator_power_of_ten))); return numerator_f64 / divisor; } /// Convert to RocDec representation (i128 scaled by 10^18) pub fn toRocDec(self: SmallDecValue) RocDec { return RocDec.fromFraction(self.numerator, self.denominator_power_of_ten); }toF64分子除以 $10^{幂次}$ 得到f64值主要用于大小比较toRocDec把紧凑表示转成完整的RocDec以 $10^{18}$ 缩放的i128定点表示说明e-dec-small是完整Dec表示的高效快路径。该结构体自带单元测试CIR.zig其中恰好覆盖了负数用例test SmallDecValue.toF64 - basic cases { // ... { const val SmallDecValue{ .numerator -500, .denominator_power_of_ten 3 }; try std.testing.expectApproxEqAbs(as(f64, -0.5), val.toF64(), 0.0001); } // ... }-500 / 10^3 -0.5与-2.5的分子-25 / 10^1是同一编码思路符号在分子、位数在幂次。阶段五类型检查 —— 默认推断为Dec(expr (type Dec))-2.5在没有上下文约束的情况下被推断为Dec类型。这与 docs/langref/numbers.md 中默认回落到DecDefaulting toDec的机制一致当数字字面量没有被任何调用点约束出具体类型时Roc 使用内建Dec作为默认——因为Dec既支持小数又能在 REPL 快速计算时给出精确答案。如果想显式指定类型可以使用类型后缀语法例如-2.5.Dec或-2.5.F64详见 docs/langref/numbers.md。源码佐证frac_test.zig中的同类用例规范化阶段的单元测试 src/canonicalize/test/frac_test.zig 与快照测试相互印证其中与负数小数直接相关的用例包括负数科学计数法frac_test.zigtest fractional literal - negative scientific notation { const source -1.5e-5; // ... try testing.expectEqual(.e_dec_small, std.meta.activeTag(expr)); try testing.expectEqual(as(i16, -15), expr.e_dec_small.value.numerator); try testing.expectEqual(as(u8, 6), expr.e_dec_small.value.denominator_power_of_ten); }-1.5e-5 -15 / 10^6分子-15同样携带负号幂次6由小数点后 1 位 科学计数法指数 5合计得出。这也解释了为何 float_scientific.md 中1.23e-4的规范化结果是(numerator 123) (denominator-power-of-ten 6) (value 0.000123)——指数部分会被折算进分母幂次。超出i16范围自动回退frac_test.zigtest small dec - exceeds i16 range falls back to Dec { const source 32768.0; // ... // Falls back to Dec because 32768 32767 (max i16). try testing.expectEqual(.e_dec, std.meta.activeTag(expr)); }【免费下载链接】rocA fast, friendly, functional language.项目地址: https://gitcode.com/GitHub_Trending/ro/roc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。