把 12+3 切成有意义的小块,你会切成几块?
计算机原理 · 小纸条
选一章打印。双面打印(按长边翻页)后沿虚线剪开,每张卡片正面题目、背面答案。
x = 9 会切出哪几个 token?各是什么类型?
7 * 2(中间很多空格)切出几个 token?
读到 4、5、+、6,数字 token 会怎么分?
if 和 ifs,哪个是关键字,哪个更可能是普通名字?
a == b 里,中间应该切成一个 token 还是两个?
把 12+ab 这串字符按分词器的规则切开,会得到哪几个 token?
5 + 6 # 这是加法 会生成几个 token?
假设某语言不认识 ?,那 3 ? 4 会在哪一站先出错?
5 * (乘号后面没东西)为什么不合语法?
参考答案(家长):x(名字)、=(符号)、9(数字),共 3 个。
参考答案(家长):3 块,12、+、3。
参考答案(家长):45 是一个数字 token,+ 是符号,6 是另一个数字 token。
参考答案(家长):3 个,7、*、2,空格被跳过。
参考答案(家长):一个 token ==(表示相等),不能拆成两个 =。
参考答案(家长):if 是关键字,ifs 是普通名字(标识符)。
参考答案(家长):3 个,5、+、6,注释被整段跳过。
参考答案(家长):三个:数字 12、符号 +、标识符 ab。
参考答案(家长):乘法需要左右各一个数,右边缺了一个,规则不满足。
参考答案(家长):词法分析(分词)这一站,遇到不认识的 ?。
按"表达式 = 数字 | 表达式 + 表达式",1 + 2 + 3 合法吗?
语法分析的输入是什么?输出是什么?
解析树很详细,这是优点还是缺点?
画出 8 - 2 的 AST(说出结构即可)。
把 2 * 3 + 4 画成树,哪个运算符在上层?
算 10 - 2 * 3 等于多少?
(10 - 2) * 3 等于多少?
20 / 2 / 5 按从左到右等于多少?
为什么递归的规则能描述任意长的算式?
遍历 + 节点时,应该先算它的孩子还是先算它自己?
参考答案(家长):输入是一串 token,输出是一棵表示结构的树。
参考答案(家长):合法,可以看成 (1+2)+3,都符合规则。
参考答案(家长):根是 -,左孩子 8,右孩子 2。
参考答案(家长):都算,详细便于严格,但太啰嗦,后续会精简。
参考答案(家长):先算 2*3=6,再 10-6=4。
参考答案(家长):加号在上层,乘号在下层,因为乘法先算。
参考答案(家长):先 20/2=10,再 10/5=2。
参考答案(家长):先算 10-2=8,再 8*3=24。
参考答案(家长):先算孩子,拿到孩子的值后才能算自己。
参考答案(家长):因为规则可以不断套用自己,套多少层就能表示多长。
说一个"语法对但意思不通"的中文句子。
a = b + 2 若 b 从没出现过,会报什么错?
10 * "苹果" 在讲究类型的语言里合理吗?为什么?
执行完 n = 5 再执行 n = 8,盒子 n 里现在是几?
函数里定义的 t,函数结束后还能在外面用吗?
为什么全局变量用多了容易出问题?
里层代码能用外层定义的变量吗?外层能用里层的吗?
外层 x=1,里层又 x=9,在里层用 x 是几?出去后呢?
局部变量为什么函数一结束就没了?
函数执行完,程序怎么知道该回到哪里继续?
参考答案(家长):b 未定义(用了没定义的名字)。
参考答案(家长):开放答案,如"我把星期二涂成蓝色的"。
参考答案(家长):8,后一次覆盖了前一次。
参考答案(家长):不合理,数字乘一段文字没有明确意义,会报类型错误。
参考答案(家长):谁都能改它,出错时很难找出是哪段代码改坏的。
参考答案(家长):不能,局部变量出了那段代码就失效。
参考答案(家长):里层是 9;出了里层,外层的 x 仍是 1。
参考答案(家长):里层能用外层的;外层不能用里层的。
参考答案(家长):调用时已经记下了返回位置,结束后照着回去。
参考答案(家长):因为它们放在函数的栈帧里,栈帧被收走它们就消失。