解释器模式C++实现

简介

给定⼀个语⾔,定义它的⽂法的⼀种表示,并定义 ⼀个解释器,这个解释器使⽤该表示来解释语⾔中的句⼦。

解释器模式的动机

  • 搜索匹配⼀个模式的字符串是⼀个常见问题。
  • 正则表达式是描述字符串模式的⼀种标准语⾔。
  • 使⽤⼀种通⽤的搜索算法来解释执⾏⼀个正则表达式,该正则表达式定义了待匹配字符串的集合。
  • 解释器模式描述了如何为简单的语⾔定义⼀个⽂法,如何在该语⾔中表示⼀个句⼦,以及如何解释这些句⼦。

结构

解释器模式主要包含如下几个角色

  • AbstractExpression: 抽象表达式。声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。
  • TerminalExpression: 终结符表达式。实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。
  • NonterminalExpression: 非终结符表达式。为文法中的非终结符相关的解释操作。
  • Context: 环境类。包含解释器之外的一些全局信息。
  • Client: 客户类。

抽象语法树描述了如何构成一个复杂的句子,通过对抽象语法树的分析,可以识别出语言中的终结符和非终结符类。 在解释器模式中由于每一种终结符表达式、非终结符表达式都会有一个具体的实例与之相对应,所以系统的扩展性比较好。


实例

利用解释器模式,打印并计算实现浮点数的四则运算。

例如,对于如下表达式:

3+((4*6)-(7/2))

输出:

3+((4*6)-(7/2))=23.5

实验UML图

代码

为了使表达式显示出来需要增加一个括号类。最高的抽象接口是Expression,加减乘除括号变量常量均继承自Expression类。

结果


总结

Context在本次实验中可以不用——除了上述用于表示表达式的类以外,通常在解释器模式中还提供了一个环境类Context,用于存储一些全局信息,通常在Context中包含了一个HashMap或ArrayList等类型的集合对象(也可以直接由HashMap等集合类充当环境类),存储一系列公共信息,如变量名与值的映射关系(key/value)等,用于在进行具体的解释操作时从中获取相关信息。

2 评论

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注