实现一个简单的词法分析器
词法分析
词法分析的工作是将一个长长的字符串识别出一个个的单词,这一个个单词就是 Token。而且词法分析的工作是一边读取一边识别字符串的,不是把字符串都读到内存再识别
词法单元:
-
单词的内部表示是词法单元 token
-
编程语言中最小的语法单元
-
词法单元的表示
目标程序语句:
- age >= 45
解析age >= 45
过程图:
标识符、比较操作符和数字字面量这三种 Token 的词法规则:
-
标识符:第一个字符必须是字母,后面的字符可以是字母或数字
-
比较操作符:> 和 >=(其他比较操作符暂时忽略)
-
数字字面量:全部由数字构成(像带小数点的浮点数,暂时不管它)
有限自动机:
-
- 初始状态:刚开始启动词法分析的时候,程序所处的状态
-
- 标识符状态:在初始状态时,当第一个字符是字母的时候,迁移到状态 2。当后续字符是字母和数字时,保留在状态 2。如果不是,就离开状态 2,写下该 Token,回到初始状态
-
- 大于操作符(GT):在初始状态时,当第一个字符是 > 时,进入这个状态。它是比较操作符的一种情况
-
- 大于等于操作符(GE):如果状态 3 的下一个字符是 =,就进入状态 4,变成 >=。它也是比较操作符的一种情况
-
- 数字字面量:在初始状态时,下一个字符是数字,进入这个状态。如果后续仍是数字,就保持在状态 5
圆圈有单线的也有双线的。双线的意思是这个状态已经是一个合法的 Token 了,单线的意思是这个状态还是临时状态。
标识符和关键字规则的冲突
解析“int age = 40”这个语句,以这个语句为例研究一下词法分析中会遇到的问题:多个规则之间的冲突。
问题&