天天看點

設計模式-行為-解釋器

#pragma once

#include <string>
using namespace std;

class Context //表述内容
{
public:
  Context();
  ~Context();
protected:
private:
};

class AbstractExpression //抽象表達式
{
public:
  virtual ~AbstractExpression();
  virtual void Interpret(const Context& c);
protected:
  AbstractExpression();
private:
};
class  TerminalExpression:public //終止符表達式
  AbstractExpression
{
public:
  TerminalExpression(const  string&statement);
  ~TerminalExpression();
  void Interpret(const Context& c);
protected:
private:
  string _statement;
};
class  NonterminalExpression:public //非終止符表達式
  AbstractExpression
{
public:
  NonterminalExpression(AbstractExpression* expression,int times);
  ~NonterminalExpression();
  void Interpret(const Context& c);
protected:
private:
  AbstractExpression* _expression;
  int _times;
};      
#include "StdAfx.h"
#include "interpreter_impl.h"

#include <iostream>
using namespace std;
//Context.cpp

Context::Context()
{
}
Context::~Context()
{
}

//interpret.cpp

AbstractExpression::AbstractExpression()
{
}
AbstractExpression::~AbstractExpression()
{
}
void  AbstractExpression::Interpret(const Context& c)
{
}
TerminalExpression::TerminalExpression(const string& statement)
{
  this->_statement = statement;
}
TerminalExpression::~TerminalExpression()
{
}
void  TerminalExpression::Interpret(const Context& c)
{
  cout<<this->_statement<<"TerminalExpression"<<endl;
}
NonterminalExpression::NonterminalExpression(AbstractExpression* expression,int times)
{
  this->_expression = expression;
  this->_times = times;
}
NonterminalExpression::~NonterminalExpression()
{
}
void  NonterminalExpression::Interpret(const Context& c)
{
  for (int i = 0; i < _times ; i++)
  {
    this->_expression->Interpret(c);
  }
}      
// Interpreter.cpp : 定義控制台應用程式的入口點。
//

#include "stdafx.h"

#include "interpreter_impl.h"
#include <stdlib.h>

//給定一個語言,定義它的文法的一種表示,并定義一個解釋器,
//這個解釋器使用該表示來解釋語言中的句子。
int _tmain(int argc, _TCHAR* argv[])
{
  Context* c = new Context();
  AbstractExpression*  te  =  new TerminalExpression("hello");
  AbstractExpression*  nte  =  new NonterminalExpression(te,2);
  nte->Interpret(*c);

  delete nte;
  system("pause");

  return 0;
}