www.pudn.com > 扩展后的pl0编译器源码.rar > zCompile.h


/////////////////////////////////////////////////////////////// 
//	zCompile Class 0.14 (2003.12.30) [Source File] 
//	Author:Dwing 
//ccy 2004.9修改,支持if then else ;repeat until;及数组 
/////////////////////////////////////////////////////////////// 
#ifndef _ZCOMPILE_H_ 
#define _ZCOMPILE_H_ 
/////////////////////////////////////////////////////////////// 
#include	//For   
#include	//For  
#include	//For  
/////////////////////////////////////////////////////////////// 
#define ISLETTER(c)	((c)>='A'&&(c)<='Z'||(c)>='a'&&(c)<='z')//判断是否是字母 
#define ISNUMBER(c)	((c)>='0'&&(c)<='9')	//判断是否是数字 
#define ISCHAR(c)	((c)>=33 &&(c)<=126)	//判断是否是字符 
 
#define MAX_ASM			4096	//最多目标代码条数 
#define MAX_ERR			256		//最多显示错误数 
#define MAX_FORM		1024	//最大符号表长度 
#define MAX_LEVEL		64		//最大符号表层数 
#define MAX_SYMLEN		31		//最大符号长度 
#define MAX_NUMLEN		5		//最大常数长度 
#define MAX_NUMBER		65535	//最大常数 
 
#define MAX_KEYWORD		16		//关键字数量 
#define MAX_OPWORDA		8		//单字运算符数量 
#define MAX_OPWORDB		3		//双字运算符数量 
#define MAX_ENDWORD		7		//单字界符数量 
#define MAX_ERROR		34		//错误类型数量 
#define MAX_ASMWORD		8		//汇编指令条数 
 
#define ERR_ERREND		0		//以下是错误号 
#define ERR_NEEDNUM		2 
#define ERR_NEEDEQL		3 
#define ERR_NEEDSYM		4 
#define ERR_NEEDEND		5 
#define ERR_NOUNTIL             6 
#define ERR_ARROW       7 
#define ERR_NOEND		9 
#define ERR_NOTSEM		10 
#define ERR_NODEFSYM	11 
#define ERR_NOTVAR		12 
#define ERR_NOTDEFOP	13 
#define ERR_NOTSYM		14 
#define ERR_NOTPROC		15 
#define ERR_NOTTHEN		16 
#define ERR_NEEDVAR		17 
#define ERR_NOTDO		18 
#define ERR_NOTRLOP		20 
#define ERR_NOPROC		21 
#define ERR_NOTRP		22 
#define ERR_NOSYM		23 
#define ERR_WRONGOP		24 
#define ERR_OVERSYMLEN	25 
#define ERR_OVERNUMLEN	26 
#define ERR_NUMBER		27 
#define ERR_NOTDEF		28 
#define ERR_OVERLVL		29 
#define ERR_OVERFORM	30 
#define ERR_NOTPAREN	31 
#define ERR_OVERASM		32 
#define ERR_OVERERR		33 
///////////////////////////////////////////////////////////// 
typedef struct arrnum 
{ 
	char name[MAX_SYMLEN+1]; 
	int number; 
}ARR; 
/////////////////////////////////////////////////////////////// 
typedef struct		//符号描述结构体(含错误描述结构) 
{ 
	int		type;		//类型号(0:错误) 
	int		id;		//ID号(错误值) 
	int		line;		//所在行数 
	char	name[MAX_SYMLEN+1];	//所取的词 
}SYM; 
/////////////////////////////////////////////////////////////// 
typedef struct		//符号表 
{ 
	int		type;		//类型 
	int		lvl;		//层数 
	int		adr;		//地址/常数 
	char	name[MAX_SYMLEN+1];	//名称 
}FORM; 
/////////////////////////////////////////////////////////////// 
typedef struct		//汇编指令格式 
{ 
	char			opr;	//指令操作码 
	char			lvl;	//级数 
	unsigned short	adr;	//地址码/操作数 
}ASM; 
/////////////////////////////////////////////////////////////// 
typedef struct		//错误结构体 
{ 
	int		id;		//错误号 
	int		line;	//出错行数 
	char	name[MAX_SYMLEN+1];		//所取的词 
}ERR; 
/////////////////////////////////////////////////////////////// 
class zCompile		//PL/0编译器类 
{ 
private: 
	char		*text;			//PL/0文本指针 
	SYM		sym;			//取词结构 
	ASM		asms[MAX_ASM];		//目标代码结构 
	int		asmnum;			//目标代码数量 
	ERR		err[MAX_ERR];		//错误结构 
	int		errnum;			//错误数量 
	FORM		form[MAX_FORM];		//符号表结构 
	int		formnum;		//符号表项数 
	int		formlvl;		//当前符号表层数 
	int		formadr[MAX_LEVEL];	//当前各层符号表地址记数 
	int     arr;				//数组计数 
	ARR     vararr[200];         //各数组变量下界 
 
private: 
	int     getarrnum(char *na);//得到数组变量的下届 
	int		getsym();		//取词 Return 0: No word 
	int		addasm(char opr,char lvl,short adr);//产生目标代码 
	int		adderr(char *name,int id);	//产生错误 
	int		formpush(char *name,int type,int id);//填表项 
	int		formpop();			//退表项 
	int		formget(char *name,FORM *fm);	//取表项 
	int		syn_block();		//分程序处理 
	void		syn_statement();	//语句处理 
	void		syn_expression();	//表达式处理 
	void		syn_condition();	//条件式处理 
	void		syn_term();			//项处理 
	void		syn_factor();		//因子处理 
public:						//以下成员函数是与外壳的接口 
			zCompile(); 
	void		compile(char *txt);	//编译源程序 
	int		getasm(char *buf);	//取得目标代码,返回指令条数 
	int		geterr(char *buf);	//取得错误信息,返回错误数量 
}; 
/////////////////////////////////////////////////////////////// 
#endif 
///////////////////////////////////////////////////////////////