能识别浮点数的简单词法分析程序(C语言实现)
时间: 2023-12-05 15:03:00 浏览: 105
以下是一个简单的C语言程序,可以识别输入字符串中的浮点数:
```c
#include <stdio.h>
int main() {
char input[100];
int i = 0;
int state = 0; // 初始状态为0,表示还未开始识别数字
int has_dot = 0; // 是否已经出现过小数点
int has_e = 0; // 是否已经出现过科学计数法的e/E
int has_digit = 0; // 是否已经出现过数字
printf("请输入一个字符串:");
scanf("%s", input);
while (input[i] != '\0') {
switch (state) {
case 0:
if (input[i] >= '0' && input[i] <= '9') {
state = 1; // 进入数字识别状态
has_digit = 1;
} else if (input[i] == '+' || input[i] == '-') {
state = 2; // 进入符号位识别状态
} else if (input[i] == '.') {
state = 3; // 进入小数点识别状态
has_dot = 1;
} else {
printf("不是有效的浮点数!\n");
return 0;
}
break;
case 1:
if (input[i] >= '0' && input[i] <= '9') {
has_digit = 1;
} else if (input[i] == '.') {
state = 4; // 进入小数点后数字识别状态
has_dot = 1;
} else if (input[i] == 'e' || input[i] == 'E') {
state = 5; // 进入指数部分识别状态
has_e = 1;
} else {
printf("识别到一个浮点数!\n");
return 0;
}
break;
case 2:
if (input[i] >= '0' && input[i] <= '9') {
state = 1; // 进入数字识别状态
has_digit = 1;
} else if (input[i] == '.') {
state = 3; // 进入小数点识别状态
has_dot = 1;
} else {
printf("不是有效的浮点数!\n");
return 0;
}
break;
case 3:
if (input[i] >= '0' && input[i] <= '9') {
state = 4; // 进入小数点后数字识别状态
has_digit = 1;
} else {
printf("不是有效的浮点数!\n");
return 0;
}
break;
case 4:
if (input[i] >= '0' && input[i] <= '9') {
has_digit = 1;
} else if (input[i] == 'e' || input[i] == 'E') {
state = 5; // 进入指数部分识别状态
has_e = 1;
} else {
printf("识别到一个浮点数!\n");
return 0;
}
break;
case 5:
if (input[i] >= '0' && input[i] <= '9') {
has_digit = 1;
} else if ((input[i] == '+' || input[i] == '-') && i > 0 && (input[i-1] == 'e' || input[i-1] == 'E')) {
state = 6; // 进入指数部分符号位识别状态
} else {
printf("不是有效的浮点数!\n");
return 0;
}
break;
case 6:
if (input[i] >= '0' && input[i] <= '9') {
has_digit = 1;
} else {
printf("不是有效的浮点数!\n");
return 0;
}
break;
}
i++;
}
if (has_digit) {
printf("识别到一个浮点数!\n");
} else {
printf("不是有效的浮点数!\n");
}
return 0;
}
```
该程序使用一个状态机来识别输入字符串中的浮点数,具体的识别规则如下:
- 初始状态为0,表示还未开始识别数字;
- 如果遇到数字字符,则进入数字识别状态(状态1);
- 如果遇到正负号字符,则进入符号位识别状态(状态2);
- 如果遇到小数点,则进入小数点识别状态(状态3);
- 如果在数字识别状态或小数点后数字识别状态下遇到数字字符,则保持当前状态;
- 如果在数字识别状态下遇到小数点,则进入小数点后数字识别状态(状态4);
- 如果在数字识别状态下遇到科学计数法的e/E,则进入指数部分识别状态(状态5);
- 如果在小数点识别状态下遇到非数字字符,则不是有效的浮点数;
- 如果在小数点后数字识别状态下遇到非数字字符,则识别到一个浮点数;
- 如果在指数部分识别状态下遇到非数字字符,则不是有效的浮点数;
- 如果在指数部分符号位识别状态下遇到非数字字符,则不是有效的浮点数;
- 如果在任何状态下已经识别到了数字,则输入字符串是一个有效的浮点数。
注意,该程序只是一个简单的示例,还有很多情况没有考虑到。在实际的编译器或解释器中,需要更加完善的词法分析程序来识别各种类型的合法输入。
阅读全文