编译器构造阅读笔记(4)
<expression> -> <factor> {<add op> <factor>}
在 《编译器构造:C语言描述》中,ID 的含义应该是 identifier,而不是 identity,在这里纠正一下我原先的错误理解。
在这个基础上,重新复习自己对于 CFG 的理解,老实来说,这个式子一开始让我怀疑教科书出现了错误。
一个“产生式”的左部,对应了三个不同的右部,这在我最开始的理解里面,就类似于
番茄的颜色 -> 红色
番茄的颜色 -> 粉色
番茄的颜色 -> 绿色
换而言之,我以为出现了“一词多义”的情况,这样的话,在编译器按照规则翻译的时候,就难免出现错误,出现误差。
可是在再次回顾之后,我意识到了自己的错误:归根打底,是搞错了因果关系。
教科书里面有一句晦涩难懂的话语:非终结符也可以由它们出现在产生式的左部来识别。所有非终结符必须根据它作为左部的产生式来替换或者重写。相反,终结符从来不被改变或者重写。
其实,这句话就是说明,所有 CFG 中,左边的部分,实际上是右边规则归纳总结的结果
具体的话,我们可以参照如下的案例
中国人 -> 旅居海外,没有放弃中国国籍的人
中国人 -> 居住于国内,拥有中国国籍的居民
(尽管可以凝结成一句话,但是出于理解的需要,我拆成两句)
换而言之,CFG 并不是说明“左边产生了右边”(尽管 A -> B C D 非常给人这种误导),而是说,右边的内容可以归纳为左边的范畴。
作为对自己错误理解的修正,而记录于此。