インタープリタ モードは、複合クラスの階層構造を持つ文法表現で構成され、文法に続く式は、複合モードのインスタンス オブジェクトを除いて、抽象構文ツリーに変換できます。写真、他には何もありません。
ツリーは抽象名詞です。実際、ほとんどの場合、それは式の抽象表現であり、文字列やデータ構造の具体的な式が存在する可能性を無視します (たとえば、PHP では、「A」)。と "x41" は、同じ抽象リテラル値の異なる具体的な表現です)、論理ルールを通じて結果を分離することで、解釈プロセスが大幅に簡素化されます。
インタープリターはあまり一般的なパターンではありませんが、単純な文法の場合、ルールを追加するのはクラスを追加するのと同じくらい簡単ですが、他のサービスによって行われる具体的な表現から抽象構文ツリーへの変換は解決されません。
インタープリター パターンは、単純な抽象式メソッド (インタープリター操作) に複合階層構造を活用するように設計されており、インタープリター操作のパラメーターは通常、特定のメソッドに対して集合的にコンテキストと呼ばれます。代わりに使用されるか、一部の操作では存在しない可能性があります。
また、インタプリタが含まれる場合、複合パターンのリーフとコンテナの参加者名は異なり、これらの名前は、それらが果たす役割 (終端式または非終端式) を反映します。
参加者:
◆クライアント: Explain 操作を使用します。
◆抽象表現: 表現ツリーに基づいた抽象表現。
◆Non TerminalExpression: 他の抽象式 (AbstractExpression インスタンス) を再帰的に含む式。
◆終端表現:これ以上簡略化できない表現。
書籍「デザイン パターン」では、このパターンの拡張例が提供されています。ブール式を数式に置き換えて改造しました。この例では、数式の表示を解決し、その Evaluate() が別の式に分離されています。 ConcreteExpression クラス。
コードをコピーします コードは次のとおりです:
/**
* 抽象表現。このインターフェース
* のすべての実装は ConcreteExpressions です。
*/
interface MathExpression
{
/**
* 式が仮定する値を計算します。
* $values はすべての式に渡されますが、
* は変数でのみ使用されることに注意してください。これは、ツリー構造を抽象化するために必要です
* 。
*/
public function Evaluate(array $values);
}
/**
* リテラル値である終端式。
*/
class Literal は MathExpression を実装します
{
private $_value;
public function __construct($value)
{
$this->_value = $value;
}
public function Evaluate(array $values)
{
return $this->_value;
}
}
/**
* 変数を表す終端式。
*/
class 変数は MathExpression を実装します
{
private $_letter;
public function __construct($letter)
{
$this->_letter = $letter;
}
public function Evaluate(array $values)
{
return $values[$this->_letter];
}
}
/**
* 非終端式。
*/
クラス Sum は MathExpression を実装します
{
private $_a;
プライベート $_b;
public function __construct(MathExpression $a, MathExpression $b)
{
$this->_a = $a;
$this->_b = $b;
}
public function Evaluate(array $values)
{
return $this->_a->evaluate($values) + $this->_b->evaluate($values);
}
}
/**
* 非終端式。
*/
class Product は MathExpression を実装します
{
private $_a;
プライベート $_b;
public function __construct(MathExpression $a, MathExpression $b)
{
$this->_a = $a;
$this->_b = $b;
}
public function Evaluate(array $values)
{
return $this->a->evaluate($values) * $this->b->evaluate($values);
}
}
// 10(a + 3)
$expression = new Product(new Literal(10), new Sum(new Variable('a'), new Literal(3)));
echo $expression->evaluate(array('a' => 4)), "n";
// 文法に新しいルールを追加するのは簡単です:
// 例:べき乗、減算...
// Composite のおかげで、操作はさらに簡単になります:
// replace($letter, MathExpression $expr) を追加できます
// インターフェースに...
http://www.bkjia.com/PHPjc/327555.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327555.html技術記事解読者(インタープリター)モードには、複合クラス分層構造を備えた文法テーブルが含まれており、ビューはクラスに表示され、文法の後ろにある表形式は 1 つの抽象に変換できます...