本文参考了《从零开始写个编译器吧》,《编译原理思路》,《状态机实现方法》等文章。
感谢这些大佬们对知识的无私奉献。
自己思考总结与实践。
编译器本身是一个程序,这个程序能将一种代码(源代码)翻译成另一种代码。
如果单独去看《编译原理》的书,估计大部分人都看不懂,因为太复杂了。
一般编译原理的课程会说一些:1、如何表示语法(BNF什么的)2、词法分析,用什么有穷自动机和无穷自动机3、语法分析,递归下降法,什么 LL(k),LALR 分析。4、中间代码的表示5、代码的生成6、代码优化
细细的归纳总结一下。
- 第一步是词法分析,英文叫做Tokenizer。它的作用是读入一个一个字符,并将其合并成一个一个Token(单词)。
为什么需要词法分析?
在最开始的状态,我们手里拿着的就是一串字符组成的字符串,在处理之后,我们按照一定的“规则”分解为多个单词。
为什么要分解字符串?直接用不行么?
这很难,因为计算机比较笨,直接一长的字符串,它难以认识,分解成单词是为了降低难度。
如果是简单的字符串,比如“hello world”,那可以很简单的分解成两个单词“hello”,“world”,规则就是空格键作为分隔符。
自然语言的翻译也属于广义上的编译,从一种代码翻译到另一种代码,它相对好处理,两个单词“hello”,“world”翻译成中文”你好“,”世界“。
单词与单词基本上是一一对应的。
但是复杂一些的字符串,比如代码里常用的”3+6*(5-8/2)“,要想分解,就比较麻烦了。
也没办法提前做固定格式,因为写法的种类实在太多了。
光一个设定变量 ”int a“,前面的int可以做成固定格式,但后面的变量名就没办法了,有无数种变化。
为了解决这个分解的问题,人类想了很多办法,也诞生了不少成果,还专门制造了一个词法分析的工具,叫做lex flex。
所以在实际工作中,有两条路线来解决词法分析问题,一条是利用现有的工具lex或者flex,适合很复杂的分解规则,另一条是学会原理,自己手动编写,适合简单的分解规则。
这里我选择自己手动编写。