给编译器一张人话嘴

· 工具链

早期奇语的语法错误长这样:

解析错误: General("UnrecognizedToken { token: (3206,
  Token(110, \"结果\"), 3212), expected: [...] }")

没行号、没源码、看不懂。现在换成 rustc 风格:

语法错误:意外的标记 `结果`
  --> 第 3 行第 8 列
   3 |     变量 结果: 整数 = 1;
                ^^^^^^
  期望:<标识符> / 长度
  提示:`结果` 是 qi 的保留字,不能作为标识符名。换个别名(如 `结果值`)

关键改动

  • 把 LALRPOP 的 ParseError 翻译成带 1-based 行/列的友好消息
  • 源码行 + caret 高亮出错位置
  • 智能提示:期望 ; → 「上一行可能漏写分号」;token 是保留字 → 「换个别名」

错误信息的质量,往往决定一门新语言「能不能用得下去」。