Interpreterパターンとは | GoFデザインパターン

記事内に広告が含まれています。

本記事では、GoF(Gang of Four)デザインパターンの一つである「Interpreterパターン」について解説します。

このパターンは、文法規則を定義し、その文法に基づいて入力を解釈・評価する仕組みを提供します。

特に言語解析やコンパイラなどで使用されることが多いパターンです。

この記事では、Interpreterパターンの基本的な考え方、使用例、Java、C++、C#、VB.NETでの実装例について説明します。

Interpreterパターンとは

Interpreterパターンは、与えられた言語の文法を表現し、その文法に従って文章を解釈するデザインパターンです。

特定の文法規則を持つ言語を対象にして、その文法に基づく式や文章を解釈して処理を行うのに適しています。

一般的には、構文木を構築し、その木をたどりながら解釈を行います。

Interpreterパターンの目的

Interpreterパターンの主な目的は、ある特定の文法に従った解釈を自動化することです。

このパターンは、式の評価や言語処理、正規表現の解釈、コンパイルの解析フェーズなどに使用されます。

ルールに基づいて式を分解し、個々の要素を再帰的に処理することが特徴です。

Interpreterパターンの使い方

Interpreterパターンを使うことで、複雑な言語構造を解釈するためのクラス群を構築することができます。

文法を定義するクラスと、その文法を利用して解析を行うクラスを用意し、具体的な処理を実行します。

典型的な実装では、次のような手順で処理が進みます。

Interpreterパターンの基本構造

基本的な構造としては、以下の要素を含むことが一般的です:

  • AbstractExpression:すべての文法規則に共通するインターフェース。
  • TerminalExpression:文法の終端にある要素を表すクラス。
  • NonTerminalExpression:文法の非終端要素を表すクラス。通常、他の式を再帰的に解釈する。
  • Context:式の解釈に必要なデータを保持するクラス。

Interpreterパターン実装サンプル

以下に、Interpreterパターンの実装サンプルをJava、C++、C#、VB.NETで紹介します。

Javaでの実装サンプル


public interface Expression {
    int interpret(Context context);
}

public class Number implements Expression {
    private int number;

    public Number(int number) {
        this.number = number;
    }

    @Override
    public int interpret(Context context) {
        return number;
    }
}

public class Plus implements Expression {
    private Expression leftOperand;
    private Expression rightOperand;

    public Plus(Expression left, Expression right) {
        this.leftOperand = left;
        this.rightOperand = right;
    }

    @Override
    public int interpret(Context context) {
        return leftOperand.interpret(context) + rightOperand.interpret(context);
    }
}

public class Context {
    // Contextに必要なデータやメソッドを追加
}

C++での実装サンプル


class Expression {
public:
    virtual int interpret() = 0;
};

class Number : public Expression {
    int number;
public:
    Number(int value) : number(value) {}
    int interpret() override {
        return number;
    }
};

class Plus : public Expression {
    Expression* left;
    Expression* right;
public:
    Plus(Expression* l, Expression* r) : left(l), right(r) {}
    int interpret() override {
        return left->interpret() + right->interpret();
    }
};

C#での実装サンプル


public interface Expression {
    int Interpret();
}

public class Number : Expression {
    private int number;

    public Number(int number) {
        this.number = number;
    }

    public int Interpret() {
        return number;
    }
}

public class Plus : Expression {
    private Expression leftOperand;
    private Expression rightOperand;

    public Plus(Expression left, Expression right) {
        this.leftOperand = left;
        this.rightOperand = right;
    }

    public int Interpret() {
        return leftOperand.Interpret() + rightOperand.Interpret();
    }
}

VB.NETでの実装サンプル


Public Interface Expression
    Function Interpret() As Integer
End Interface

Public Class Number
    Implements Expression

    Private _number As Integer

    Public Sub New(ByVal number As Integer)
        _number = number
    End Sub

    Public Function Interpret() As Integer Implements Expression.Interpret
        Return _number
    End Function
End Class

Public Class Plus
    Implements Expression

    Private _left As Expression
    Private _right As Expression

    Public Sub New(ByVal left As Expression, ByVal right As Expression)
        _left = left
        _right = right
    End Sub

    Public Function Interpret() As Integer Implements Expression.Interpret
        Return _left.Interpret() + _right.Interpret()
    End Function
End Class

まとめ

Interpreterパターンは、文法や式を定義し、解析・評価する際に役立つ強力なデザインパターンです。

複雑な文法を持つアプリケーションでは、言語の構造を柔軟に解釈できるこのパターンが効果的に機能します。

この記事では、Java、C++、C#、VB.NETの各言語での実装例を示しました。

実際のアプリケーションで活用する際には、文法の柔軟性やパフォーマンスも考慮して設計することが重要です。

オブジェクト指向プログラミングにおけるGoFの23のデザインパターン
デザインパターンは、ソフトウェア設計の問題を効果的に解決するための再利用可能な解決策です。本記事では、GoF(Gang ...
【PR】
オブジェクト指向学習におすすめの本
オブジェクト指向
スポンサーリンク
タイトルとURLをコピーしました