Compiler_词法分析_表驱动法

本文出自: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

Compiler_词法分析_表驱动法的相关文章

Compiler_词法分析_表驱动法_分析文件

本文出自:http://blog.csdn.net/svitter 一开始做这个实验真是觉得各种简单- -就是一张状态转换图不停的跳来跳去..后来发现我太天真了..一个搞来搞去搞不清楚的bug是因为老师给的状态转换图坑了 - - 当然这肯定不怪老师因为我一开始做的时候居然没发现= =. 状态转换图我就暂且不贴了,另外两篇文章的地址如下: Compiler_词法分析_表驱动法 Compiler_词法分析_直接转向法 这次的是分析文件,用双缓冲.其实我也不是很清楚自己到底有没有用上双缓冲.. 下面简

Compiler_词法分析_直接转向法

依据上述转换图,写出直接转向代码: //============================================================================ // Name : Comlier.cpp // Author : vit // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //===============

关于表驱动法的思考

目前在学习软件构造课程中表驱动法的内容,了解后觉得它在处理涉及多个if-else问题时十分有用,下面提供一些简单的我对表驱动法的理解以及其在java中应用的小例子. 表驱动法,顾名思义,是用查表方式来获取数据,涉及到了表的结构.表是一种在很多语言中常见的数据结构,比如在java中我们使用map键值对集合的形式来定义表.关于java中map的用法如下: 创建: Type map = new HashMap(); 删除: map.clear(); 添加键值对: map.set(key,value);

编程学习——表驱动法

近来阅读<代码大全>中“表驱动法”这一章节,发现其编程的思想在C语言实际编程很有指导作用,就想着将“表驱动法”应用于实际项目中. 任务需求:函数在进行业务处理之前,需要对外部输入的数据类型(dataType),数据索引(dataIndex),数据长度(dataLen)进行正确性检查 如果按照if-else结构进行判断的话,代码可能如下所示: enum DATA_TYPE{APPLE=0,PEAR=1,BANANA=2}; enum DATA_LEN{APPLE_LEN=20,PEAR_LEN=

表驱动法 -《代码大全》读书笔记

表驱动法是一种编程模式,从表里面查找信息而不是使用逻辑语句(if-else-switch),当是很简单的情况时,用逻辑语句很简单,但如果逻辑很复杂,再使用逻辑语句就很麻烦了. 比如查找一年中每个月份的天数,如果用表驱动法,完全不需要写一堆if-else-语句,直接把每个月份的天数存到一个数组里就行了,取值的时候直接下标访问,最多针对二月判断一下闰年.这么算的话,平时用的的HashMap,SparseArray也可以算是表驱动 表里可以存数据,也可以存指令,或函数指针等都可以. 示例 看一个例子,

表驱动法——直接访问表示例1

<代码大全>看到"表驱动法"一章,以下是表驱动法的第一个方法--直接访问表 import java.util.Scanner; import java.util.Calendar; class DaysPerMonth { public static void main(String[] args) { System.out.println("输入年份:"); Scanner scan = new Scanner(System.in); String i

表驱动法 - 巧妙利用数组返回中文星期

Date对象有个getDay方法,它根据本地时间,返回一个具体日期中一周的第几天.返回值从0~6,分别对应周日~周六 getDay 0 1 2 3 4 5 6 星期几 周日 周一 周二 周三 周四 周五 周六 用到日期相关的需求时需要将getDay返回的值转成星期几,即“这一天”是星期几?比如日历组件中选择日历后返回 “2014-12-22 周一”. 这是一段依然在线上运行的代码 /* * 根据Date对象返回星期几 * @param {Date} date * @return {String}

c#_表单处理方式

阅读目录 开始 简单的表单,简单的处理方式 表单提交,成功控件 多提交按钮的表单 上传文件的表单 MVC Controller中多个自定义类型的传入参数 F5刷新问题并不是WebForms的错 以Ajax方式提交整个表单 以Ajax方式提交部分表单 使用JQuery,就不要再拼URL了! id, name 有什么关系 使用C#模拟浏览器提交表单 资源链接 Form(表单)对于每个WEB开发人员来说,应该是再熟悉不过的东西了,可它却是页面与WEB服务器交互过程中最重要的信息来源. 虽然Asp.ne

《Code Complete》ch.18 表驱动法

是什么 一种scheme,用表来做信息存取,代替逻辑语句(if/else) 为什么 简化逻辑语句,避免大量嵌套的 if/else 或者 switch/case 怎么用 三种访问表的方式 直接访问:将源数据作为key 索引访问:构建KV表 阶梯访问:分为连续区间,遍历或者二分查找 例子 // get the full name of weekday // good String[] weekdays = { "Sunday", "Monday", "Tues