12、C语言和设计模式(解释器模式)

来源:互联网 发布:python的idey 编辑:程序博客网 时间:2024/04/30 06:35
【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

    

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

[cpp] view plaincopy
  1. typedef struct _Interpret  
  2. {  
  3.     int type;  
  4.     void* (*process)(void* pData, int* type, int* result);  
  5.   
  6. }Interpret;  
    上面的数据结构比较简单,但是很能说明问题。就拿变量来说吧,这里就可以定义成字母的解释器、数字解释器、下划线解释器三种形式。所以,我们可以进一步定义一下process的相关函数。
[cpp] view plaincopy
  1. #define DIGITAL_TYPE 1  
  2. #define LETTER_TYPE  2  
  3. #define BOTTOM_LINE  3  
  4.   
  5. void* digital_process(void* pData, int* type, int* result)  
  6. {  
  7.     UINT8* str;  
  8.     assert(NULL != pData && NULL != type && NULL != result);  
  9.   
  10.     str = (UNT8*)pData;  
  11.     while (*str >= '0' && *str <= '9')  
  12.     {  
  13.         str ++;  
  14.     }   
  15.   
  16.     if(*str == '\0')  
  17.     {  
  18.         *result = TRUE;  
  19.         return NULL;  
  20.     }     
  21.   
  22.     if(*str == '_')  
  23.     {  
  24.         *result = TRUE;  
  25.         *type = BOTTOM_TYPE;  
  26.         return str;  
  27.     }  
  28.   
  29.     if(*str >= 'a' && *str <= 'z' || *str >= 'A' && *str <= 'Z')  
  30.     {  
  31.         *result = TRUE;  
  32.         *type = LETTER_TYPE;  
  33.         return str;  
  34.     }  
  35.   
  36.     *result = FALSE;  
  37.     return NULL;              
  38. }      
  39.   
  40. void* letter_process(void* pData, int* type, int* result)  
  41. {  
  42.     UINT8* str;  
  43.     assert(NULL != pData && NULL != type && NULL != result);  
  44.   
  45.     str = (UNT8*)pData;  
  46.     while (*str >= 'a' && *str <= 'z' || *str >= 'A' && *str <= 'Z')  
  47.     {  
  48.         str ++;  
  49.     }   
  50.   
  51.     if(*str == '\0')  
  52.     {  
  53.         *result = TRUE;  
  54.         return NULL;  
  55.     }     
  56.   
  57.     if(*str == '_')  
  58.     {  
  59.         *result = TRUE;  
  60.         *type = BOTTOM_TYPE;  
  61.         return str;  
  62.     }  
  63.   
  64.     if(*str >= '0' && *str <= '9')  
  65.     {  
  66.         *result = TRUE;  
  67.         *type = DIGITAL_TYPE;  
  68.         return str;  
  69.     }  
  70.   
  71.     *result = FALSE;  
  72.     return NULL;              
  73. }            
  74.   
  75. void* bottom_process(void* pData, int* type, int* result)  
  76. {  
  77.     UINT8* str;  
  78.     assert(NULL != pData && NULL != type && NULL != result);  
  79.   
  80.     str = (UNT8*)pData;  
  81.     while ('_' == *str )  
  82.     {  
  83.         str ++;  
  84.     }   
  85.   
  86.     if(*str == '\0')  
  87.     {  
  88.         *result = TRUE;  
  89.         return NULL;  
  90.     }     
  91.   
  92.     if(*str >= 'a' && *str <= 'z' || *str >= 'A' && *str <= 'Z')  
  93.     {  
  94.         *result = TRUE;  
  95.         *type = LETTER_TYPE;  
  96.         return str;  
  97.     }  
  98.   
  99.     if(*str >= '0' && *str <= '9')  
  100.     {  
  101.         *result = TRUE;  
  102.         *type = DIGITAL_TYPE;  
  103.         return str;  
  104.     }  
  105.   
  106.     *result = FALSE;  
  107.     return NULL;              
  108. }  
0 0