インタプリタモード(インタプリタ)の定義:言語を指定し、その文法の表現を定義し、その表現を使用してその言語の文を解釈するインタプリタを定義します。
利点:
- 優れたスケーラビリティ。クラスはインタープリターモードで言語の文法規則を表すために使用されるため、継承などのメカニズムを介して文法を変更または拡張できます。
- 簡単に達成できます。構文ツリーの各式ノードクラスは類似しているため、文法の実装が簡単です。
短所:
- 実行効率が低い。インタプリタモードは通常、多数のループと再帰呼び出しを使用します。説明する文が複雑になると、実行速度が非常に遅くなり、コードのデバッグプロセスも面倒になります。
- クラスの拡張が発生します。インタプリタモードの各ルールは、少なくとも1つのクラスを定義する必要があります。文法ルールが多いと、クラスの数が急激に増加し、システムの管理と保守が困難になります。
- 適用可能なシナリオは比較的少ないです。ソフトウェア開発では、言語文法を定義する必要のあるアプリケーション例が非常に少ないため、このモードが使用されることはめったにありません。
構造:
- 抽象表現(抽象表現)の役割:インタプリタのインターフェイスを定義し、インタプリタの解釈操作に同意し、主に解釈メソッドinterpret()を含みます。
- ターミナル式の役割:これは、文法のターミナルに関連する操作を実装するために使用される抽象式のサブクラスです。文法の各ターミナルには、それに対応する特定のターミナル式があります。
- 非終端式の役割:これは抽象式のサブクラスでもあり、文法の非終端記号に関連する操作を実装するために使用されます。文法の各規則は非終端式に対応します。
- コンテキストロール:通常、各インタープリターに必要なデータまたは共通の機能が含まれ、通常、すべてのインタープリターが共有するデータを転送するために使用され、後続のインタープリターはここからこれらの値を取得できます。
- クライアント:主なタスクは、分析する必要のある文または式を、インタープリターオブジェクトによって記述された抽象構文ツリーに変換してから、インタープリターの解釈メソッドを呼び出すことです。もちろん、インタープリターの解釈メソッドは、環境ロールを介して間接的にアクセスされます。
抽象表現:
abstract class AbstractExpression//声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享
{
public abstract void Interpret(Context context);
}
ターミネーター式:
class TerminalExpression:AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("终端解释器");
}
}
非終端記号:
class NonterminalExpression:AbstractExpression
{
public override void Interpret(Context context)
{
Console.WriteLine("非终端解释器");
}
}
周囲:
class Context
{
private string input;
private string Input
{
get {
return input; }
set {
input = value; }
}
private string output;
public string Output
{
get {
return output; }
set {
output = value; }
}
}
クライアント:
static void Main(string[] args)
{
Context context = new Context();
ArrayList list = new ArrayList();
list.Add(new TerminalExpression ());
list.Add(new NonterminalExpression());
list.Add(new TerminalExpression());
list.Add(new TerminalExpression());
foreach (AbstractExpression exp in list)
{
exp.Interpret(context);
}
Console.WriteLine();
}