后加了,表示“懒惰”匹配,因此会匹配最短的,以a开始,以b结束的字符。例如字符串aabab,“贪婪”匹配的结果是aabab,而“懒惰”匹配的结果则是aab。三、词法分类识别这里,将源程序中的字符分为七类。
由于字符串对于词法分析以及后续的语法分析的意义不大,因此,这里将其单独列为一类;由于头文件的声明中会出现“”“”“””等分隔符,尤其是“”和“”,会与运
f算符中的大于小于号产生冲突,因此这里把头文件也单独列为一类。
(一)保留字C语言共有32个保留字,如图:
(二)标识符C语言标识符的要求是,必须以下划线或者字母开头,之后可以跟字母、数字、下划线。(三)常数由于常数的表达方式较多,这里只是代表性地选取了几种方式进行识别。
(四)操作符
fC语言操作符包括一元操作符、二元操作符和三元操作符。
(五)字符串这里的字符串是指包围在单引号或双引号内的字符串。(六)分隔符这里选取了以下经常见到的分隔符:
(七)头文件头文件的格式有一下两种:
f四、词法识别分类规则(一)常数的识别根据上述对常数识别的需求,构造出了如下正则表达式:
09090909eE090xX09abcdefABCDEF
这里,为了美观,以“”为分隔符,对表达式进行了换行处理,每一行对应一个常数类别。
第一行,表示对整数和浮点数进行匹配;第二行,先对整数或浮点数进行匹配,之后匹配e或E,最后匹配一个整数,即123456e789的形式,即科学计数法;第三行,先匹配数字0,之后匹配字母x或X,最后匹配09及af或AF的字符,即0x123abc的形式,即16进制表示法。(二)保留字的识别C语言中有32个保留字,且区分大小写,因此,这里构造如下正则表达式进行匹配:
autobreakcasecharco
stco
ti
uedefaultdodoubleelsee
umexter
floatforgotoifi
tlo
gregisterretur
shortsig
edsizeofstaticstructswitchtypedefu
io
u
sig
edvoidvolatilewhile
f可见,只需简单的将各个保留字通过“”符号进行连接,即可实现对所有保留字的识别。
(三)分隔符的识别
由于分隔符中存在与正则表达式中元字符相冲突的字符,如“”,“”等,因此需要对这些产生冲突的符号进行转义,构造如下正则表达式: