首页 > 代码库 > Compiler_词法分析_表驱动法

Compiler_词法分析_表驱动法

本文出自:http://blog.csdn.net/svitter
DFA:


使用了表驱动法;


构造的表如下:

表驱动

num.E+/-other
016---
1125--
22-3--
3---4--
45----
55----
62----
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;
}