很正常,编译原理前面的基础知识,如果做为计算理论的一部分在大学上,可能会讲 1 到 2 个月,但是在上编译原理的时候只花两周就带过了。。。。 建议参考 J. Glenn Brookshear 的 Theory of Computation,这本写得简单易懂 如果找不到上面这本书,找 Michael Sipser 的那本(有电子版)也不错.
当然有一个捷径,如果你数学有一定基础,就是直接去看 Donald Knuth 写的关于 LR parser 的原文 On the translation of languages from left to right,这文章基本是从头讲起,写得简洁易懂,从头到底看下来,弄懂 7 成,其他基本就不用看了。
引用开始: Each rule here only matches expressions at its precedence level or higher. For example, unary matches a unary expression like !negated or a primary expression like 1234. And term can match 1 + 2 but also 3 * 4 / 5. The final primary rule covers the highest-precedence forms—literals and parenthesized expressions. 引用结束
他说的 precedence rule 我明白,就是优先度的问题,比如说加减乘除,乘除高于加减。但是什么叫做 each rule here only matches expressions at its precedence level or higher?
然后到了后端,就会依赖更多的平台信息了。这个阶段,会做很多可能每个硬件平台 /操作系统都不一样的事情:如果移位真的比乘法更快,那就把合适的乘法优化成移位;不同平台的 ABI 要求调用函数或者加载全局变量时有一些额外的指令,也是在这里加上;用一个复杂指令匹配一组复杂操作;更好的分配寄存器以减少寄存器复制和内存读写;重排指令以适配流水线等等。最后吐出的指令就是真的汇编了。