求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
 
 
     
   
    全部     工程实例     标准规范     名校讲义     知识库    
 
 

C语言和设计模式 教程
开篇
单件模式
原型模式
组合模式
模板模式
工厂模式
责任链模式
抽象工厂模式
迭代器模式
外观模式
代理模式
享元模式
装饰模式
适配器模式
策略模式
中介者模式
建造者模式
桥接模式
观察者模式
备忘录模式
解释器模式
命令模式
状态模式
访问者模式
继承、封装、多态
 
 

解释器模式

    您可以捐助,支持我们的公益事业。

金额: 1元 10元 50元

姓名:

邮件:

电话:

公司:

说明:

认证码: 验证码,看不清楚?请点击刷新验证码 必填



 
 捐助

解释器模式虽然听上去有些费解,但是如果用示例说明一下就不难理解了。我们知道在C语言中,关于变量的定义是这样的:一个不以数字开始的由字母、数字和下划线构成的字符串。这种形式的表达式可以用状态自动机解决,当然也可以用解释器的方式解决。

typedef struct _Interpret  
{
int type;
void* (*process)(void* pData, int* type, int* result);

}Interpret;

上面的数据结构比较简单,但是很能说明问题。就拿变量来说吧,这里就可以定义成字母的解释器、数字解释器、下划线解释器三种形式。所以,我们可以进一步定义一下process的相关函数。

struct _Data;  

typedef void (*process)(struct _Data* pData);

typedef struct _Data
{
int value;
process pProcess;

}Data; #define DIGITAL_TYPE 1
#define LETTER_TYPE 2
#define BOTTOM_LINE 3

void* digital_process(void* pData, int* type, int* result)
{
UINT8* str;
assert(NULL != pData && NULL != type && NULL != result);

str = (UNT8*)pData;
while (*str >= '0' && *str <= '9')
{
str ++;
}

if(*str == '\0')
{
*result = TRUE;
return NULL;
}

if(*str == '_')
{
*result = TRUE;
*type = BOTTOM_TYPE;
return str;
}

if(*str >= 'a' && *str <= 'z' || *str >= 'A' && *str <= 'Z')
{
*result = TRUE;
*type = LETTER_TYPE;
return str;
}

*result = FALSE;
return NULL;
}

void* letter_process(void* pData, int* type, int* result)
{
UINT8* str;
assert(NULL != pData && NULL != type && NULL != result);

str = (UNT8*)pData;
while (*str >= 'a' && *str <= 'z' || *str >= 'A' && *str <= 'Z')
{
str ++;
}

if(*str == '\0')
{
*result = TRUE;
return NULL;
}

if(*str == '_')
{
*result = TRUE;
*type = BOTTOM_TYPE;
return str;
}

if(*str >= '0' && *str <= '9')
{
*result = TRUE;
*type = DIGITAL_TYPE;
return str;
}

*result = FALSE;
return NULL;
}

void* bottom_process(void* pData, int* type, int* result)
{
UINT8* str;
assert(NULL != pData && NULL != type && NULL != result);

str = (UNT8*)pData;
while ('_' == *str )
{
str ++;
}

if(*str == '\0')
{
*result = TRUE;
return NULL;
}

if(*str >= 'a' && *str <= 'z' || *str >= 'A' && *str <= 'Z')
{
*result = TRUE;
*type = LETTER_TYPE;
return str;
}

if(*str >= '0' && *str <= '9')
{
*result = TRUE;
*type = DIGITAL_TYPE;
return str;
}

*result = FALSE;
return NULL;
}

 


    您可以捐助,支持我们的公益事业。

金额: 1元 10元 50元

姓名:

邮件:

电话:

公司:

说明:

认证码: 验证码,看不清楚?请点击刷新验证码 必填



 
 捐助