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