能识别浮点数的简单词法分析程序(C语言实现)
时间: 2023-12-05 12:03:14 浏览: 179
基于C语言设计并实现的词法分析程序【100012725】
5星 · 资源好评率100%
可以使用有限状态自动机(DFA)来实现简单的浮点数词法分析程序。以下是一个简单的实现示例:
```c
#include <stdio.h>
#include <ctype.h>
#define STATES_NUM 4
#define SYMBOLS_NUM 4
enum {
STATE_START,
STATE_INT,
STATE_FRAC,
STATE_EXP
};
enum {
SYMBOL_DIGIT,
SYMBOL_DOT,
SYMBOL_E,
SYMBOL_INVALID
};
int transition_table[STATES_NUM][SYMBOLS_NUM] = {
{STATE_INT, STATE_INVALID, STATE_INVALID, STATE_INVALID},
{STATE_INT, STATE_FRAC, STATE_EXP, STATE_INVALID},
{STATE_FRAC, STATE_INVALID, STATE_EXP, STATE_INVALID},
{STATE_EXP, STATE_EXP_DIGIT, STATE_INVALID, STATE_INVALID},
};
int is_float(char* str) {
int state = STATE_START;
int len = strlen(str);
int i;
for (i = 0; i < len; i++) {
char c = str[i];
int symbol = SYMBOL_INVALID;
if (isdigit(c))
symbol = SYMBOL_DIGIT;
else if (c == '.')
symbol = SYMBOL_DOT;
else if (c == 'e' || c == 'E')
symbol = SYMBOL_E;
if (symbol == SYMBOL_INVALID)
return 0;
state = transition_table[state][symbol];
if (state == STATE_INVALID)
return 0;
}
return state == STATE_INT || state == STATE_FRAC || state == STATE_EXP_DIGIT;
}
int main() {
char str[100];
printf("Enter a string: ");
scanf("%s", str);
if (is_float(str))
printf("%s is a float\n", str);
else
printf("%s is not a float\n", str);
return 0;
}
```
该程序使用一个状态转换表和一个状态机来确定输入字符串是否为浮点数。状态机的状态包括起始状态(STATE_START)、整数部分(STATE_INT)、小数部分(STATE_FRAC)和指数部分(STATE_EXP)。状态机的输入包括数字(SYMBOL_DIGIT)、小数点(SYMBOL_DOT)和指数符号(SYMBOL_E)。在状态机的每个状态中,根据输入符号,可以通过状态转换表中的转换规则进行状态转换。在输入字符串的每个字符上执行此过程,最终状态将指示输入字符串是否为浮点数。
阅读全文