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

📄 compiler.h

📁 Win32 Console下C++实现的PL/0语言编译程序
💻 H
字号:
/*
FileName:		compiler.h
Author:			LiWen
Create:			2005-11-23
Last Modified:	2005-12-29
Discription:	编译器头文件,结构的定义和函数声明
				常量定义以及保护函数的宏定义
*/
#ifndef _COMPILER_H
#define _COMPILER_H

///////////////////////////////////////////
//Header Files
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


////////////////////////////////////////////////////
//预置常量定义部分

#define KEYNUM 13			//关键字数目
#define NUMDMAX	14			//数字的最大位数
#define IDENTMAX 10			//标识符的最大长度
#define MEMMAX 2047			//地址上界
#define ERRMAXN 44			//错误项目数
#define ERRMAXL 100			//错误信息最大长度

#define LEVMAX 3			//过程最大层数
#define MAXTX 100			//名字表最大容量
#define MAXERR 100			//最大允许错误数
#define CXMAX 200			//生成中间代码最大条数

#define BUFSIZE 10			//读入缓冲区大小
#define STRMAX 257			//一般字符串大小
#define WANYOUTSIZE 32767	//词法分析结果缓冲区
#define EXESTACKSIZ 256		//运行时堆栈大小
#define TMNT -1				//致命错误终止返回标志


//////////////////////////////////////////////
//数据结构定义部分
//

/*错误项目标识*/
enum ErrType{
	/*****************Fetal errors***********************/
	UNEXPECTED_FILE_END,			//1.不可预期的文件结尾
	UNEXPECTED_EXTERN_CODE,			//2.程序结束还有多余代码
	CODELIST_OVERFLOW,				//3.中间代码表溢出
	TABLE_OVERFLOW,					//4.符号表溢出
	/*****************Symbol errors**********************/
	IDENT_TOO_LONG,					//5.标识符过长
	NUM_TOO_BIG,					//6.数字过长
	UNKNOWN_SYMBOL,					//7.不可识别的符号
	/****************Syntax errors***********************/
	MISSING_PERIOD,					//8.程序末尾丢掉了'.'结束符号
	IDENT_REDECLARED,
	IDENT_IN_CONST_EXPECTING,		//9.常量声明必须以标识符开始
	EQL_IN_CONST_EXPECTING,			//0.常量声明中间应该为'='符号
	NUM_IN_CONST_EXPECTING,			//1.常量声明的值必须是数字常量
	MISSING_SEMICOLON_IN_CONST,		//2.常量声明末尾丢掉了';'

	IDENT_IN_VAR_EXPECTING,			//3.变量必须为标识符
	MISSING_SEMICOLON_IN_VAR,		//4.变量声明末尾丢掉了';'

	PROC_LEV_TOO_DEEP,				//5.过程层次定义太深
	IDENT_IN_PROC_EXPECTING,		//6.过程名必须为标识符
	MISSING_SEMICOLON_IN_PROC,		//7.过程声明末尾丢掉了';'
	MISSING_SEMICOLON_END_PROC,		//8.过程定义末尾丢掉了';'

	UNEXPECTED_STATEMENT_BEGIN,		//9.无效的语句开始
	VAR_UNDECLARED,					//0.未声明的变量
	PROC_UNDECLARED,				//1.未声明的过程
	IDENT_CONST_IN_ASSIGN,			//2.不可为常量赋值
	IDENT_PROC_IN_ASSIGN,			//3.赋值语句左边不可为过程名
	BECOMES_EXPECTING_IN_ASSIGN,	//4.赋值语句中间应该为":="
	MISSING_SEMICOLON_IN_STATEMENT,	//5.语句末尾丢掉了';'

	THEN_EXPECTING_IN_IF,			//6.if语句条件后面应该为then
	DO_EXPECTING_IN_WHILE,			//7.while语句条件后面应该为do
	PROC_EXPECTING_IN_CALL,			//8.call 后面必须是 过程名
	IDENT_CONST_IN_READ,			//9.read 语句中不应有常量
	IDENT_PROC_IN_READ,				//0.read 语句中不应有过程名
	KEYWORD_APPEAR_IN_READ,			//1.read 语句中不应该出现关键字
	IDENT_EXPECTING_IN_READ,		//2.read 语句中'('或者','后面应为变量
	IDENT_PROC_IN_EXP,				//3.表达式中不因该出现过程名
	RELATIONOPR_EXPECTING_IN_CDT,	//4.条件中的不应出现非关系运算符
	
	MISSING_LPAREN,					//5.丢掉了左括号
	MISSING_RPAREN,					//6.丢掉了右括号
	MISSING_END,					//7.缺少END
	
