📄 globals.h
字号:
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 + -