自己写:数出五类各几个
补全 tally,数出那段源码里五类 Token 各有几个,按 关键字/标识符/数字/字符串/运算符 的顺序用 / 拼起来。 let rate = 12; let msg = "hi there"; total = ra
逐字符扫描靠什么往前走
手写扫描器的主循环,靠【0】往前推进。
取完一个词之后游标该到哪
扫描器取完一个词、把它记下来之后,游标应该【0】。
忘了推进游标会发生什么
某一条分支里忘了让游标往前走,程序会【0】。
扫描器读到 >= 时该怎么办
扫描器读到 >,而它后面紧跟着 =,正确的做法是【0】。
一个字符一个 Token 会切出几个
有人偷懒,把所有运算符和数字都一个字符切一个词(标识符和字符串仍然正常取)。输出这样切那段源码会得到几个 Token。 let rate = 12; let msg = "hi there"; total = rate
自己写:取完一个完整的标识符
补全 read_ident,从下标 i 开始取一个完整标识符,返回 (词, 下一个位置)。三个位置各取一次。 玩具语言的词法规则:关键字 let if else while;标识符以字母或下划线开头;数字是连续的数位;字符串用一对双引号括起
自己写:主循环推进游标
补全 scan 的主循环:跳过空白、取标识符、其余一律单字符切,输出切出来的词数。 let rate = 12; let msg = "hi there"; total = rate >= 3;
自己写:把最长匹配加进去
在单字符切法的基础上补全 read_op:能凑出双字符运算符就取两个,否则取一个。输出三个位置各取到什么。 玩具语言的词法规则:关键字 let if else while;标识符以字母或下划线开头;数字是连续的数位;字符串用一对双引号括起来
跳空白这段代码该放在哪
扫描器里「跳过空白」那段代码,正确的位置是【0】。