📄 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_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -