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

📄 compiler1.h

📁 实现了简单的Simple语言的编辑器,包括词法分析,语法分析,生成四元式,以及生成符号表功能,在符号表中还可以进行查询与删除.
💻 H
字号:
#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_)

⌨️ 快捷键说明

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