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

📄 common.h

📁 这是我们的一个上机题,做词法分析和语法的,希望对大家的学习有所帮助
💻 H
字号:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <assert.h>
#include <iostream.h>
#include <Afxtempl.h >
#include <malloc.h>



#define FILENAMESIZE 512    //文件名的最大长度
#define NUMOFWORD 24        //保留字的个数                   @@@@@@
#define MAXNUMOFNAMETABLE 1000  //名字表的最大项数
#define MAXNUMOFBLOCKTABLE 100 //程序体表的最大项数
#define MAXNUMOFARRAYTABLE  100//数组信息表的最大项数
#define MAXSYMNAMESIZE 255  //符号的最大字符数
#define MAXVARNAMESIZE 255  //变量名的最大字符数
#define MAXLEVELDEPTH 100   //过程嵌套的最大深度
#define MAXNUMOFCODEADDRESS 10000  //最大的地址空间


typedef enum _SYMBOL  //符号的定义
{
	NUL,//0
	IDENT,//1
    INTCON,//2
	CHARCON,//3
	PLUS,//4
	MINUS,//5
	TIMES,//6
	DIVSYM,//7
    EQL,//8
	NEQ,//9
	LSS,//10
	LEQ,//11
	GTR,//12
	GEQ,//13
	OFSYM,//14
	ARRAYSYM,//15
	PROGRAMSYM,//16
	MODSYM,//17
    ANDSYM,//18
	ORSYM,//19
	NOTSYM,//20
	LBRACK,//21
	RBRACK,//22
	LPAREN,//23
	RPAREN,//24
	COMMA,//25
    SEMICOLON,//26
	PERIOD,//27
	BECOMES,//28
	COLON,//29
	BEGINSYM,//30
	ENDSYM,//31
	IFSYM,//32
	THENSYM,//33
    ELSESYM,//34
	WHILESYM,//35
	DOSYM,//36
	CALLSYM,//37
	CONSTSYM,//38
	TYPESYM,//39
    VARSYM,//40
	PROCSYM,//41
	DPOINT,//42
	//********************************                   @@@@@@
	//添加
	FORSYM,//43
	TOSYM,//44
	REPEATSYM,//45
	UNTILSYM,//46
	CASESYM//47
	//*********************************
} SYMBOL;


class SYMLIST:public CList<SYMBOL,SYMBOL>
{
};


SYMLIST DECLBEGSYS,STATBEGSYS,FACBEGSYS,CONSTBEGSYS,TYPEBEGSYS;

//typedef signed short int int;


typedef enum NAMEKIND  //标识符的种类的定义
{
	KONSTANT,  //常量
	TYPEL,  //无类型
	VARIABLE,  //变量
	PROCEDURE  //过程名
} OBJECT;


typedef enum VARTYPES  //变量的类型的定义
{
	NOTYP,  //(暂时)没有类型
	INTS,  //整数类型
	CHARS,  //字符类型
	BOOLS,  //布尔类型
	ARRAYS  //数组类型
} TYPES;


typedef enum _OPCOD  //操作码的定义
{
	LIT,LIT1,LOD,ILOD,LODA,LODT,LODB,STO,CPYB,JMP,JPC,RED,WRT,CAL,RETP,UDIS,OPAC,ENTP,
	ENDP,ANDS,ORS,NOTS,IMOD,MUS,ADD,ADD1,SUB,MULT,IDIV,EQ,NE,LS,LE,GT,GE
} OPCOD;



typedef struct _TYPEITEM  //辅助节点定义          ***********
{
	TYPES typ;
	int ref;
} TYPEITEM;

typedef struct _CONSTREC
{
	TYPES type;
	int value;
} CONSTREC;



typedef struct SYMBOL_ITEM  //从源文件读出的符号链表里面的节点的定义
{
	int lineNumber;  //符号所处的行数
	SYMBOL type;  //符号的类型
	union SYMBOL_VALUE  //根据不同的符号类型符号可以有不同的类型的值
	{
		int iValue;  //如果是整数常量或者字符常量,则存放其值
		char * lpValue;  //如果是符号,则存放其首字符的地址
	}value;
	struct SYMBOL_ITEM *next;  //指向下一个节点
}SymbolItem;



typedef struct _INSTRUCTION  //指令结构定义
{
	int lineNumber;
	OPCOD func;
	int level;
	int address;
} INSTRUCTION;
INSTRUCTION CODE[MAXNUMOFCODEADDRESS];  //指令数组定义
int CX;  //指令数组索引



