C言語とデザインパターン(解釈モード)

記事のディレクトリ

言葉を理解します

設計機能、指定された入力の解釈は、入力は、所望の出力として解釈されます。(正規表現は、インタプリタの代表です)

例えば

 そのゲーム上で言ったように、私は徒歩5を入力した、私は従わなければならない:移動移動の方向をモバイル+このフォーマットから私の指示を、この形式の命令は文法の一種で入力し、私だけに基づいて定義されて+移動するには、画面上の犬を制御するために入力するには、この文法。もちろん、私は徒歩5を入力した、画面上の子犬は確かにそれは必要性のこの時間を行う方法を、私の入力が何であるかを知らない、理解していませんでしたか?私は犬が理解できるものに入力した内容に変換するためのツールを必要とし、このツールはインタプリタで述べた定義であり、私はそれから、説明した命令を解釈し、コマンド入力のインタプリタがに送信されます画面上の子犬、子犬は、実際の移動中に、理解しています。

実際の例

  パターン通訳、けれどもそれはやや混乱に聞こえるが、あなたは理解することは難しいことではない説明する例を使用している場合。文字からなる文字列、数字、アンダースコアが数字で起動しない:私たちは、C言語では、変数の定義は、このことを知っています。もちろんインタプリタの方法によって解決され得る表現のこの形態は、有限状態機械によって解決することができます。

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

 上記のデータ構造が比較的単純であるが、非常に伝えます。インスタンス変数のために取り、説明、デジタル通訳の文字としてそこに定義することができ、インタプリタは三つの形式を強調しました。そこで、我々は、さらにどのようなプロセスの相関関数を定義することができます。


#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;            
} 
公開された258元の記事 ウォンの賞賛6 ビュー8076

おすすめ

転載: blog.csdn.net/qq_23929673/article/details/103540737