Java でカスタム言語と式解析用のインタープリター モードを実装する方法

WBOY
リリース: 2023-05-11 12:46:05
転載
1672 人が閲覧しました

はじめに

Java インタプリタ パターン (インタープリタ パターン) は、言語の構文表現を定義し、その構文を解釈するためのインタプリタを定義する動作設計パターンです。

このコアpattern は、式インターフェイスと特定の式実装クラスを定義するインタープリタ (Interpreter) です。式インターフェイスは解釈メソッドを定義し、特定の式実装クラスは解釈メソッドを実装します。文法を説明するために使用します。

Java インタープリター モードには、次の 4 つの役割が含まれます。

  • 抽象式 (抽象式): インタープリターが実装する必要があるものを定義します。インターフェイスには、通常、式を解釈するためのインタープリター メソッド (インタープリター) が含まれます。 .

  • ターミナル式 (ターミナル式): 変数、定数などの言語のターミナル シンボルの解釈に使用される、抽象式インターフェイスのインタープリタ メソッドを実装します。

  • 非終端式: 抽象式インターフェイスの解釈メソッドを実装します。通常は複数の終端式で構成され、算術演算子、論理演算子などの言語内の非終端記号を解釈するために使用されます。

  • 環境 (コンテキスト): 解釈する必要がある言語、変数、定数などのコンテキスト情報が含まれます。インタープリター モードでは、通常、環境オブジェクトは次のとおりです。

実装

以下は、加算と減算を説明するために使用される簡単な式の例です。

抽象式

public interface Expression {
    /**
     * 解释表达式
     *
     * @return
     */
    int interpreter();
}
ログイン後にコピー

端末式

public class NumberExpression implements Expression{
    private int num;
    public NumberExpression(int num) {
        this.num = num;
    }
    /**
     * 解释表达式
     *
     * @return
     */
    @Override
    public int interpreter() {
        return num;
    }
}
ログイン後にコピー

非端末式

public class AddExpression implements Expression {
    /**
     * 左表达式
     */
    private Expression leftExpression;
    /**
     * 右表达式
     */
    private Expression rightExpression;
    public AddExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }
    /**
     * 解释表达式
     *
     * @return
     */
    @Override
    public int interpreter() {
        return leftExpression.interpreter() + rightExpression.interpreter();
    }
}
public class SubtractExpression implements Expression {
    /**
     * 左表达式
     */
    private Expression leftExpression;
    /**
     * 右表达式
     */
    private Expression rightExpression;
    public SubtractExpression(Expression leftExpression, Expression rightExpression) {
        this.leftExpression = leftExpression;
        this.rightExpression = rightExpression;
    }
    /**
     * 解释表达式
     *
     * @return
     */
    @Override
    public int interpreter() {
        return leftExpression.interpreter() - rightExpression.interpreter();
    }
}
ログイン後にコピー

Test

public class Demo {
    public static void main(String[] args) {
        // 创建一个复杂表达式,用于计算5+3-2+1的结果
        Expression expression = new AddExpression(
                new SubtractExpression(
                        new AddExpression(
                                new NumberExpression(5), new NumberExpression(3)),
                        new NumberExpression(2)),
                new NumberExpression(1));
        // 使用解释器模式来解释表达式,并输出计算结果
        System.out.println(expression.interpreter());
    }
}
ログイン後にコピー

Java でカスタム言語と式解析用のインタープリター モードを実装する方法

上記の例では、式インターフェイス Expression (抽象式) と、2 つの特定の式実装クラス AddExpression (非終端記号式) および SubtractExpression (非終端式) を定義しました。AddExpression クラスと SubtractExpression クラスには、それぞれ加算と減算を解釈するインタープリタ メソッドを実装しました。 # 式を実装し、NumberExpression (終端式) を定義して Expression を実装します。数値式の解釈にはインタープリター メソッドが使用されます。上記の例では、環境オブジェクトは明示的に定義されていませんが、式オブジェクトを作成し、それらを組み合わせることで環境がシミュレートされます。

##概要

利点

    強力なスケーラビリティ: インタプリタ モードは、言語の式と文法規則を拡張することにより、新しい動作を実装できます。例: 新しいターミナル式と非終端式を追加できます。終端式により、より複雑な文法規則を実装できます。
  • 実装が簡単: インタプリタ モードの実装は比較的簡単で、実装する必要があるのは抽象式のみです。
  • 文法ルールの変更が簡単: インタプリタ モードは文法ルールをオブジェクトとして表すため、インタプリタ オブジェクトの結合方法を変更することで文法ルールを変更できます。
  • 欠点

    多数のクラスが必要: 複雑な言語を実装するには、多数のクラスを定義する必要がある場合があり、言語の複雑さが増大します。
  • 可読性の悪さ: インタプリタ モードは構文ルールをオブジェクトとして表すため、特にこのモードに慣れていない開発者にとって、コードはあまり読みにくい可能性があります。
  • アプリケーション シナリオ

    数学式や正規表現など、特定の文法規則を解釈して実行する必要がある言語の場合
  • 新しい演算子やコマンドの追加など、言語の構文ルールを拡張する必要がある場合
  • カプセル化する必要がある場合コンパイル インタープリター、パーサーなど、コード内で複雑な解釈ロジックを実行します。
  • Note

重要なモジュールではインタープリター モードを使用しないようにしてください。そうしないとメンテナンスが行われます。プロジェクトでは、シェル、JRuby、Groovy、その他のスクリプト言語を使用してインタープリター モードを置き換え、Java コンパイル言語の欠点を補うことができます。

以上がJava でカスタム言語と式解析用のインタープリター モードを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート