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

📄 typedef.h

📁 pl0编译器
💻 H
字号:
//TypeDef.h

//本文件定义从词法到语义所有的内部表示

#pragma once
using namespace std;

//定义符号的类型(注意,其中内容和name数组是一致的。)
typedef enum {Vn,Key,Border,Arithmetic,Relation,Intc,Charc,Id,$,Action,Default,Eof} symbol_type;
//定义符号的结构,即类型和在表中的偏移
typedef pair < symbol_type, int > symbol; // a symbol in the grammer
//定义字符串到内部符号的映射,即关联数组
typedef map < string, symbol, less<string> > symbols;
//定义终极符和非终极符
typedef symbol nonterminal;
typedef symbol terminal;
//定义产生式的结构,一个非终极符作为左部, 一个符号数组作为右部
struct production
{
	nonterminal lhs;
	vector<symbol> rhs;
};

//定义TOKEN的内部类型
class TOKEN
{
public:
	TOKEN(symbol v, int l):value(v),line(l) {};
	~TOKEN() {};
	symbol value; //TOKEN的内部表示
	int line; //该TOKEN对应的文本所在行数
};


//initalizing semantic analyser

//*****************************************************
// **********语义分析需要用到的类型及变量定义************
 //*****************************************************


//标识符的类型:类型,变量,产生式的标识符
typedef  enum    {typeKind,varKind,procKind} IdKind;

//变量的类别。dir表直接变量(值参),indir表示间接变量(变参)						
typedef  enum    {dir,indir} AccessKind;

struct typeIR;
//标识符的属性结构定义
typedef struct 
{
	struct typeIR  * idtype;		//指向标识符的类型内部表示
	IdKind    kind;					//标识符的类型
	union   
	{
		struct
		{
			AccessKind   access;   //判断是变参还是值参
			int          level;    
			int          off;
			bool         isParam;  //判断是参数还是普通变量

		}VarAttr;//变量标识符的属性	
		struct
		{
			int         level;     //该过程的层数
			               
		}ProcAttr;//过程名标识符的属性
	
	}More;//标识符的不同类型有不同的属性

}AttributeIR;




//*****************************************************
// *****************   类型内部表示    ******************
 //*****************************************************

//类型的枚举定义
typedef  enum {intTy,charTy,arrayTy,recordTy,boolTy} TypeKind;


struct typeIR;
struct field;
//域类型单元结构定义
typedef struct field
{
	char * id;              //变量名/
	int    off;                 //所在记录中的偏移
	struct typeIR  *  UnitType; //域中成员的类型
	struct field * next;  //指向下一个域成员
}Field;


//类型的内部结构定义
typedef   struct  typeIR
{	
	int				size;   //类型所占空间大小
	TypeKind		kind;
	union
	{   struct
		{	
			struct typeIR  * elemTy; //记录数组元素的类型
			int    low;     //记录数组类型的下界
			int    top;      //记录数组类型的上界
		}ArrayAttr;
		 Field  * body;  //记录类型中的域
	} More;
}TypeIR;

//语义记录的类型:整型常量,标识符,类型,域,数组,错误
enum semantic_record_kind { INTC, ID, TYPE, FIELD, ARRAY, ERROR };

//定义语义记录
typedef struct sem_rec
{
	enum semantic_record_kind record_kind;
	union
	{
		int intc; //INTC
		char *id_record; //ID
		TypeIR * type_record; //TYPE
		struct field * field_record; //FIELD
		
		int err_record; //ERROR
	} sem_info;
} semantic_record;






⌨️ 快捷键说明

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