编译原理初级入门--词法分析,创建状态机(一)

本文介绍了编译器中的词法分析原理,包括为何需要词法分析、如何进行词法分析。重点讲解了通过静态代码方式实现确定有限状态自动机(DFA)的过程,探讨了两种实现状态机的不同方法及其优缺点,并分享了手动编写词法分析器时遇到的常见问题及解决方案。
摘要由CSDN通过智能技术生成

本文参考了《从零开始写个编译器吧》,《编译原理思路》,《状态机实现方法》等文章。
感谢这些大佬们对知识的无私奉献。
自己思考总结与实践。

编译器本身是一个程序,这个程序能将一种代码(源代码)翻译成另一种代码。
如果单独去看《编译原理》的书,估计大部分人都看不懂,因为太复杂了。

一般编译原理的课程会说一些:1、如何表示语法(BNF什么的)2、词法分析,用什么有穷自动机和无穷自动机3、语法分析,递归下降法,什么 LL(k),LALR 分析。4、中间代码的表示5、代码的生成6、代码优化
在这里插入图片描述

细细的归纳总结一下。

  1. 第一步是词法分析,英文叫做Tokenizer。它的作用是读入一个一个字符,并将其合并成一个一个Token(单词)。
为什么需要词法分析?

在最开始的状态,我们手里拿着的就是一串字符组成的字符串,在处理之后,我们按照一定的“规则”分解为多个单词。
为什么要分解字符串?直接用不行么?
这很难,因为计算机比较笨,直接一长的字符串,它难以认识,分解成单词是为了降低难度。

如果是简单的字符串,比如“hello world”,那可以很简单的分解成两个单词“hello”,“world”,规则就是空格键作为分隔符。

自然语言的翻译也属于广义上的编译,从一种代码翻译到另一种代码,它相对好处理,两个单词“hello”,“world”翻译成中文”你好“,”世界“。
单词与单词基本上是一一对应的。

但是复杂一些的字符串,比如代码里常用的”3+6*(5-8/2)“,要想分解,就比较麻烦了。

也没办法提前做固定格式,因为写法的种类实在太多了。
光一个设定变量 ”int a“,前面的int可以做成固定格式,但后面的变量名就没办法了,有无数种变化。

为了解决这个分解的问题,人类想了很多办法,也诞生了不少成果,还专门制造了一个词法分析的工具,叫做lex flex。

所以在实际工作中,有两条路线来解决词法分析问题,一条是利用现有的工具lex或者flex,适合很复杂的分解规则,另一条是学会原理,自己手动编写,适合简单的分解规则。

这里我选择自己手动编写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值