适用性 |
- 当有
1 // Interpreter 2![](/Images/OutliningIndicators/None.gif) 3 // Intent: "Given a language, define a representation for its grammar along 4 // with an interpreter that uses the representation to interpret 5 // sentences in the language". 6![](/Images/OutliningIndicators/None.gif) 7 // For further information, read "Design Patterns", p243, Gamma et al., 8 // Addison-Wesley, ISBN:0-201-63361-2 9![](/Images/OutliningIndicators/None.gif) 10![](/Images/OutliningIndicators/ExpandedBlockStart.gif) /**//* Notes: 11 * This is used to implement a language using a class hierarchy 12 */ 13 14 namespace Interpreter_DesignPattern 15![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) { 16 using System; 17 using System.Collections; 18![](/Images/OutliningIndicators/InBlock.gif) 19 class Context 20![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 21 22 } 23![](/Images/OutliningIndicators/InBlock.gif) 24 abstract class AbstractExpression 25![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 26 abstract public void Interpret(Context c); 27 } 28![](/Images/OutliningIndicators/InBlock.gif) 29 // class for terminal symbol 30 class TerminalExpression : AbstractExpression 31![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 32 override public void Interpret(Context c) 33![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 34 35 } 36 } 37![](/Images/OutliningIndicators/InBlock.gif) 38 // class for grammar rule (one per rule needed) 39 class NonterminalExpression : AbstractExpression 40![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 41 override public void Interpret(Context c) 42![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 43 44 } 45 } 46 // to extend grammar, just add other NonterminalExpression classes 47![](/Images/OutliningIndicators/InBlock.gif) 48![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary> 49 /// Summary description for Client. 50 /// </summary> 51 public class Client 52![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 53 public static int Main(string[] args) 54![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 55 Context c = new Context(); 56 ArrayList l = new ArrayList(); //really need a tree here! 57![](/Images/OutliningIndicators/InBlock.gif) 58 // build up context information 59 // . . . 60![](/Images/OutliningIndicators/InBlock.gif) 61 // Populate abstract syntax tree with data 62 l.Add(new TerminalExpression()); 63 l.Add(new NonterminalExpression()); 64![](/Images/OutliningIndicators/InBlock.gif) 65 // interpret 66 foreach (AbstractExpression exp in l) 67![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) { 68 exp.Interpret(c); 69 } 70 71 return 0; 72 } 73 } 74 } 75![](/Images/OutliningIndicators/None.gif) 76![](/Images/OutliningIndicators/None.gif) 一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
- 该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。
- 效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如,正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。
|