C语言词法分析程序 c++和lex两种实现 支持多种数字格式和转义字符
实现的功能
- 基本满足C语言的词法规则。
- 可以识别八进制,十六进制,浮点,科学计数法,同时支持后缀。
- 识别关键字。
- 识别字符和字符串中的转义。
C++实现程序设计说明
自动机实现
一般自动机实现采用如下代码结构:
int state = 0;
switch(state){
case 0:
dosomeThing();
state = NextState;
break;
case 1:
...
}
这样的结构确实很规范,但是我觉得用起来有一点问题。
state = 2
这代表着跳转到状态2,这样的可读性不强,因为很难记住状态2是什么状态。可以把state变量改为enum来增强可读性。- 实现状态机每个状态的跳转一般用switch语句,如果有涉及到判断是
<
还是<=
就需要提前读取一个字符增加状态机,就会有三重switch嵌套,影响可读性。
所以我采用了一般不推荐的goto语句。只要保证实现的状态机没有逻辑错误,使用goto不会造成复杂的结构。
stateName1:
dosomething;
...
goto stateName1;
...
goto stateName2;
stateName2:
...
自动机举例
识别注释
识别标识符
识别数字
实际使用msvc编译器发现,L和U的顺序其实没有限制,LuL
也是合法的数字后缀。如果用自动机实现所有的情况,需要上面的自动机三个。所以实际实现并没有采用自动机,采用的是检测L和U出现的次数。