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

📄 global.h

📁 SNL语言的编译器
💻 H
📖 第 1 页 / 共 2 页
字号:

/*形参表的结构定义*/
typedef struct  paramTable
{ 
	struct symbtable   *  entry;/*指向该形参所在符号表中的地址入口*/
	struct paramTable  *  next;
}ParamTable;


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

		}VarAttr;/*变量标识符的属性*/	
		struct
		{
			int         level;     /*该过程的层数*/

			ParamTable  * param;   /*参数表*/

			int         mOff;	   /*过程活动记录的大小*/
			                
			int         nOff;  	   /*sp到display表的偏移量*/
							
			int         procEntry; /*过程的入口地址*/

			int         codeEntry ;/*过程入口标号,用于中间代码生成*/     
			               
		}ProcAttr;/*过程名标识符的属性*/
	
	}More;/*标识符的不同类型有不同的属性*/

}AttributeIR;
                        

/*符号表的结构定义*/
typedef struct  symbtable
{
	char  idName[10];
	AttributeIR  attrIR;
	struct symbtable  *  next;

}SymbTable;


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

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


//struct typeIR;

/*域类型单元结构定义*/
typedef struct fieldchain
{
	char   id[10];              /*变量名*/
	int    off;                 /*所在记录中的偏移*/
	struct typeIR  *  UnitType; /*域中成员的类型*/
	struct fieldchain  * Next;
}fieldChain;


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



/**************************************************************/
/******下面是中间代码生成部分需要用到的类型及变量定义**********/
/**************************************************************/

/*ARG结构分为:标号,数值,地址三种*/
typedef  enum { LabelForm , ValueForm , AddrForm }  ArgForm ;

/*定义ARG结构*/
typedef struct    
{  ArgForm   form ;
   union 
    {   int  value ;  /*纪录整数值*/
    	int  label ;  /*纪录标号的值*/
        struct  
		{   char    name[10] ;	/*注:变量名字已经没用,这里保留只是为了显示结果清晰*/
            int     dataLevel ;
		    int     dataOff ;
		    AccessKind  access ; /*类型AccessKind在前面定义*/
		}addr;   /*变量的ARG结构需要纪录的信息*/
   }Attr ;
} ArgRecord;

/*中间代码的类别*/
typedef  enum 
{ ADD , SUB , MULT ,DIV , EQC ,LTC,  
  READC, WRITEC ,RETURNC ,ASSIG,AADD ,LABEL,
  JUMP0, JUMP ,CALL, VARACT ,VALACT,
  PENTRY , ENDPROC, MENTRY,WHILESTART,ENDWHILE
}  CodeKind ;

/*中间代码的结构*/
typedef struct 
{    CodeKind   codekind;
     ArgRecord  *arg1;  /*以后考虑这里是用指针好,还是直接用
						  ArgRecord类型的变量好*/
     ArgRecord  *arg2;
     ArgRecord  *arg3;
} CodeR;

/*源程序对应的中间代码序列表示*/
typedef  struct  codeFile
{   CodeR  codeR;
	struct codeFile  *former;
    struct codeFile  *next ;
} CodeFile ;



/**************************************************************/
/******下面是常表达式优化需要用到的类型及变量定义**************/
/**************************************************************/

/*常量定值表,用于常表达式优化*/
typedef  struct  constDefT
{ 
    ArgRecord  *variable;  /*用变量的ARG结构表示变量*/
    int  constValue;       /*定值*/
	struct constDefT  *former;
    struct constDefT  *next;

} ConstDefT;


/**************************************************************/
/******下面是公共表达式优化需要用到的类型及变量定义************/
/**************************************************************/

/*值编码表ValuNum*/
typedef  struct  valuNum
{
	ArgRecord  *arg ;
    AccessKind  access;
	union
	{   int  valueCode ;   /*直接变量,存储值编码*/
	  struct 
	  { int   valuecode ;
		int   addrcode  ;
	  } twoCode;         /*间接临时变量,存储值编码和地址码*/ 

	} codeInfo;
   /*指向下一个节点指针*/
   struct valuNum  *next;

} ValuNum;

/*中间代码对应的映象码结构*/
typedef struct
{  int  op1;
   int  op2;
   int  result;
} MirrorCode;

/*可用表达式代码表UsableExpr*/
typedef  struct  usableExpr
{ 
  CodeFile   * code ;		  /*中间代码地址*/
  MirrorCode *  mirrorC;      /*映象码*/
  struct usableExpr  *next ;  /*指向下一个节点*/
} UsableExpr;


/*临时变量的等价表TempEqua*/
typedef  struct tempEqua
{
  ArgRecord  *arg1; /*被替换的临时变量*/
  ArgRecord  *arg2; /*用于替换的临时变量*/
  struct  tempEqua  *next;
} TempEqua ;


/**************************************************************/
/******下面是循环不变式优化需要用到的类型及变量定义************/
/**************************************************************/


/*循环信息表*/
typedef  struct
{
	int       state;        /*循环状况,为0时表示本层循环不可外提*/
	CodeFile  *whileEntry;  /*指向循环入口中间代码*/
    int       varDef;       /*指向本层循环的变量地址表起始处*/
	CodeFile  *whileEnd;    /*指向循环出口中间代码*/
} LoopInfo;
    
/*循环信息栈*/
typedef  struct loopStack
{ 
	LoopInfo  *loopInfo;
    struct loopStack  *under;

} LoopStack;




/**************************************************************/
/******下面是目标代码生成部分需要用到的类型及变量定义**********/
/**************************************************************/

/*标号地址表*/
typedef  struct  labelAddr
{
	int  label;
	int  destNum;
    struct labelAddr  *next;
} LabelAddr;

/*处理回填地址要用到的数据结构*/
typedef struct  backAddr
{  int  backLoc;
   struct  backAddr  *former;
} BackAddr;



/**********************多个文件公有变量部分**********************/

/* 列表输出文件指针listing */
 FILE* listing; 

 /*Token序列中的token数目*/
 int Tokennum;

/*清单的行号*/
 int lineno;

 /*目标代码文件*/
 FILE  *	code;

 /****************************************************************/
/*************************************
 ***********   追踪标志   ************
 *************************************/

/* 源程序追踪标志,如果该标志为TRUE			 *
 * 语法分析时将源程序行号写入列表文件listing */
 int EchoSource ;

/* 词法扫描追踪标志,如果该标志为TRUE				   *
 * 将每个被词法扫描器识别的单词信息写入列表文件listing */
 int TraceScan;

/* 语法分析追踪标志,如果该标志为TRUE				     *
 * 将语法树以线性形式(使用子节点缩进)写入列表文件listing */
 int TraceParse;

/* 语义分析追踪标志,如果该标志为TRUE	 *
 * 将符号表插入和查找写入列表文件listing */
 int TraceTable;


 int TraceCode ;

/* 错误追踪标志,如果该标志为TRUE *
 * 防止错误产生时进一步传递错误  */
 int Error;

};

#endif // !defined(AFX_GLOBAL_H__DA8B3700_55CD_4AF5_8E37_89AF1BDDE755__INCLUDED_)

⌨️ 快捷键说明

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