C语言词法分析程序的设计与实现

本文详细介绍了如何设计和实现C语言的词法分析程序,支持C语言的各种数字格式和转义字符。通过C++和lex两种方式实现,涵盖了识别注释、标识符、数字、字符、运算符、关键字以及错误处理等功能。C++实现中,作者使用了goto语句优化状态机的可读性,并讨论了自动机设计的考虑。而在lex实现中,将不同类型的单词转化为正则表达式进行匹配。
摘要由CSDN通过智能技术生成

C语言词法分析程序 c++和lex两种实现 支持多种数字格式和转义字符

实现的功能

  1. 基本满足C语言的词法规则。
  2. 可以识别八进制,十六进制,浮点,科学计数法,同时支持后缀。
  3. 识别关键字。
  4. 识别字符和字符串中的转义。

C++实现程序设计说明

自动机实现

​ 一般自动机实现采用如下代码结构:

int state = 0;
switch(state){
   
    case 0:
        dosomeThing();
        state = NextState;
        break;
    case 1:
        ...
}

这样的结构确实很规范,但是我觉得用起来有一点问题。

  1. state = 2 这代表着跳转到状态2,这样的可读性不强,因为很难记住状态2是什么状态。可以把state变量改为enum来增强可读性。
  2. 实现状态机每个状态的跳转一般用switch语句,如果有涉及到判断是< 还是<=就需要提前读取一个字符增加状态机,就会有三重switch嵌套,影响可读性。

所以我采用了一般不推荐的goto语句。只要保证实现的状态机没有逻辑错误,使用goto不会造成复杂的结构。

stateName1:
	dosomething;
	...
    goto stateName1;
	...
    goto stateName2;
stateName2:
	...

自动机举例

识别注释
/
*
/
=
其它
其它
*
其它
/
其它
'\n'
开始
/=
/
块注释
行注释
识别标识符
_\a-z\A-Z
_\a-z\A-Z\0-9
其它
开始
标识符
识别数字
l/L
l/L
u/U
u/U
其它
其它
其它
u/U
其它
其它
整数后缀
数字

实际使用msvc编译器发现,L和U的顺序其实没有限制,LuL也是合法的数字后缀。如果用自动机实现所有的情况,需要上面的自动机三个。所以实际实现并没有采用自动机,采用的是检测L和U出现的次数。

1-9
1-9
'\.'
E/e
十进制
整数后缀
浮点数
科学计数法
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值