www.pudn.com > 编译原理上机实验.rar > Compiler.h


/*++ 
 
Copyright (c) 2000 WangZhao GIET 97031125 
 
Module Name: 
 
    Compiler.h 
 
Abstract: 
 
    PL/0 Advance programming language compiler kernel module 
 
Author: 
 
    WangZhao   13-Oct-2000   (E-Mail: wangzhao168@china.com) 
 
Revision History: 
 
--*/ 
 
/*++ 
////////////////////////////////////////////////////////////////////// 
// 
//	接口说明 
// 
////////////////////////////////////////////////////////////////////// 
void CCompiler::CiFaFengXi() 
	输入:m_aSourse 
	输出:m_tCifa 
	功能:从m_aSourse中依次取出字符,进行词法分析,结果保存于m_tCifa。 
	动态联系:m_pCurCh,m_ntCifaLen 
 
void CCompiler::YuFaFengXi() 
	输入:m_tCifa 
	输出:m_nErrorAddress,m_ErrorNum 
	功能:从m_tCifa中取出单词,进行语法分析,得到出错码。 
	动态联系:m_pCurSym 
 
void CCompiler::YuYiFengXi() 
	输入:m_tCifa 
	输出:m_nErrorAddress,m_ErrorNum,quad 
	功能:从m_tCifa中取出单词,进行语义分析,得到出错码,四元式表。 
	动态联系:m_pCurSym,yuyivar 
 
InterfaceType * CCompiler::GetTable() 
	功能:返回各种表。 
 
struct InterfaceType 
{ 
	CifaResult * * LexicalDuad;//词法分析二元式 
//		指向词法分析结果表(CiFaResult * table[10000])首结点(即=table), 
//		表从0开始,以type=-1的结点结束。 
 
	quadtype * SemanticQuad;//语义分析四元式 
//		指向语义分析结果表(quadtype table[3000])首结点(即=table), 
//		定义同指导书,表从1开始,以op=0的结点结束。 
 
	char * SourseBuffer;//源程序缓冲区 
//		指向源文件缓冲区,缓冲区大小30'000字节,NULL结尾,回车0dh,0ah占2字节。 
 
	USER_TYPE_cha100 ErrorMessageTable;//出错信息表 
//		指向(char table[100][100])首结点(即=table)。 
 
	USER_TYPE_cha10 QuadOpcodeTable;//四元式操作符编码表 
//		指向(char table[30][10])首结点(即=table)。 
 
	int ErrorNumber;//语法语义错误代码 
	int ErrorAddress;//语法语义错误对应单词的地址(词法分析结果表下标) 
}; 
 
struct CifaResult 
{ 
	int type;//0:error,1:id,2:num,3-:keyword and operator,-1:end note 
	int value;//二元式中value值 
	char text[20];//单词 
	int address;//源文件缓冲区中地址 
}; 
 
typedef char (* USER_TYPE_cha100)[100]; 
typedef char (* USER_TYPE_cha10)[10]; 
 
--*/ 
 
// Compiler.h: interface for the CCompiler class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_COMPILER_H__9E236A77_B434_4D97_AF7E_38B4F107BF3A__INCLUDED_) 
#define AFX_COMPILER_H__9E236A77_B434_4D97_AF7E_38B4F107BF3A__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
#define BOOL int 
#define TRUE 1 
#define FALSE 0 
#define MAX_LEX_LEN 20 
#define MAX_NUMBER_LEN 8 
#define QUAD_OPCODE_LEN 10 
#define QUAD_OPCODE_TABLE_LEN 30 
#define LEX_DUAD_TABLE_LEN 10000 
#define ERROR_TABLE_LEN 100 
#define ERROR_MESSAGE_LEN 100 
#define ID_TABLE_LEN 1000 
#define LEVEL_TABLE_LEN 20 
#define TEMP_TABLE_LEN 100 
#define QUAD_TABLE_LEN 3000 
#define KEY_WORD_TABLE_LEN 50 
#define SOURSE_BUFFER_LEN 30003 
 
struct CifaResult 
{ 
	int type;//0:error,1:id,2:num,3-:keyword and operator,-1:end note 
	int value;//二元式中value值 
	char text[MAX_LEX_LEN];//单词 
	int address;//源文件缓冲区中地址 
}; 
 
struct idtype //标识符表 
{ 
	char name[MAX_LEX_LEN];//名字 
	int typ;//类型1:integer,2:real,3:program or procedure name 
	int kind;//属性1:简单变量,2:临时变量,3:值参变量,4:变参变量 
	int addr;//地址 
}; 
 
struct leveltype //层次表 
{ 
	char name[MAX_LEX_LEN];//名字 
	int outern;//外层 
	int lnum;//层次号 
	int parnum;//参数个数 
	int varnum;//变量个数 
	int pointer;//标识符表首址 
	int recl;//活动记录长度 
	int temp;// 
	int lnp;//入口 
}; 
 
struct temptype // 
{ 
	BOOL used;// 
	int typ;// 
	int taddr;// 
}; 
 
struct argtype // 
{ 
	int fl;//类型1:常数2:指令入口3:临时变量4:直接访问变量5:间接访问变量6+i:第i外层变量 
	int flvalue;//值 常数值|指令地址|相对地址 
}; 
 
