概述:给定一种措辞,定义他的文法的一种表示,并定义一个阐明器,该阐明器利用该表示来阐明措辞中句子
阐明器模式的优缺陷:
阐明器是一个大略的语法剖析工具,它最显著的优点便是扩展性,修正语法规则只须要修正相应的非闭幕符就可以了,若扩展语法,只须要增加非闭幕符类就可以了。 但是,阐明器模式会引起类的膨胀,每个语法都须要产生一个非闭幕符表达式,语法规则比较繁芜时,就可能产生大量的类文件,为掩护带来非常多的麻烦。同时,由于采取递归调用方法,每个非闭幕符表达式只关心与自己干系的表达式,每个表达式须要知道终极的结果,必须通过递归办法,无论是面向工具的措辞还是面向过程的措辞,递归都是一个不推举的办法。由于利用了大量的循环和递归,效率是一个不容忽略的问题。特殊是用于阐明一个解析繁芜、冗长的语法时,效率是难以忍受的。
<?php
class Expression
{
function interpreter($str)
{
return $str;
}
}
<?php
class ExpressionNum extends Expression
{
function interpreter($str)
{
switch($str)
{
case \公众0\"大众: return \公众零\公众;
case \"大众1\公众: return \"大众一\公众;
case \"大众2\"大众: return \公众二\"大众;
case \"大众3\"大众: return \"大众三\"大众;
case \"大众4\公众: return \"大众四\"大众;
case \公众5\"大众: return \"大众五\公众;
case \"大众6\公众: return \公众六\"大众;
case \公众7\"大众: return \"大众七\"大众;
case \"大众8\"大众: return \公众八\"大众;
case \"大众9\"大众: return \公众九\"大众;
}
}
}
<?php
class ExpressionCharater extends Expression
{
function interpreter($str)
{
return strtoupper($str);
}
}
<?php
class Interpreter
{
function execute($string)
{
$expression = null;
for($i = 0;$i<strlen($string);$i++) {
$temp = $string[$i];
switch(true)
{
case is_numeric($temp): $expression = new ExpressionNum(); break;
default: $expression = new ExpressionCharater(); break;
}
echo $expression->interpreter($temp);
}
}
}
<?php
/
阐明器模式
/
public function actionExpression(){
Yii::import('ext.expression.');
$obj = new Interpreter();
$obj->execute(\"大众12345abc\公众);
}