深刻解析C++設計形式編程中說明器形式的應用。本站提示廣大學習愛好者:(深刻解析C++設計形式編程中說明器形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析C++設計形式編程中說明器形式的應用正文
說明器形式(interpreter),給定一個說話,界說它的文法的一種表現,並界說一個說明器,這個說明器應用該表現來說明說話中的句子。
說明器形式須要處理的是,假如一種特定類型的成績產生的頻率足夠高,那末能夠就值得將該成績的各個實例表述為一個簡略說話中的句子。如許便可以構建一個說明器,該說明器經由過程說明這些句子來處理該成績。當有一個說話須要說明履行,而且你可將該說話中的句子表現為一個籠統語法樹時,可以使用說明器形式。用懂得釋器形式,就意味著可以很輕易地轉變和擴大文法,由於該形式應用類來表現文律例則,你可以使用繼續來轉變或擴大該文法。也比擬輕易完成文法,由於界說籠統語法樹中各個節點的類的完成年夜體相似,這些類都易於直接編寫。
構造圖:
實例:
音樂說明器
playContext.h
/************************************************************************
* description: 吹奏內容
* remark:
************************************************************************/
#ifndef _PLAY_CONTEXT_H_
#define _PLAY_CONTEXT_H_
#include <string>
#include <iostream>
using namespace std;
class playContext
{
public:
string getPlayText()
{
return m_strText;
}
void setPlayText(const string& strText)
{
m_strText = strText;
}
private:
string m_strText;
};
#endif// _PLAY_CONTEXT_H_
expression.h
/************************************************************************
* description: 表達式類
* remark:
************************************************************************/
#ifndef _EXPRESSION_H_
#define _EXPRESSION_H_
#include "playContext.h"
class expression
{
public:
// 說明器
void interpret(playContext& PlayContext)
{
if (PlayContext.getPlayText().empty())
{
return;
}
else
{
string strPlayKey = PlayContext.getPlayText().substr(0, 1);
string strtemp = PlayContext.getPlayText().substr(2);
PlayContext.setPlayText(strtemp);
size_t nPos = PlayContext.getPlayText().find(" ");
string strPlayValue = PlayContext.getPlayText().substr(0, nPos);
int nPlayValue = atoi(strPlayValue.c_str());
nPos = PlayContext.getPlayText().find(" ");
PlayContext.setPlayText(PlayContext.getPlayText().substr(nPos + 1));
excute(strPlayKey, nPlayValue);
}
}
// 履行
virtual void excute(string& strKey, const int nValue) = 0;
private:
};
#endif// _EXPRESSION_H_
note.h
/************************************************************************
* description: 音符類
* remark:
************************************************************************/
#ifndef _NOTE_H_
#define _NOTE_H_
#include "expression.h"
class note : public expression
{
public:
virtual void excute(string& strKey, const int nValue)
{
char szKey[2];
strncpy(szKey, strKey.c_str(), strKey.length());
string strNote;
switch (szKey[0])
{
case 'C':
strNote = "1";
break;
case 'D':
strNote = "2";
break;
case 'E':
strNote = "3";
break;
case 'F':
strNote = "4";
break;
case 'G':
strNote = "5";
break;
case 'A':
strNote = "6";
break;
case 'B':
strNote = "7";
break;
default:
strNote = "error";
break;
}
cout << strNote << " ";
}
};
#endif// _NOTE_H_
scale.h
/************************************************************************
* description: 音階類
* remark:
************************************************************************/
#ifndef _SCALE_H_
#define _SCALE_H_
#include "expression.h"
class scale : public expression
{
public:
virtual void excute(string& strKey, const int nValue)
{
string strScale;
switch (nValue)
{
case 1:
strScale = "高音";
break;
case 2:
strScale = "中音";
break;
case 3:
strScale = "低音";
break;
default:
strScale = "error";
break;
}
cout << strScale << " ";
}
private:
};
#endif// _SCALE_H_
speed.h
#ifndef _SPEED_H_
#define _SPEED_H_
#include "expression.h"
class speed : public expression
{
public:
virtual void excute(string& strKey, const int nValue)
{
string strSpeed;
if (nValue < 3)
{
strSpeed = "疾速";
}
else if (nValue >= 6)
{
strSpeed = "慢速";
}
else
{
strSpeed = "中速";
}
cout << strSpeed << " ";
}
};
#endif// _SPEED_H_
客戶端: InterpreterApp.cpp
// InterpreterApp.cpp : 界說掌握台運用法式的進口點。
//
#include "stdafx.h"
#include "note.h"
#include "scale.h"
#include "speed.h"
#include "playContext.h"
int _tmain(int argc, _TCHAR* argv[])
{
playContext context;
cout << "Music:";
context.setPlayText("T 2 O 2 E 3 G 5 G 5 ");
expression* expressObj = NULL;
while (!context.getPlayText().empty())
{
string strSep = context.getPlayText().substr(0, 1);
char szKey[2];
strncpy(szKey, strSep.c_str(), strSep.length());
switch (szKey[0])
{
case 'O':
expressObj = new scale();
break;
case 'T':
expressObj = new speed();
break;
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
case 'A':
case 'B':
case 'P':
expressObj = new note();
break;
default:
break;
}
if (NULL != expressObj)
{
expressObj->interpret(context);
}
}
system("pause");
return 0;
}
缺乏的地方
說明器形式缺乏的是,說明器形式為文法中的每條規矩至多界說了一個類,是以包括很多規矩的文法能夠難以治理和保護。建議當文法異常龐雜時,應用其他的技巧如語法剖析法式或編譯器生成器來處置。
實用場景