一、编译原理的难度
编译原理特别复杂,研究的是高级语言如何翻译成汇编语言的过程。
二、编译过程中一些思路
(一)语义识别的作用
语义识别指的是把一些无关字符忽略,把一些变量名保存在一起,把用空格隔开的关键字单独放一起。
例如:
从源代码第一个字符开始遍历,如果:
1、遇到 //开头的字符,那么后面直到换行符之间的字符都是注释,就可以忽略。
2、如果遇到一个字符,它的左边是一行的开头,或者是空格,那么保存起来,继续读取直到下一个空格或者特殊符(特殊符是各种括号,各种运算符),就把这一段字符集中保存在一起。
3、判断第2步获取的字符是变量名,还是关键字。
4、遇到运算符或者括号就保存起来,作为一个单位。
5、遇到语句结束符也单独作为一个单位。
(二)语法判断的思路
1、把从语义识别过程中得到的每个单位构造成一棵树。
2、树的根是每个重新开始的语义单位,例如 var、 for、while、int等等。
3、根节点的子节点是遍历过程中出现的下一个语义单位。
4、持续第3步,直到语句结束符;的添加。
5、根据编程语言的设计规则,来判断以上构造的语法树是否合法。
也就是判断每个节点是否允许出现该子节点,例如 for节点是否允许出现 int节点?不能。for节点一般子节点是 左花括号{节点。
语法判断完成后,就能得出程序编码是否有错误。
(三)把每个语法树转成汇编语言
1、把声明和创建变量的代码替换为 分配内存空间,把变量名和内存地址号保存起来。
2、如果是循环,就建立一个子程序,名字是唯一生成的,把循环体作为子程序的内容,循环验证条件就转换成汇编的判断条件。
如果满足就调用子程序,不满足就结束子程序。
3、如果使用网络读写、磁盘读写,就调用对应的主板中断程序。
4、如果是一些运算,就用对应的汇编运算符来替代,把结果存入寄存器或者内存块中。