解释器模式
时间:2022-04-26
本文章向大家介绍解释器模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、简介
1、解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2、类成员
(1)AbstractExpression(抽象表达式):声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
(2)TerminalExpression(终结符表达式):实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的接口,主要是一个interpreter()方法。文法中每一个终结符都有一个具体终结表达式与之相对应。
(3)NonterminalExpression(非终结符表达式):为文法中的非终结符实现解释操作。
(4)Context:包含解释器之外的一些全局信息。
3、UML
4、所属类别:行为型
二、C++程序
1 // 解释器模式.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 #include<string>
7 #include<sstream>
8 #include<vector>
9 using namespace std;
10
11 class Contex
12 {
13 public:
14 string tex;
15 Contex(){}
16 ~Contex(){}
17 void set_contex(string s)
18 {
19 tex=s;
20 }
21 string get_contex()
22 {
23 return tex;
24 }
25 };
26 class Expression
27 {
28 public:
29 Expression(){}
30 virtual ~Expression(){}
31 //选择出contex的前两个非空格字符,第一个赋值给key,第二个赋值给value
32 //然后将contex类中的前两个非零字符删除掉
33 virtual void interrupt(Contex * contex)
34 {
35 if (contex->tex.length()==0)
36 {
37 return ;
38 }
39 else
40 {
41 string str,buf,strr;
42 vector<string>strs;
43 str=contex->get_contex();
44 //取出前两个字符串
45 string key,value;
46 key=str[0];
47 value=str[2];
48 excute(key,value);
49 str.erase(0,4);
50 /*//将str字符串按空格拆分成多个字符串,存放在strs数组中
51 stringstream ss=stringstream(str);
52 while(ss>>buf)
53 {
54 strs.push_back(buf);
55 }
56 //删除已经取出的字符串,将剩下的字符串重新组合成一个字符写入contex中
57 vector<string>::iterator it=strs.begin();
58 strs.erase(it,(it+1));
59 it=strs.begin();
60 string s=(*it);
61 for(;it!=strs.end();it++)
62 {
63 s=s+' '+(*it);
64 }*/
65 contex->set_contex(str);
66
67 }
68
69 }
70 virtual void excute(string key,string value)=0;
71 };
72 class Yindiao:public Expression
73 {
74 public:
75 Yindiao(){}
76 virtual ~Yindiao(){}
77 virtual void excute(string k,string value)
78 {
79 string note;
80 switch(k[0])
81 {
82 case 'C':
83 note="1";
84 break;
85 case 'D':
86 note="2";
87 break;
88 case 'E':
89 note="3";
90 break;
91 case 'F':
92 note="4";
93 break;
94 case 'G':
95 note="5";
96 break;
97 case 'A':
98 note="6";
99 break;
100 case 'B':
101 note="7";
102 break;
103 }
104 cout<<note<<endl;
105 }
106 };
107 class Yinfu:public Expression
108 {
109 public:
110 Yinfu(){}
111 virtual ~Yinfu(){}
112 virtual void excute(string k,string value)
113 {
114 string scale;
115 switch(value[0])
116 {
117 case '1':
118 scale="低音";
119 break;
120 case '2':
121 scale="中音";
122 break;
123 case '3':
124 scale="高音";
125 break;
126 }
127 cout<<scale<<endl;
128 }
129 };
130 int _tmain(int argc, _TCHAR* argv[])
131 {
132 Contex *playcontex=new Contex();
133 playcontex->tex="O 2 E 1 A 1 O 1 A 2";
134 Expression* expression=NULL;
135 while(playcontex->tex.length()>0)
136 {
137 //取playtcontex的首字,并根据该首字进行具体的实例化
138 string str=playcontex->tex;
139 switch(str[0])
140 {
141 case 'O':
142 expression=new Yinfu();
143 break;
144 case 'C':
145 case 'D':
146 case 'E':
147 case 'F':
148 case 'G':
149 case 'A':
150 case 'B':
151 expression=new Yindiao();
152 break;
153 }
154 expression->interrupt(playcontex);
155 }
156 return 0;
157 }
- asp.net生成静态页
- Enterprise Library深入解析与灵活应用(1):通过Unity Extension实现和Policy Injection Application Block的集成
- 照虎画猫写自己的Spring
- 照虎画猫写自己的Spring
- mybatis 框架实战,实现数据库的增删改查
- CodeSmith 创建Ado.Net自定义模版(一)
- CodeSmith 创建Ado.Net自定义模版(二)
- 一文读懂卷积神经网络CNN
- NVIDIA张建中:自主学习芯片,推动人工智能发展
- CodeSmith 创建Ado.Net自定义模版(三)
- Android注解学习(2)
- Android注解学习(2)
- 机器学习之——距离度量学习
- Enterprise Library Policy Injection Application Block 之三:PIAB的扩展—创建自定义CallHandler(提供Source Code下载)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- koa中http服务与websocket服务共享端口
- 第23天:NLP实战(七)——中文新闻主题分类
- Swoole v4.5.3 版本发布
- .NET5.0 单文件发布打包操作深度剖析
- 使用ng-container标签在SAP Spartacus里插入UI
- 自定义SAP Spartacus Cart界面
- 还是只使用console.log()进行调试?好吧,其实还有更多。
- SNMP++: Transport is not supported
- Codeforces Round #666 (Div. 2) A-D
- 深度剖析前端JavaScript中的原型(JS的对象原型)
- dotnet OpenXML 颜色变换
- n维空间的多面体的有向测度和重心
- 只会Vue怎么开发小程序?Vue和微信小程序的到底有哪些区别?
- VBA CreateObject函数如何找到所需要的依赖文件
- dotnet OpenXML 如何获取 schemeClr 颜色