📄 global.h
字号:
/*形参表的结构定义*/
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 + -