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

📄 globals.h

📁 学习编译原理
💻 H
📖 第 1 页 / 共 2 页
字号:
			int         codeEntry ;/*过程入口标号,用于中间代码生成*/     
			               
		}ProcAttr;/*过程名标识符的属性*/
	
	}More;/*标识符的不同类型有不同的属性*/

}AttributeIR;
                        

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

}SymbTable;
	
/*使用scope栈的局部符号表方法中所用到的scope栈*/
extern SymbTable * scope[1000];

/*scope栈的层数*/
extern int Level;

/*在同层的变量偏移*/
extern int Off;

/*记录主程序的displayOff*/
extern int mainOff;

/*记录当前层的displayOff*/
extern int savedOff;




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

/*类型的枚举定义*/
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;

extern  BackAddr  *AddrTop;

extern  int AddrEMPTY;



/********************************************************************/
/* 源代码文本文件指针source */
extern FILE *source;

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

/*词法分析结果Token序列的存储文件指针fp*/
extern FILE* fp;

/*目标代码文件指针*/
extern FILE  *code;

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

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

/*scope栈的层数*/
extern int Level;

/*在同层的变量偏移*/
extern int Off;

/*记录主程序的displayOff*/
extern int mainOff;

/*记录当前层的displayOff*/
extern int savedOff;

/******************************/
/*生成中间代码部分时用到的变量*/
/******************************/
/*临时变量编号*/
extern  int  TempOffset;
/*标号值*/
extern  int  Label ;

/*第一条中间代码*/
extern  CodeFile  *firstCode ;
/*最后一条中间代码*/
extern  CodeFile  *lastCode ;



extern  CodeFile  *baseBlock[100];

extern  int  blocknum ;

extern  ValuNum  *valuNumT;

extern  UsableExpr  *usableExprT;

extern  TempEqua  *tempEquaT;

/*循环信息栈*/
extern  LoopStack  *loopTop;
extern  bool  loopStackEmpty;



/*保存主程序的display表的偏移*/
extern  int StoreNoff ;



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

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

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

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

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


extern int TraceCode;

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

#endif
	

⌨️ 快捷键说明

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