verride string GetPostFix()
164 {
165 return "亿";
166 }
167
168 public override int Multiplier()
169 {
170 return 100000000;
171 }
172
173 public override void Interpreter(Context context)
174 {
175 ArrayList tree = new ArrayList();
176
177 tree.Add(new GeExpression());
178 tree.Add(new ShiExpression());
179 tree.Add(new BaiExpression());
180 tree.Add(new QianExpression());
181
182 foreach (string key in table.Keys)
183 {
184 if (context.Statement.EndsWith(GetPostFix()))
185 {
186 int temp = context.Data;
187 context.Data = 0;
188 context.Statement = context.Statement.Substring(0, context.Statement.Length - this.GetLength());
189
190 foreach (Expression exp in tree)
191 {
192 exp.Interpreter(context);
193 }
194 context.Data = temp + context.Data * this.Multiplier();
195 }
196 }
197 }
198 }
199
200 //环境上下文
201 public sealed class Context
202 {
203 private string _statement;
204 private int _data;
205
206 public Context(string statement)
207 {
208 this._statement = statement;
209 }
210
211 public string Statement
212 {
213 get { return this._statement; }
214 set { this._statement = value; }
215 }
216
217 public int Data
218 {
219 get { return this._data; }
220 set { this._data = value; }
221 }
222 }
223
224 internal class Program
225 {
226 private static void Main(string[] args)
227 {
228 string roman = "五亿七千三百零二万六千四百五十二";
229 //分解:((五)亿)((七千)(三百)(零)(二)万)
230 //((六千)(四百)(五十)(二))
231
232 Context context = new Context(roman);
233 List<Expression> tree = new List<Expression>();
234 tree.Add(new GeExpression());
235 tree.Add(new ShiExpression());
236 tree.Add(new BaiExpression());
237 tree.Add(new QianExpression());
238 tree.Add(new WanExpression());
239 tree.Add(new YiExpression());
240
241 foreach (Expression exp in tree)
242 {
243 exp.Interpreter(context);
244 }
245
246 Console.Write(context.Data);
247 }
248 }
看完之后是不是想骂一句fuck,我只是想要简单的转换一下,却需要写这么一大坨,显然不符合我们的心意。
解释器模式的优缺点:
优点:
1)易于改变和扩展文法。
2)每一条文法规则都可以表示为一个类,因此可以方便地实现一个简单的语言。
3)实现文法较为容易。在抽象语法树中每一个表达式节点类的实现方式都是相似的,这些类的代码编写都不会特别复杂,还可以通过一些工具自动生成节点类代码。
4)增加新的解释表达式较为方便。如果用户需要增加新的解释表达式只需要对应增加一个新的终结符表达式或非终结符表达式类,原有表达式类代码无须修改,符合“开闭原则”。
缺点:
1)对于复杂文法难以维护。在解释器模式中,每一条规则至少需要定义一个类,因此如果一个语言包含太多文法规则,类的个数将会急剧增加,导致系统难以管理和维护,此时可以考虑使用语法分析程序等方式来取代解释器模式。
2)执行效率较低。由于在解释器模式中使用了大量的循环和递归调用,因此在解释较为复杂的句子时其速度很慢,而且代码的调试过程也比较麻烦。
解释器模式的应用场景:
1)当一个语言需要解释执行,并可以将该语言中的句子表示为一个抽象语法树的时候,可以考虑使用解释器模式(如XML文档解释、正则表达式等领域)。
2)一些重复出现的问题可以用一种简单的语言来进行表达。
3)一个语言的文法较为简单.
4)当执行效率不是关键和主要关心的问题时可考虑解释器模式(注:高效的解释器通常不是通过直接解释抽象语法树来实现的,而是需要将它们转换成其他形式,使用解释器模式的执行效率并不高。)
参考:https://www.cnblogs.com/PatrickLiu/p/8242238.html
|