C#设计模式之二十三解释器模式(Interpreter Pattern)【行为型
一、引言 2.4、模式的组成 ?? ? ??? 可以看出,在解释器模式的结构图有以下角色: ? ??? (1)、抽象表达式(AbstractExpression):定义解释器的接口,约定解释器的解释操作。其中的Interpret接口,正如其名字那样,它是专门用来解释该解释器所要实现的功能。 ??? (2)、终结符表达式(Terminal Expression):实现了抽象表达式角色所要求的接口,主要是一个interpret()方法;文法中的每一个终结符都有一个具体终结表达式与之相对应。比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。 ??? (3)、非终结符表达式(Nonterminal Expression):文法中的每一条规则都需要一个具体的非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,“+”就是非终结符,解析“+”的解释器就是一个非终结符表达式。 ??? (4)、环境角色(Context):这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。 ??? (5)、客户端(Client):指的是使用解释器的客户端,通常在这里将按照语言的语法做的表达式转换成使用解释器对象描述的抽象语法树,然后调用解释操作。 2.5、解释器模式的代码实现 ??? 在很多场合都需要把数字转换成中文,我们就可以使用解释器来实现该功能,把给定的数字解释成符合语法规范的汉字表示法。实现代码如下: 1 namespace InterpreterPattern 2 { 3 // 抽象表达式 4 public abstract class Expression 5 { 6 protected Dictionary<string,int> table = new Dictionary<int>(9); 7 8 protected Expression() 9 { 10 table.Add("一",1 11 table.Add(二2 12 table.Add(三3 13 table.Add(四4 14 table.Add(五5 15 table.Add(六6 16 table.Add(七7 17 table.Add(八8 18 table.Add(九 19 } 20 21 virtual void Interpreter(Context context) 22 23 if (context.Statement.Length == 0) 24 { 25 return; 26 } 27 28 foreach (string key in table.Keys) 29 30 int value = table[key]; 31 32 if (context.Statement.EndsWith(key + GetPostFix())) 33 { 34 context.Data += value * this.Multiplier(); 35 context.Statement = context.Statement.Substring(0,context.Statement.Length - .GetLength()); 36 } 37 if (context.Statement.EndsWith(零")) 38 39 context.Statement = context.Statement.Substring( 40 41 42 43 44 string GetPostFix(); 45 46 int Multiplier(); 47 48 这个可以通用,但是对于个位数字例外,所以用虚方法 49 GetLength() 50 51 return this.GetPostFix().Length + 52 53 } 54 55 个位表达式 56 sealed GeExpression : Expression 57 58 override GetPostFix() 59 60 return "" 61 62 63 Multiplier() 64 65 66 67 68 69 70 71 72 73 74 十位表达式 75 ShiExpression : Expression 76 77 78 79 十 80 81 82 83 84 10 85 86 87 88 百位表达式 89 BaiExpression : Expression 90 91 92 93 百 94 95 96 97 98 100 99 100 101 102 千位表达式 103 QianExpression : Expression 104 105 106 107 千108 109 110 111 112 1000113 114 115 116 万位表达式 117 WanExpression : Expression 118 119 120 121 万122 123 124 125 126 10000127 128 129 130 131 132 133 134 135 136 ArrayList tree = new ArrayList(); 137 138 tree.Add( GeExpression()); 139 tree.Add( ShiExpression()); 140 tree.Add( BaiExpression()); 141 tree.Add( QianExpression()); 142 143 144 145 if (context.Statement.EndsWith(GetPostFix())) 146 147 int temp = context.Data; 148 context.Data = 149 150 context.Statement = context.Statement.Substring(151 152 foreach (Expression exp tree) 153 { 154 exp.Interpreter(context); 155 } 156 context.Data = temp + context.Data * 157 158 159 160 161 162 亿位表达式 163 YiExpression : Expression 164 165 166 167 亿168 169 170 171 172 100000000173 174 175 176 177 ArrayList tree = 178 179 tree.Add(180 tree.Add(181 tree.Add(182 tree.Add(183 184 185 186 187 188 189 context.Data = 190 context.Statement = context.Statement.Substring(191 192 193 194 195 196 context.Data = temp + context.Data * 197 198 199 200 201 202 环境上下文 203 Context 204 205 private _statement; 206 _data; 207 208 public Context( statement) 209 210 this._statement = statement; 211 212 213 Statement 214 215 get { ._statement; } 216 set { value; } 217 218 219 Data 220 221 ._data; } 222 this._data =223 224 225 226 Program 227 228 static void Main([] args) 229 230 string roman = 五亿七千三百零二万六千四百五十二231 分解:((五)亿)((七千)(三百)(零)(二)万) 232 ((六千)(四百)(五十)(二)) 233 234 Context context = Context(roman); 235 ArrayList tree = 236 237 tree.Add(238 tree.Add(239 tree.Add(240 tree.Add(241 tree.Add( WanExpression()); 242 tree.Add( YiExpression()); 243 244 245 246 exp.Interpreter(context); 247 248 249 Console.Write(context.Data); 250 251 Console.Read(); 252 253 254 }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |