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 ///////////////////////////////////////////////////////////////