本文出自:http://blog.csdn.net/svitter
DFA:
使用了表驱动法;
构造的表如下:
num | . | E | +/- | other | |
---|---|---|---|---|---|
0 | 1 | 6 | - | - | - |
1 | 1 | 2 | 5 | - | - |
2 | 2 | - | 3 | - | - |
3 | - | - | - | 4 | -- |
4 | 5 | - | - | - | - |
5 | 5 | - | - | - | - |
6 | 2 | - | - | - | - |
7 | |||||
代码如下:
//============================================================================ // Name : compliler.cpp // Author : Vit // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <cstdio> #include <string.h> #include <stdlib.h> using namespace std; int State[8][5]; //set final accept const bool Acsta[7] = {0, 1, 1, 0, 0, 1, 0,}; //JudgeNum int JudgeNum(char &ch) { if(ch >= ‘0‘ && ch <= ‘9‘) return 0; else if(ch == ‘.‘) return 1; else if(ch == ‘E‘) return 2; else if(ch == ‘+‘ || ch == ‘-‘) return 3; else return 4; } //init the table void init() { //set error state for(int i = 0; i < 8; i++) for(int j = 0; j < 5; j++) { State[i][j] = 7; } //set table State[0][0] = 1; State[0][1] = 6; State[1][0] = 1; State[1][1] = 2; State[1][2] = 5; State[2][0] = 2; State[2][2] = 3; State[3][3] = 4; State[4][0] = 5; State[5][0] = 5; State[6][0] = 2; } //利用函数调用来读 char* Judge(char *str) { int i, j;//work point //var int len = strlen(str);//计算串长度 char *t = new char[2000];//返回串 int cur;//字符下标 char ch;//字符 int state;//状态 int beg;//开始 int endd;//结束 //start for(i = 0; i < len; i++) { beg = cur = i; ch = str[i]; state = 1; endd = beg; while(state != 7) { state = State[state][JudgeNum(ch)]; ch = str[++cur]; if(Acsta[state]) endd = cur;//记录最后一次符合状态的下标 } if(endd != beg) { if((endd - beg) > strlen(t)) { for(j = beg; j < endd; j++) { t[j-beg] = str[j]; } } } } return t; } int main (void) { char *t; char str[2000]; init(); freopen("test", "r", stdin); while(~scanf("%s", str)) { t = Judge(str); printf("%s\n", t); } return 0; }
Compiler_词法分析_表驱动法,布布扣,bubuko.com
时间: 2024-10-27 19:14:08