	UNEXPECTED_STATEMENT_FOLLOW,	//8.语句follow集不符
	UNEXPECTED_PROCDECL_FOLLOW,		//9.过程声明follow集不符
	UNEXPECTED_CONST_FOLLOW,		//0.常量声明follow集不符
	UNEXPECTED_VAR_FOLLOW,			//1.变量声明follow集不符
	UNEXPECTED_PROCBODY_FOLLOW,		//2.过程定义follow集不符
	UNEXPECTED_CDT_FOLLOW,			//3.条件follow集不符
	UNEXPECTED_FACTOR_FOLLOW,		//4.表达式follow集不符
};


/*错误记录结构*/
typedef struct struct_errt{
	char str[100];
	int row;
	ErrType type;
}ERRT;

/*表项元素类型*/
typedef enum table_kind{
	cst,var,proc
}KIND;

/*表项结构*/
typedef struct table_struct{
	char name[IDENTMAX];
	KIND kind;
	int val;
	int addr;
	int lev;
	//int size;
}TABLE;

/*字串(word)的类型代号*/
enum symbol{
	nul,ident,number,plus,minus,
	times,slash,oddsym,eql,neq,
	lss,leq,gtr,geq,becomes,lparen,
	rparen,comma,semicolon,period,
	beginsym,endsym,ifsym,thensym,whilesym,
	writesym,readsym,dosym,callsym,constsym,
	varsym,procsym
};
#define SYMNUM 32		//字串(word)类型数

typedef struct symbol_struct{
	char word[IDENTMAX+1];
	symbol sym;
}SYM;

/*指令instruction的代号*/
enum instruction{
	LIT,LOD,STO,CAL,INT,JMP,JPC,OPR
};
/*指令的存储结构*/
typedef struct instrction_struct{
	enum instruction f;
	int l;
	int a;
}INSTRUCTION;

///////////////////////////////////////////////////////////////////
//下面是保护函数的宏定义,保证编译器在出现致命错误时,能够迅速返回
//到主程序报告错误,这些错误包括不可预期的文件末尾、各表格堆栈溢出
//以及除零出错等
#define PRT_PREREAD()				if(preread() == TMNT) return TMNT
#define PRT_GETSYM()				if(getsym() == TMNT) return TMNT
#define PRT_TABLEINSERT(a,b,c)		if(tableinsert(a,b,c) == TMNT) return TMNT
#define PRT_TABLEPOP(a)				if(tablepop(a) == TMNT) return TMNT
#define PRT_TRANSFORM(a,b,c)		if(transform(a,b,c) == TMNT) return TMNT
#define PRT_REPORT(a)				if(report(a) == TMNT) return TMNT
#define PRT_PROCBODY(a)				if(procbody(a) == TMNT) return TMNT
#define PRT_STATEMENT(a,b)			if(statement(a,b) == TMNT) return TMNT
#define PRT_VARDECLARE(a,b)			if(vardeclare(a,b) == TMNT) return TMNT
#define PRT_CONSTDECLARE(a,b)		if(constdeclare(a,b) == TMNT) return TMNT
#define PRT_PROCDECLARE(a,b)		if(procdeclare(a,b) == TMNT) return TMNT
#define PRT_EXP(a,b)				if(expression(a,b) == TMNT) return TMNT
#define PRT_TERM(a,b)				if(term(a,b) == TMNT) return TMNT
#define PRT_FACTOR(a,b)				if(factor(a,b) == TMNT) return TMNT
#define PRT_CONDITION(a,b)			if(condition(a,b) == TMNT) return TMNT
#define PRT_PUSHTRY(a)				if(pushtry(a) == TMNT) return TMNT
#define PRT_RUN(a,b,c)				if(run(a,b,c) == TMNT) return TMNT

////////////////////////////////////////////////////////////////
//函数声明部分

//in error.cpp
void errorinit();
int report(ErrType type);

//in symbol.cpp
void symbolinit();
int getsym();
//in table.cpp
void tableinit();
int tableinsert(int lev,KIND kind,int *pdx = NULL);
int tablepop(int num);
int tablesearch(char *);
//in syntax.cpp
int program();
int constdeclare(int, int*);
int vardeclare(int, int*);
int procdeclare(int, int*);
int procbody(int);
int statement(int,int*);
int condition(int,int*);
int expression(int,int*);
int term(int,int*);
int factor(int,int*);

//in instruction.cpp
int transform(enum instruction f,int l,int a);

//in execute.cpp
int run(enum instruction f, int l, int a);
int execute();
#endif

⌨️ 快捷键说明

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