#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::Context()
{
}
Context::~Context()
{
}
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);
  }
}
#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;
}