Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629012
  • 博文数量: 87
  • 博客积分: 3399
  • 博客等级: 中校
  • 技术积分: 1422
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 21:20
文章分类

全部博文(87)

文章存档

2013年(1)

2012年(51)

2011年(33)

2010年(2)

分类: 项目管理

2011-08-04 20:39:34

解释器模式

结构:

 

l  Context 为被解释的内容。

l  TerminalExpression为终结符表达式,实现文法中与终结符关联的内容的解释操作

l  NonterminalExpression 非终结符表达式,为文法中非终结符实现解释操作,文法中每一条规则都需要一个具体的非终结符表达式类。

意图:

给定一个语言,定义它的文法的一种表示,并给定一个解释器,该解释器利用该表示来解释语言中的句子。

适用性:

当有一个语言需要解释执行,并且你可以将语言中的句子表示成一个抽象语法树时,可以使用解释器模式。而当存在以下情况时,该模式效果更好:

         1)该文法简单。对于复杂的文法,文法的类层次变得庞大而无法管理。此时语法分析程序生成器是更好的选择。他们无需构建抽象语法树即可解释表达式,这样可以节省空间和时间。

         (2)效率不是一个关键的问题。最高效的解释器通常不是通过直接解释语法分析树来实现的,而是首先将它们转换成另一种形式。例如正则表达式通常被转换成状态机。但是即使在这种情况下,转换器仍可以用解释器模式来实现,该模式仍然是有用的。

举例:

1正则表达式:

         解释器为正则表达式定义了一个文法,如何表示一个特定的表达式,以及如何解释表达式。通过一种通用的搜索算法来解释执行一个正则表达式,该表达式定义了待匹配字符串的集合。

2浏览器: 浏览器接受HTML代码后,通过解释后在将内容呈现在页面上。

示例:
  1. // Interpreter


  2. // Intent: "Given a language, define a representation for its grammar along

  3. // with an interpreter that uses the representation to interpret

  4. // sentences in the language".

  5. //给定一个语言,定义它的文法的一种表示,并定义一个使用该表示来解释该语言中句子的解释器。


  6. // For further information, read "Design Patterns", p243, Gamma et al.,

  7. // Addison-Wesley, ISBN:0-201-63361-2


  8. /* Notes:
  9.  * This is used to implement a language using a class hierarchy
  10.  */

  11. namespace Interpreter_DesignPattern
  12. {
  13.     using System;
  14.     using System.Collections;

  15.     class Context
  16.     {
  17.         private string contextString;
  18.         public string ContextString
  19.         {
  20.             set { contextString = value; }
  21.             get { return contextString; }
  22.         }

  23.     }

  24.     abstract class AbstractExpression
  25.     {
  26.         abstract public void Interpret(Context c);
  27.     }

  28.     // class for terminal symbol

  29.     class TerminalExpression : AbstractExpression
  30.     {
  31.         override public void Interpret(Context c)
  32.         {
  33.             Console.WriteLine("终端解释程序");
  34.         }
  35.     }

  36.     // class for grammar rule (one per rule needed)

  37.     class NonterminalExpression : AbstractExpression
  38.     {
  39.         override public void Interpret(Context c)
  40.         {
  41.             Console.WriteLine("非终端解释程序");
  42.         }
  43.     }
  44.     // to extend grammar, just add other NonterminalExpression classes


  45.     ///

  46.     /// Summary description for Client.

  47.     ///

  48.     public class Client
  49.     {
  50.         public static int Main(string[] args)
  51.         {
  52.             Context c = new Context();
  53.             ArrayList l = new ArrayList(); //really need a tree here!


  54.             // build up context information

  55.             // . . .


  56.             // Populate abstract syntax tree with data

  57.             l.Add(new TerminalExpression());
  58.             l.Add(new NonterminalExpression());
  59.             l.Add(new TerminalExpression());
  60.             l.Add(new TerminalExpression());

  61.             // interpret

  62.             foreach (AbstractExpression exp in l)
  63.             {
  64.                 exp.Interpret(c);
  65.             }
  66.             Console.Read();
  67.             return 0;
  68.         }
  69.     }
  70. }
阅读(929) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~