C++设计模式之解释器模式
2024-08-26 07:57:24
2013年07月06日 19:43:00
阅读数:8853
概述:
未来机器智能化已然成为趋势,现在手机都能听懂英语和普通话,那我大中华几万种方言的被智能化也许也是趋势,我们的方言虽然和普通话相似,但是还是不一样的。这可能需要一个新的语法分析器来帮助我们。
我们的解释器模式就是描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。
但是解释一门自然语言是复杂的过程,我们以加减运算为例子来详细解释解释器模式。
UML类图:
// Interpreter.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <map>
#include <string>
#include<iostream>
using namespace std; class Context
{
private:
map<string,int> valueMap; public:
void addValue(string key,int value)
{
valueMap.insert(std::pair<string,int>(key,value));
} int getValue(string key)
{
return valueMap[key];
}
}; class AbstractExpression
{
public :
virtual int interpreter(Context context) = ;
}; class AddNonterminalExpression:public AbstractExpression
{
private :
AbstractExpression *left;
AbstractExpression *right;
public:
AddNonterminalExpression(AbstractExpression *left, AbstractExpression *right)
{
this->left = left;
this->right = right;
}
int interpreter(Context context)
{
return this->left->interpreter(context) + this->right->interpreter(context);
}
}; class SubtractNonterminalExpression:public AbstractExpression
{
private :
AbstractExpression *left;
AbstractExpression *right;
public:
SubtractNonterminalExpression(AbstractExpression *left, AbstractExpression *right)
{
this->left = left;
this->right = right;
}
int interpreter(Context context)
{
return this->left->interpreter(context) - this->right->interpreter(context);
}
}; class TerminalExpression :public AbstractExpression
{
private:
int i;
public:
TerminalExpression(int i)
{
this->i = i;
}
int interpreter(Context context)
{
return this->i;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
//a-b+c
cout<<"解释器模式:a-b+c"<<endl;
Context context;
context.addValue("a",);
context.addValue("b",);
context.addValue("c",);
SubtractNonterminalExpression *subtractValue = new SubtractNonterminalExpression(new TerminalExpression(context.getValue("a")),new TerminalExpression(context.getValue("b")));
AddNonterminalExpression *addValue = new AddNonterminalExpression(subtractValue,new TerminalExpression(context.getValue("c")));
cout<< addValue->interpreter(context)<<endl;
return ;
}
最新文章
- Oracle 11g系列:约束
- GPU基本概念详解
- 一、HTML和CSS基础--网页布局--如何用css进行网页布局
- 蓝牙BLE ATT剖析(一)
- 《深入Java虚拟机学习笔记》- 第5章 Java虚拟机
- Socket之UDP分包组包
- Java基础知识强化之集合框架笔记50:Map集合之Map集合的概述和特点
- java基础01
- STL内存分配
- 通俗易懂的Java序列化原理
- 在centos6编译配置httpd2.4的N种方法
- LeetCode之“数学”:Rectangle Area
- jmeter接口测试------基础笔记
- 使用cpanm安装perl相关模块
- Css预处理器---Less(二)
- jade直接写类似JavaScript语法的东西,不需要写script
- 在ViewDidLoad中往导航栈推ViewController报错
- wget 抓取整站
- gulp 定义依赖关系
- Selenium - Switch &; Select Api
热门文章
- spring boot 启动后执行初始化方法
- opencv-python 学习初探2 去图片水印
- [Java中实现国际化] - 配合thymeleaf实现中英文自动切换(多语言)
- axis2框架用wsdl文件生成的服务端MessageReceiveInOut文件注意事项
- ftp协议及vsftpd的基本应用
- UVa 1660 电视网络(点连通度+最小割最大流+Dinic)
- UVa 437 巴比伦塔
- shell 使用变量
- Could not find a package configuration file provided by ";ecl_build";,.................couldn&#39;t find required component &#39;ecl_build&#39;
- 解决在nginx+php环境下$_SERVER[&#39;PHP_SELF&#39;]获取不到值的问题