www.pudn.com > subpas.rar > GLOBALS.H
/****************************************************/ /* File: globals.h */ /* Global types and vars for SubPas compiler */ /* must come before other include files */ /****************************************************/ #ifndef _GLOBALS_H_ #define _GLOBALS_H_ #include#include #include #include #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define MAXTOKENLEN 40 typedef int TokenType; extern FILE* source; /* source code text file */ extern FILE* listing; /* listing output text file */ extern FILE* asmfile; /* code text file for TM simulator */ extern int lineno; /* source line number for listing */ /**************************************************/ /*********** Syntax tree for parsing ************/ /**************************************************/ typedef enum {Pro,Stmt,Exp} NodeKind; //节点的大类别:过程,语句,表达式 typedef enum {MainP,SubP} ProKind; //过程的小类别:主过程,子过程(包括子函数) //语句的小类别:if语句,while语句,函数调用语句,赋值语句,返回值语句 typedef enum {IfK,WhileK,CallK,AssignK,ReturnK} StmtKind; //表达式的小类别:运算操作,变量,过程调用,整数,实数,布尔值,取反操作,数组变量 typedef enum {OpK,IdK,AnotherCallK,NumK,RealNumK,BoolK,SignK,ArrayK} ExpKind; //参数调用类别:传值,传地址 typedef enum {ByVal,ByRefer} ParamKind; /* 数据类型 */ typedef enum {Integer,Real,Boolean,Array,Void} DataType; /*数组属性类型*/ typedef struct arrayAttr { DataType type; int low,high,count; } ArrayAttr; #define MAXCHILDREN 3 /*树节点定义*/ typedef struct treeNode { struct treeNode * child[MAXCHILDREN]; //孩子 struct treeNode * sibling; //兄弟 NodeKind nodekind; //节点的大类别 int lineno; //所在行 union { ProKind pro; StmtKind stmt; ExpKind exp;} kind; //节点的小类别 union { TokenType op; //运算操作类别 int intval; //整数或true(1)、false(0)的值 float realval; //实数的值 ArrayAttr* arrayattr; //数组变量声明的属性 ParamKind paramkind; //参数声明的属性,传值还是传地址 }attr; DataType type; //节点的数据类型(integer、boolean、real) int offset; //在堆栈中相对于BP的偏移值,用于代码生成 char* name; //ID的名字,如变量名,函数名,参数名等 char* ltrue; //用于跳转语句的生成 char* lfalse; //同上 } TreeNode; /**************************************************/ /*********** Flags for tracing ************/ /**************************************************/ /* TraceScan = TRUE 则在词法分析过程中将分析出来的 * token 打印到listing文件中 */ extern int TraceScan; /* TraceParse = TRUE 则在语法分析完毕后打印语法树到 * listing文件中 */ extern int TraceParse; /*生成的语法树的根节点*/ extern TreeNode * syntaxTree; /* Error = TRUE 指明前一个编译过程是否发生错误 */ extern int Error; //程序中是否用到实数,若用到,则进行相关处理(如初始化浮点运算器) extern int RealUsed; //是否用到Readln语句 extern int ReadlnUsed; //是否用到Writeln语句 extern int WritelnUsed; #endif