Visitor Pattern -- 基于编译试验抽象语法树 (C++)

1. Visitor.h

#ifndef VISITOR_H

#define VISITOR_H



class Visitor;



class Node

{

public:

	 virtual void Accept(Visitor &v) = 0;

};



class Exp : public Node 

{};



class Unary : public Exp 

{

	friend class ShowVisitor;

private:

	char op;

	Exp *left;



public:

	Unary();

	Unary(char opt, Exp *l);

	virtual void Accept(Visitor &v);

};



class Binary : public Unary

{

	friend class ShowVisitor;

private:

	Exp *right;



public:

	Binary();

	Binary(char opt, Exp *l, Exp *r); 

	virtual void Accept(Visitor &v);

};



class Number : public Exp

{

	friend class ShowVisitor;

private:

	int value;



public:

	Number();

	Number(int v);

	virtual void Accept(Visitor &v);

};



/*************************************************/



class Visitor {

public:

	virtual void VisitUnary(Unary *u) = 0;

	virtual void VisitBinary(Binary *b) = 0;

	virtual void VisitNumber(Number *n) = 0;

};



class ShowVisitor : public Visitor

{

public:

	virtual void VisitUnary(Unary *u);

	virtual void VisitBinary(Binary *b);

	virtual void VisitNumber(Number *n);

};



#endif


2. Visitor.cpp

#include "Visitor.h"

#include <iostream>



Unary::Unary(char op, Exp *l)

{

	this->op = op;

	this->left = l;

}



Binary::Binary(char op, Exp *l, Exp *r):Unary(op, l)  

{

	

	this->right = r;

}



Number::Number(int v)

{

	this->value = v;

}



void Unary::Accept(Visitor &v)

{

	v.VisitUnary(this);

}



void Binary::Accept(Visitor &v)

{

	v.VisitBinary(this);

}



void Number::Accept(Visitor &v)

{

	v.VisitNumber(this);

}





/*********************************************************/



void ShowVisitor::VisitUnary(Unary *u)

{

	std::cout<<u->op<<std::endl;

	u->left->Accept(*this);

}



void ShowVisitor::VisitBinary(Binary *b)

{

	std::cout<<b->op<<std::endl;

	b->left->Accept(*this);

	b->right->Accept(*this);

}



void ShowVisitor::VisitNumber(Number *n)

{

	std::cout<<n->value<<std::endl;

}


3.main.cpp

#include "Visitor.h"

 

int main ()

{

	Visitor *v = new ShowVisitor();

	Number *n = new Number(5);

	Unary u('+', n);

	Binary b('-', n, n);



	n->Accept(*v);

	u.Accept(*v);

	b.Accept(*v);

	delete v;

	delete n;



	return  0;

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值