typedef struct _NAMETABITEM  //名字表里面的记录的定义
{
	char name[MAXSYMNAMESIZE];
	OBJECT kind;
	TYPES type;
	int level;
	int normal;         //标明名字是否为变量形参名
	int ref;            //当名字为数组类型名或数组变量名时,ref指向该数组在数组信息表中登录的位置
	union SYMBOL_VALUE  //根据不同的符号类型符号可以有不同的类型的值
	{
		int value;  //如果是整数常量或者字符常量,则存放其值
		int size;
		int address;
	}unite;
	int link;
	//struct NAMETAB_ITEM *Next;
}NAMETABITEM;
NAMETABITEM NAMETAB[MAXNUMOFNAMETABLE];  //名字表定义
int TX; //名字表索引



typedef struct PROGRAM_BLOCK_ITEM  //程序体表里的记录的的定义
{
	int lastPar;  //指向本程序体中最后一个形参在nameTab中的位置
	int last;     //指向本程序体中最后一个名字在nameTab中的位置
	int pSize;	  //本程序体所有形参所需体积、包括连续数据所占空间
	int vSize;    //本程序体所有局部数据所需空间的大小
	//struct PROGRAM_BLOCK_ITEM *Next;
}BLOCKITEM;
BLOCKITEM BTAB[MAXNUMOFBLOCKTABLE];  //程序表定义
int BX;  //程序体表索引





typedef struct ARRAY_INFORMATION_ITEM  //数组信息表定义
{
	TYPES intType;
	TYPES eleType;
	int low;
	int high;
	int elSize;
	int size;
	int elRef;//当元素类型为数组时,它指向该数组信息在atab表中的位置,其他情况为0
	//struct ARRAY_INFORMATION_ITEM *Next;
}ARRAYITEM;
ARRAYITEM  ATAB[MAXNUMOFARRAYTABLE];  //数组信息表定义
int AX;  //数组信息表索引



int JUMADRTAB[300];  //跳转表的定义
int JX;  //跳转表索引



int DISPLAY[MAXLEVELDEPTH];  //DISPLAY表定义
int displayLevel;  //DISPLAY表的索引

int DX;//数据空间分配的指示器,每个程序体都要用到一次

int Temporary_i;         //为for语句中的变量i定义的临时单元     @@@@@@

char ObjCodeScript[GE+1][1000]=
{
	"LIT    %4d ,%4d      ------>  装入常量",
	"LIT1   %4d ,%4d      ------>  装入常量(用于计算数组元素地址)",
	"LOD    %4d ,%4d      ------>  装入变量值",
	"ILOD   %4d ,%4d      ------>  间接装入",
	"LODA   %4d ,%4d      ------>  装入变量地址",
	"LODT   %4d ,%4d      ------>  装入栈顶值为地址的内容",
	"LODB   %4d ,%4d      ------>  装入长度为A的块",
	"STO    %4d ,%4d      ------>  将栈顶值存入栈顶次值所指单元",
	"CPYB   %4d ,%4d      ------>  传送长度为A的块",
	"JMP    %4d ,%4d      ------>  无条件跳转",
	"JPC    %4d ,%4d      ------>  栈顶值为0时跳转",
	"READ   %4d ,%4d      ------>  读指令",
	"WRITE  %4d ,%4d      ------>  写指令",
	"CALL   %4d ,%4d      ------>  转子",
	"RETP   %4d ,%4d      ------>  过程返回",
	"UDIS   %4d ,%4d      ------>  调整Display",
	"OPAC   %4d ,%4d      ------>  打开活动记录",
	"ENTP   %4d ,%4d      ------>  进入过程",
	"ENDP   %4d ,%4d      ------>  程序结束",
	"AND    %4d ,%4d      ------>  与",
	"OR     %4d ,%4d      ------>  或",
	"NOT    %4d ,%4d      ------>  非",
	"IMOD   %4d ,%4d      ------>  模",
	"MUS    %4d ,%4d      ------>  求负",
	"ADD    %4d ,%4d      ------>  加",
    "ADD1   %4d ,%4d      ------>  加(用于计算数组元素地址)",
	"SUB    %4d ,%4d      ------>  减",
	"MULT   %4d ,%4d      ------>  乘",
	"IDIV   %4d ,%4d      ------>  除",
	"EQ     %4d ,%4d      ------>  ==",
	"NEQ    %4d ,%4d      ------>  !=",
	"LSS    %4d ,%4d      ------>  <",
	"LEQ    %4d ,%4d      ------>  <=",
	"GTR    %4d ,%4d      ------>  >",
	"GEQ    %4d ,%4d      ------>  >="
};

⌨️ 快捷键说明

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