ホームページ  >  記事  >  バックエンド開発  >  C++ デザイン パターンとインタープリター パターンの簡単な紹介

C++ デザイン パターンとインタープリター パターンの簡単な紹介

黄舟
黄舟オリジナル
2017-01-17 13:25:381296ブラウズ

インタープリター パターン (インタープリター): 与えられた言語で、その文法の表現を定義し、その表現を使用して言語の文を解釈するインタープリターを定義します。

インタープリター パターンによって解決される問題: 特定の種類の問題が頻繁に発生する場合、問題の個々のインスタンスを単純な言語の文として定式化することは価値があるかもしれません。これにより、これらの文を解釈して問題を解決するインタプリタを構築することが可能になります。

正規表現はそのアプリケーションの 1 つであり、インタープリターは正規表現の文法を定義し、特定の正規表現とその正規表現の解釈方法を定義します。

4 つの役割:

AbstractExpression: 抽象解釈操作を宣言します。このインターフェイスは、抽象構文ツリー内のすべてのノードによって共有されます。

TerminalExpression: 文法内の終端記号に関連付けられた解釈操作を実装します。

NonterminalExpression: 文法内の非終端記号の解釈操作を実装する非終端式。文法内の各ルール R1、R2...Rn には、特定の非終端式クラスが必要です。

コンテキスト: インタプリタの外部にあるグローバル情報が含まれます。

モードの実装:

[code]//Context
class Context{
private:
    std::string input;
public:
    std::string Input(std::string in){
        input = in;
        return input;
    }
};

//抽象表达式
class AbstractExpression{
public:
    virtual void Interpret(Context *context) = 0;
};

//终结符表达式
class TerminalExpression: public AbstractExpression{
public:
    void Interpret(Context *context)override{
        std::cout << "TerminalExpression\n";
    }
};

//非终结符表达式
class NonterminalExpression: public AbstractExpression{
public:
    void Interpret(Context *context)override{
        std::cout << "NonterminalExpression\n";
    }
};

クライアント:

[code]//Client
int main(){
    Context *context = new Context;
    std::list<AbstractExpression*> list;
    list.push_back(new TerminalExpression);
    list.push_back(new NonterminalExpression);
    list.push_back(new TerminalExpression);
    list.push_back(new TerminalExpression);

    for(auto i : list)
        i->Interpret(context);
    // Output:
    // TerminalExpression
    // NonterminalExpression
    // TerminalExpression
    // TerminalExpression

    return 0;
}

インタープリターモードの利点:

通常、解釈して実行する必要がある言語があり、言語内の文はインタープリターモードの抽象構文ツリーとして表現できます。に使える 。

上記は、C++ デザイン パターンのインタープリター モードの概要の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。