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

📄 compiler.h

📁 编译原理课程设计
💻 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_)

⌨️ 快捷键说明

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