词法分析

 什么是词法分析?就是把字符串流根据词语组成的法则,切分成一个个有效的词。
以c语言为例,词法分析的任务是把形如"int a = 1; int b = 2; int c = a + b;"这样的字符串切分成int,a,=,1,;,int,b,=,2,;,int,c=,a,+,b,;这样的一个个词,编译原理中一般叫token。

 那怎么切呢?从左到右看,第一个字母i,以i打头的词语有几种可能,第一种可能是关键字int,
第二种可能是关键字if,第三种可能是变量名i或者ints或者ias之类,所以还要继续往右看,
如果第二个字母是空格,则i确定了,就是变量名i。如果第二个字母是n,则in有可能是int或者变量名,
如果是f,则if有可能是关键字if或者变量名,如果既不是n不是f也不是空格,则是变量名。还需要继续往下看。就这样一个一个字符从左往右看,根据词法规则,来切分token。

 词法规则可以用正则表达式来表示。比如变量名是以字母开头后面可以跟字母或数字,
可以表示成a-zA-z*。从左往右扫描时根据正则表达式来匹配token。
匹配的过程可以用有限自动机来表示。如下图
2023-12-02T02:17:56.png

 有限自动机就是有有限状态的自动机器,可以根据当前的不同字母在各个状态间迁移。有一个开始状态。多个其他状态,遇到不同的字符进入不同状态,如果是空格或者大于号等于号小于号。之前的状态就确定了。如果是空格,舍弃,然后扫描下一个字符,如果是大于号等于号小于号,则进入新的状态。