带 else 的 if

(每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:二元运算全加括号,语句之间用 |。) 用完整 parse

开始练习 →

块里套块

块里套块,一层层走进去 走到最里层,还记得从哪儿出来吗 (每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:

开始练习 →

补全:block

(每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:二元运算全加括号,语句之间用 |。) 补全 block:

开始练习 →

补全:if 和可选的 else

(每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:二元运算全加括号,语句之间用 |。) 补全 stmt 里

开始练习 →

补全:while

(每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:二元运算全加括号,语句之间用 |。) 补全 stmt 里

开始练习 →

一条语法错误该说什么

对写代码的人最有用的语法错误信息是【0】。

开始练习 →

位置从哪来

报错里的「第 2 行第 1 列」,parser 是从【0】拿到的。

开始练习 →

expect 抛出的那一句

(每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:二元运算全加括号,语句之间用 |。) let = rat

开始练习 →

文件结尾也是一种「遇到」

(每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:二元运算全加括号,语句之间用 |。) 贯穿源码最后一句漏

开始练习 →

补全:让 expect 报错

(每道题开头都有同一段:T() 是上一站 lexer 的替身——源码里 token 之间用空格分开,它切成 (kind, text, line, col);show() 把树写成一行:二元运算全加括号,语句之间用 |。) 补全 expect

开始练习 →