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

📄 globals.h

📁 SNL语言编译器源码 小语言的编译器C++实现 包括词法分析
💻 H
字号:
/************************************************************/
/* 文件	 globals.h											*/
/* 说明  类PASCAL语言编译器的全局类型和变量,应在其他包含文件之前	*/
/* 主题  编译器结构:原理和实例								*/	
/************************************************************/

/* 如已经联入头文件globals.h则不再联入 */
#ifndef _GLOBALS_H_
#define _GLOBALS_H_

/****** globals.h所包含头文件 ******/
#include "stdio.h"
#include "stdlib.h"

/* 定义常量FALSE为0 */
#ifndef FALSE
#define FALSE 0
#endif

/* 定义常量TRUE为1 */
#ifndef TRUE
#define TRUE 1
#endif



/* 定义保留字数量常量MAXRESERVED为21 */
#define MAXRESERVED 21


/* MAXTOKENLEN为单词最大长度定义为40 */
#define MAXTOKENLEN 40

/*初始化符号表中变量的偏移*/
#define INITOFF 7

/* SCOPESIZE为符号表scope栈的大小*/
#define SCOPESIZE 1000

/*定义token的长度*/
#define TOKENLEN sizeof (TokenType)

/*定义链表节点的长度*/
#define CHAINNODELEN sizeof (ChainNodeType) 


/********************** 单词的词法类型 ********************/
typedef enum 
{
	/* 簿记单词符号 */
    ENDFILE,	ERROR,
	/* 保留字 */
    PROGRAM,	PROCEDURE,	TYPE,	VAR,		IF,
	THEN,		ELSE,		FI,		WHILE,		DO,
	ENDWH,		BEGIN,		END,	READ,		WRITE,
	ARRAY,		OF,			RECORD,	RETURN, 

	INTEGER,	CHAR,
	/* 多字符单词符号 */
    ID,			INTC,		CHARC,
    /*特殊符号 */
	ASSIGN,		EQ,			LT,		PLUS,		MINUS,
	TIMES,		OVER,		LPAREN,	RPAREN,		DOT,
	COLON,		SEMI,		COMMA,	LMIDPAREN,	RMIDPAREN,
	UNDERANGE
} LexType;


/*********** 单词的类型,包括词法信息和语义信息 ************/
typedef struct tokenType
    { int     lineshow;
	  LexType Lex;
      char    Sem[MAXTOKENLEN+1];
    } TokenType; 


/***********链表的结点类型,包括Token部分和指针部分**********/
typedef struct  node  
    { TokenType   Token;      //单词
      struct node *nextToken; //指向下一个单词的指针
    } ChainNodeType; 

///////////////////////////////////////////////////////////////////////////////////////////
typedef enum
   { START,INASSIGN,INRANGE,INCOMMENT,INNUM,INID,INCHAR,DONE }
   StateType;


/* tokenString用于保存标识符和保留字单词的词元,长度41 */
static char tokenString[MAXTOKENLEN+1];


/* BUFLEN源代码行的输入缓冲区长度为256 */
#define BUFLEN 256


/* lineBuf为当前输入代码行缓冲区 */
extern char lineBuf[BUFLEN];


/* linepos为在代码缓冲区LineBuf中的当前字符位置,初始为0 */
extern int linepos;


/* bufsize为当前缓冲器中所存字串大小 */
extern int bufsize;


/* EOF_flag当为文件尾时,改变函数ungetNextChar功能 */
extern int EOF_flag ;


/******************* 保留字查找表 ********************/

static struct
    { char*   str;
      LexType tok;				
    } reservedWords[MAXRESERVED]
	= { {"program",PROGRAM},{"type",TYPE},{"var",VAR},{"procedure",PROCEDURE}
	   ,{"begin",BEGIN},{"end",END},{"array",ARRAY},{"of",OF},{"record",RECORD}
       ,{"if",IF},{"then",THEN},{"else",ELSE},{"fi",FI},{"while",WHILE}
	   ,{"do",DO},{"endwh",ENDWH},{"read",READ},{"write",WRITE},{"return",RETURN}
	   ,{"integer",INTEGER},{"char",CHAR}  };



/******************************************************
 ******************   语法分析树   ********************
 ******************************************************/

/*语法树根节点ProK,程序头结点PheadK,声明类型节点DecK,
  标志子结点都是类型声明的结点TypeK,标志子结点都是变量声明的结点VarK,
  函数声明结点FuncDecK,语句序列节点StmLK,语句声明结点StmtK,
  表达式结点ExpK*/
typedef enum {ProK,PheadK,DecK,TypeK,VarK,ProcDecK,StmLK,StmtK,ExpK}
              NodeKind;


/*声明类型Deckind 类型的枚举定义:
  数组类型ArrayK,字符类型CharK,
  整数类型IntegerK,记录类型RecordK,
  以类型标识符作为类型的IdK*/ 
typedef enum {ArrayK,CharK,IntegerK,RecordK,IdK}  DecKind;



/* 语句类型StmtKind类型的枚举定义:			*
 * 判断类型IfK,循环类型WhileK				*
 * 赋值类型AssignK,读类型ReadK              *
 * 写类型WriteK,函数调用类型CallK          */
typedef enum {IfK,WhileK,AssignK,ReadK,WriteK,CallK,ReturnK} StmtKind;


/* 表达式类型ExpKind类型的枚举定义:         *
 * 操作类型OpK,常数类型ConstK,变量类型VarK */
typedef enum {OpK,ConstK,VariK} ExpKind;


/* 变量类型VarKind类型的枚举定义:           *
 * 标识符IdV,数组成员ArrayMembV,域成员FieldMembV*/
typedef enum {IdV,ArrayMembV,FieldMembV} VarKind; 


/* 类型检查ExpType类型的枚举定义:           *
 * 空Void,整数类型Integer,字符类型Char      */ 
typedef enum {Void,Integer,Boolean} ExpType;

/* 参数类型ParamType类型的枚举定义:        *
 * 值参valparamType,变参varparamType        */
typedef enum {valparamType,varparamType} ParamType; 

/* 定义语法树节点的最大子节点数MAXCHILDRREN为3 */
/* 过程声明部分的子节点child[0]指向参数部分,
   子节点child[1]指向声明体部分,子节点child[2]
   指向函数的语句部分;*/ 
#define MAXCHILDREN 3 

/*提前声明符号表结构*/
struct symbtable;

/********** 语法树节点treeNode类型 *********/
typedef struct treeNode

   { 
	 struct treeNode * child[MAXCHILDREN];		/* 子节点指针	*/			
     struct treeNode * sibling;					/* 兄弟节点指针	*/
     int lineno;								/* 源代码行号	*/
     NodeKind nodekind;						    /* 节点类型		*/
     union 
	 {
		 DecKind  dec;
	     StmtKind stmt; 
		 ExpKind  exp; 
	 } kind;                       /* 具体类型     */

	 int idnum;                    /* 相同类型的变量个数 */ 
	 
	 char name[10][10];            /* 标识符的名称  */

	 struct symbtable * table[10]; /* 与标志符对应的符号表地址,在语义分析阶段填入*/  

	 struct 
	 {
		struct
			{	
				int low;              /* 数组下界     */
				int up;               /* 数组上界     */
				DecKind   childtype;  /* 数组的子类型 */
			}ArrayAttr;               /* 数组属性     */
	         
		struct
			{	
				ParamType  paramt;     /* 过程的参数类型*/
			}ProcAttr;                 /* 过程属性      */ 
		
		struct
			{
				LexType op;           /* 表达式的操作符*/						
				int val;		      /* 表达式的值	   */ 
				VarKind  varkind;     /* 变量的类别    */
				ExpType type;         /* 用于类型检查  */
			}ExpAttr;	              /* 表达式属性    */

      char type_name[10];             /* 类型名是标识符  */      
             
	 } attr;                          /* 属性	       */
}TreeNode;

/*非终极符的总数*/
#define  NTMLNUM    68

/*终极符的总数*/
#define  TMLNUM     42

/******************************************************
 **********语义分析需要用到的类型及变量定义************
 ******************************************************/


/*标识符的类型*/
typedef  enum    {typeKind,varKind,procKind}IdKind;

/*变量的类别。dir表直接变量(值参),indir表示间接变量(变参)*/						
typedef  enum    {dir,indir}AccessKind;

/*形参表的结构定义*/
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;



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





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

/*清单的行号*/
extern int lineno;
/*************************************
 ***********   追踪标志   ************
 *************************************/

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

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

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

extern int Error;
#endif

⌨️ 快捷键说明

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