struct quadtype //四元式表 
{ 
	int op;//操作 
	argtype arg1;//操作数 
	argtype arg2;//操作数 
	argtype result;//结果 
}; 
 
struct vartype //变量 
{ 
	int lasent;//标识符表长度指针 
	int lastbl;//层次表长度指针 
	int currbl;//当前层指针 
	int tempp;// 
	int nxq;//四元式表长度指针 
}; 
 
struct yuyivaluetype 
{ 
	int Etyp; 
	int Evalue; 
	int TC; 
	int FC; 
	int Code; 
	int disp; 
}; 
 
typedef char (* USER_TYPE_cha100)[ERROR_MESSAGE_LEN]; 
typedef char (* USER_TYPE_cha10)[QUAD_OPCODE_LEN]; 
 
struct InterfaceType 
{ 
	CifaResult * * LexicalDuad;//词法分析二元式 
	quadtype * SemanticQuad;//语义分析四元式 
	char * SourseBuffer;//源程序缓冲区 
	USER_TYPE_cha100 ErrorMessageTable;//出错信息表 
	USER_TYPE_cha10 QuadOpcodeTable;//四元式操作符编码表 
	int ErrorNumber;//语法语义错误代码 
	int ErrorAddress;//语法语义错误对应单词的地址 
}; 
 
class CCompiler   
{ 
public: 
	InterfaceType * GetTable(); 
	void YuYiFengXi(); 
	void YuFaFengXi(); 
	void CiFaFengXi(); 
	CCompiler(); 
	virtual ~CCompiler(); 
 
protected: 
	InterfaceType m_Interface; 
	yuyivaluetype yuyivalue; 
	int lookupv2(char *,int &); 
	int merge(int,int,int); 
	int newtemp(int); 
	int lookupp(char *); 
	int lookupv(char *,int); 
	void backpatch(int,int,int,int); 
	void addid(char *,int,int,int); 
	vartype yuyivar; 
	void gen(char *,int,int,int,int,int,int); 
	char m_QuadOpCodeTable[QUAD_OPCODE_TABLE_LEN][QUAD_OPCODE_LEN]; 
	idtype idtab[ID_TABLE_LEN]; 
	leveltype leveltab[LEVEL_TABLE_LEN]; 
	temptype temptab[TEMP_TABLE_LEN]; 
	quadtype quad[QUAD_TABLE_LEN]; 
	int m_nErrorAddress; 
	int m_nErrorNum; 
	CifaResult * GetNextSym(); 
	CifaResult * GetSym(); 
	void NextSym(); 
	CifaResult * GetCurSym(); 
	int m_pCurSym; 
	BOOL isdigit(char); 
	BOOL isalnum(char); 
	BOOL isalpha(char); 
	void Initial(); 
	int p_GuanXi(); 
	int p_GuanXiBiaoDaShi(); 
	int p_BuErBiaoDaShi(); 
	int p_YingZhi(); 
	int p_Xiang(); 
	int p_BiaoDaShi(); 
	int p_ShiChanBiao(); 
	int p_GuoChengYuJu(); 
	int p_XunHuanYuJu(); 
	int p_TiaoJianYuJu(); 
	int p_FuZhiYuJu(); 
	int p_FuHeYuJu(); 
	int p_YuJu(); 
	int p_YuJuChuan(); 
	int p_XingChan(); 
	int p_XingChanBuFeng(); 
	int p_GuoChengShuoMing(); 
	int p_JianBianShuoMing(); 
	int p_ShuoMing(); 
	int p_ShuoMingChuan(); 
	int p_ChengXuTi(); 
	int p_ChengXu(); 
	int r_GuanXi(); 
	int r_GuanXiBiaoDaShi(); 
	int r_BuErBiaoDaShi(); 
	int r_YingZhi(); 
	int r_Xiang(); 
	int r_BiaoDaShi(); 
	int r_ShiChanBiao(); 
	int r_GuoChengYuJu(); 
	int r_XunHuanYuJu(); 
	int r_TiaoJianYuJu(); 
	int r_FuZhiYuJu(); 
	int r_FuHeYuJu(); 
	int r_YuJu(); 
	int r_YuJuChuan(); 
	int r_XingChan(); 
	int r_XingChanBuFeng(); 
	int r_GuoChengShuoMing(); 
	int r_JianBianShuoMing(); 
	int r_ShuoMing(); 
	int r_ShuoMingChuan(); 
	int r_ChengXuTi(); 
	int r_ChengXu(); 
	int FindInCifaTab(char *); 
	int FindInKeyWordTab(char *); 
	char m_tErrorMessage[ERROR_TABLE_LEN][ERROR_MESSAGE_LEN]; 
	char m_tKeyWord[KEY_WORD_TABLE_LEN][MAX_LEX_LEN]; 
	CifaResult * m_tCifa[LEX_DUAD_TABLE_LEN]; 
	int m_ntCifaLen; 
	char GetNextCh(); 
	char GetCh(); 
	void NextCh(); 
	char GetCurCh(); 
	int m_pCurCh; 
	char m_aSourse[SOURSE_BUFFER_LEN]; 
}; 
 
#endif // !defined(AFX_COMPILER_H__9E236A77_B434_4D97_AF7E_38B4F107BF3A__INCLUDED_)