⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbols.h

📁 基于ANTLR的简单编译器源码version0.1
💻 H
字号:
/*
   符号类及符号表类
   编写时间:2007-10-30
   修改时间:2007-11-1
*/
#ifndef SYMBOLS_H
#define SYMBOLS_H

#include <map>
#include <vector>
#include <string>
#include <fstream>
#include <boost/lexical_cast.hpp>
#include "data_type.h"

#define MISDEEM(A) if(A) return false
using namespace std;
using namespace boost;
/*#######################################################*/
//计算出的长度如果是无符号数时的长度,如果为有符号数的长度
struct DataLen{ 			
  DataLen():ulen(0),len(0){};
  int ulen;
  int len;
};
/*#######################################################*/
//用于保存变量或常量的各种参数
class TypeAttr{
public:	
	typedef enum{ISUNSIGNED,ISSINGED,UNKNOWN} SIGNED;//判断是否是无符号数。	
/*构造函数*/
public:
	TypeAttr():
	  m_type(NULL_T),
	  isInt(false),
	  isDouble(false),
	  m_signed(UNKNOWN){}
	  TypeAttr(const TypeAttr& type):
	   value(type.value),      
	   isInt(type.isInt),
	   isDouble(type.isDouble),
	   m_type(type.m_type),
	   m_signed(type.m_signed) { length.ulen=type.length.ulen; length.len=type.length.len;}
/*成员变量-----属性值*/
public:
    string    value;		//:所有的数据最终都可以存储为字符串。
	DataLen   length;		//:数据所占的字节数。
	bool      isInt;		//:是否属于int数据类型
	bool      isDouble;		//:是否属于double数据类型
	MY_TYPE   m_type;		//:类型,不能确定时是NULL_T,
	SIGNED    m_signed;		//:是否为无符号数,不能确定时为UNKNOWN。
/*成员函数-----行为值*/
public:
    void   SetType(MY_TYPE);			//:设置数据类型
	void   SetValue(string);			//:设置属性值
	bool   IsConvertable(TypeAttr t);	//:判断是否可以将其赋值给t
	void   BitToStr();					//:将Value值由位类型转换为1或0的字符串
	bool   BitsToStr();				    //:将value值由位串类型转换为0或1组成的字符串
	void   IsInt();				        //:设置isInt为true
	void   IsDouble();				    //:设置isDouble为true
	void   HexToStr();					//:将value值由16进制整型字符串转换为整数
	void   CharToStr();				    //:将value值由字符型去掉单引号。
	void   StrToStr();					//:将value值由字符串型去掉双引号
	void   CalcLen();					//  计算数据所占的空间大小。
};
/*#######################################################*/
/*符号类*/
class CSymbol{
/*构造函数*/
public:
   CSymbol(TypeAttr t):m_attr(t){id=ID++;}   
/*成员变量-----属性值*/	   
protected:  
	TypeAttr         m_attr;
	static int       ID;       //静态变量,为属于该类的所有对象所共有。
	int              id;       //非静态变量为单个对象所有。  
/*成员函数-----行为值*/
public:
   TypeAttr GetAttr(){return m_attr;}         //获取类型属性  
   int      GetId(){return id;}               //获取ID
   void     SetSymValue(string value){m_attr.value=value;}
};

/*############################################-*/
/*-----------------------符号表类----------------------*/
/*############################################*/
class CSymTable{
public:
   typedef map<string,CSymbol*>  SymbolMap;   
/*构造函数,析构函数*/
public:
	CSymTable():size(0){};
   ~CSymTable();
protected:
   SymbolMap  m_table;
   int        size;//所占空间总大小
public:
   void      AddSymb(TypeAttr t,string id,string value="");		//向符号表添加变量
   void      SetSymValue(string id,string value);               //设置变量值
   CSymbol*  GetSymb(string);                                   //查询符号
   void      SaveData(string file_name);                        //将数据写入配置文件中
   bool      CheckEmpty(string& warnings);                      //如果存在未使用的变量值,将warning信息输出
};
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -