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

📄 global.h

📁 SNL语言的编译器
💻 H
📖 第 1 页 / 共 2 页
字号:
// global.h: interface for the Cglobal class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_GLOBAL_H__DA8B3700_55CD_4AF5_8E37_89AF1BDDE755__INCLUDED_)
#define AFX_GLOBAL_H__DA8B3700_55CD_4AF5_8E37_89AF1BDDE755__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#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) 


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

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

/*LL1分析表的大小*/
#define  TABLESIZE  104

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


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

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



class Cglobal  
{
public:
	Cglobal();
	virtual ~Cglobal();
public:


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


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

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

/*语法树根节点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; 

/*提前声明符号表结构*/
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;


/******************类型和变量声明*********************/

/* 1.进行LL1语法分析用到的类型及对应的变量  */

/*所有非终极符,其各自含义可参考LL1文法*/
typedef enum
{ 
  Program,	      ProgramHead,	    ProgramName,	DeclarePart,
  TypeDec,        TypeDeclaration,	TypeDecList,	TypeDecMore,
  TypeId,	      TypeName,			BaseType,	    StructureType,
  ArrayType,      Low,	            Top,            RecType,
  FieldDecList,   FieldDecMore,	    IdList,	        IdMore,
  VarDec,	      VarDeclaration,	VarDecList,		VarDecMore,
  VarIdList,	  VarIdMore,		ProcDec,		ProcDeclaration,
  ProcDecMore,    ProcName,		    ParamList,		ParamDecList,
  ParamMore,      Param,		    FormList,		FidMore,
  ProcDecPart,    ProcBody,	    	ProgramBody,	StmList,
  StmMore,        Stm,				AssCall,		AssignmentRest,
  ConditionalStm, StmL,			    LoopStm,		InputStm,
  InVar,          OutputStm,		ReturnStm,		CallStmRest,
  ActParamList,   ActParamMore,		RelExp,			OtherRelE,
  Exp,			  OtherTerm,		Term,           OtherFactor,
  Factor,         Variable,			VariMore,		FieldVar,
  FieldVarMore,   CmpOp,			AddOp,          MultOp
  
}  NontmlType; 

/*所有终极符,取自单词的词法类型的枚举定义,可参考zglobals.h头文件*/
typedef LexType  TmlType;


/*实现LL1分析用的分析栈,存放的是终极符和非终极符 */
typedef struct Node
{  /*内容标志*/
   int flag;    /* flag为1,表示栈中内容为非终极符;*/
                /* flag为2,表示栈中内容为终极符    */
   /*内容*/
   union { NontmlType Ntmlvar ;  /*非终极符部分*/ 
           TmlType tmlvar;       /*终极符部分*/
         } var;   

   /*指向下一个节点的指针*/
   struct Node *underNode;

}  StackNode;


/* 2.创建语法树所需的类型及变量**/

/*为建立声明和语句部分的语法树所设的指针栈,*
 *注意栈中存的是存放指针的地址              */
typedef struct NodePA
{  TreeNode       **pointer;
   struct NodePA  *underNode;
}  StackNodePA;


/*为生成表达式部分的语法树所设的指针栈,*
 *栈中存的是存放指向树节点的指针        */
typedef struct NodeP
{  TreeNode      *pointer;
   struct NodeP  *underNode;
}StackNodeP;

/*符号栈顶指针*/
 StackNode *StackTop;

/*栈空标志*/
  int STACKEMPTY; 

/*语法树栈顶指针*/
  StackNodePA  *StackTopPA;
/*栈空标志*/
  int  paSTACKEMPTY;

/*操作符栈的栈顶指针*/
  StackNodeP  *OpStackTop;
/*操作符栈空标志*/
  int OpSTACKEMPTY ;  

/*操作数栈的栈顶指针*/
  StackNodeP  *NumStackTop;

/*操作数栈空标志*/
  int NumSTACKEMPTY ;

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


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

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

⌨️ 快捷键说明

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