<?php
header ( "Content-Type:text/html;charset=utf-8" );
/*
*定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。
类型:行为类模式
解释器模式的优缺点
解释器是一个简单的语法分析工具,它最显著的优点就是扩展性,修改语法规则只需要修改相应的非终结符就可以了,若扩展语法,只需要增加非终结符类就可以了。
但是,解释器模式会引起类的膨胀,每个语法都需要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来非常多的麻烦。同时,由于采用递归调用方法,每个非终结符表达式只关心与自己相关的表达式,每个表达式需要知道最终的结果,必须通过递归方式,无论是面向对象的语言还是面向过程的语言,递归都是一个不推荐的方式。由于使用了大量的循环和递归,效率是一个不容忽视的问题。特别是用于解释一个解析复杂、冗长的语法时,效率是难以忍受的。
*/
abstract class Expression {
protected abstract function interpreter ( $str );
}
//解释数字
class ExpressionNum extends Expression {
public 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 "九";
}
}
}
//解释字符
class ExpressionCharater extends Expression
{
function interpreter($str)
{
return strtoupper($str);
}
}
class Test
{
function execute($string)
{
$expression = null;
$len=strlen($string);
for($i = 0;$i<$len;$i++) {
$temp = $string[$i];
switch(true)
{
case is_numeric($temp): $expression = new ExpressionNum(); break;
default: $expression = new ExpressionCharater(); break;
}
echo $expression->interpreter($temp);
}
}
}
$obj = new Test();
$obj->execute("12345abc");
网友评论