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

📄 fcdlg.h

📁 编译原理的一个课程设计
💻 H
字号:
#if !defined(AFX_FCDLG_H__A6FFEF3A_FC86_4C56_83CE_059D27679C10__INCLUDED_)
#define AFX_FCDLG_H__A6FFEF3A_FC86_4C56_83CE_059D27679C10__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define nFUNCTION 32	//函数的最大数目
#define nIDENT 128		//单个函数中含有的标识符最大数目
#define nPARAM 16		//单个函数中含有的参数最大数目
#define IDENTLENGTH 32	//标识符的最大长度
#define nCODE 2048		//中间代码的总长
#define nMEMORY 2048	//虚内存大小

#include "FCErrorDlg.h"
#include <fstream.h>

class CFCDlg : public CDialog
{
public:// Construction
	CFCDlg(CWnd* pParent = NULL);	// standard constructor
// Dialog Data
	//{{AFX_DATA(CFCDlg)
	enum { IDD = IDD_FC_DIALOG };
	CString	m_strEdit;
	CString	m_strPrecision;
	UINT	m_iPosition;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CFCDlg)
protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	//{{AFX_MSG(CFCDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnOpen();
	afx_msg void OnSave();
	afx_msg void OnSaveAs();
	afx_msg void OnRun();
	afx_msg void OnClear();
	afx_msg void OnAboutEdit();
	afx_msg void OnAboutGrm();
	afx_msg void OnAppAbout();
	virtual void OnCancel();
	afx_msg void OnChangeEdit();
	afx_msg void OnSetPosition();
	afx_msg void OnKillfocusPosition();
	afx_msg void OnKillfocusPrecision();
	afx_msg void OnTranslate();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
private://界面交互函数定义
	void On_OpenSource();
	void On_OpenCode();
	void On_SaveSource();
	void On_SaveCode();
	void On_SaveAbout();
	void On_SaveAsSource();
	void On_SaveResult();
	void On_Compile();
	void On_Interpret();
	void On_Translate();
	void On_AboutEdit();
	void On_AboutGrm();
	void On_Exit();
	void On_ExitCompile();
	void On_ExitAbout();
	void On_ExitTranslate();
private://编辑界面 成员变量定义
	int m_iStatus;
	BOOL m_bSaved;
	CString m_source;
	CString m_strFile;
private://有关编译的成员函数及成员变量定义 ---- 必须为 private
	enum ZElement
	{
		E_FILEEND,		//源代码结束符
		E_NULL,			//空,不认识的符号
		E_IDENT,		//标识符
		E_INUMBER,		//整数
		E_DNUMBER,		//实数
		E_STRING,		//字符串
//////运算符
		E_PLUS,			//加
		E_MINUS,		//减
		E_TIMES,		//乘
		E_SLASH,		//除
		E_MOD,			//余
		E_EQUAL,		//等于
		E_NOTEQUAL,		//不等于
		E_LESS,			//小于
		E_LESSEQUAL,	//小于等于
		E_GREAT,		//大于
		E_GREATEQUAL,	//大于等于
		E_BECOMES,		//赋值号
		E_NOT,			//非
		E_AND,			//与
		E_OR,			//或
//////界符
		E_LPAREN,		//左圆括号
		E_RPAREN,		//右圆括号
		E_LSUB,			//左方括号
		E_RSUB,			//右方括号
		E_BEGIN,		//左花括号
		E_END,			//右花括号
		E_COMMA,		//逗号
		E_COLON,		//冒号
		E_SEMICOLON,	//分号
//////关键字
		E_BREAK,		//break
		E_CASE,			//case
		E_CONTINUE,		//continue
		E_DEFAULT,		//default
		E_DO,			//do
		E_DOUBLE,		//double
		E_ELSE,			//else
		E_EXIT,			//exit
		E_IF,			//if
		E_INT,			//int
		E_INPUT,		//input
		E_OUTPUT,		//output
		E_RETURN,		//return
		E_SWITCH,		//switch
		E_VOID,			//void
		E_WHILE,		//while
	};
	enum ZOperator
	{
		OP_AND,			//与
		OP_CALL,		// . a => 调用函数于地址a
		OP_CHANGESIGNALD,//改变符号
		OP_CHANGESIGNALI,//改变符号
		OP_COPYD,		//复制栈顶数值
		OP_COPYI,		//复制栈顶数值
		OP_D2I,			// . a => 实数变整数(地址为栈顶偏移a)
		OP_DELARRAYD,	// . a => 删除一个实数数组(a为数组头地址)
		OP_DELARRAYI,	// . a => 删除一个整数数组(a为数组头地址)
		OP_DELETE,		//删除栈顶数(栈顶指针减一)
		OP_EQUALD,		//等于
		OP_EQUALI,		//等于
		OP_EXIT,		//程序结束
		OP_GREATD,		//大于
		OP_GREATEQUALD,	//大于等于
		OP_GREATEQUALI,	//大于等于
		OP_GREATI,		//大于
		OP_I2D,			// . a => 整数变实数(地址为栈顶偏移a)
		OP_INPUTARRAYD,	// . a => 输入实型数组值(a位数组头位置,下标在栈顶)
		OP_INPUTARRAYI,	// . a => 输入整型数组值(a位数组头位置,下标在栈顶)
		OP_INPUTD,		// . a => 输入实数后存于地址a
		OP_INPUTI,		// . a => 输入整数后存于地址a
		OP_JUMP,		// . a => 跳转于地址a
		OP_JUMPC,		// . a => 条件跳转于地址a
		OP_LESSD,		//小于
		OP_LESSEQUALD,	//小于等于
		OP_LESSEQUALI,	//小于等于
		OP_LESSI,		//小于
		OP_LOADARRAYD,	// . a => 导入实数数组值(a为数组头地址,下标在栈顶)
		OP_LOADARRAYI,	// . a => 导入整数数组值(a为数组头地址,下标在栈顶)
		OP_LOADCONSTD,	// . a => 到入实常数a
		OP_LOADCONSTI,	// . a => 导入整常数a
		OP_LOADVARD,	// . a => 导入实数于地址a
		OP_LOADVARI,	// . a => 导入整数于地址a
		OP_MINUSD,		//减
		OP_MINUSI,		//减
		OP_MOD,			//余
		OP_NEWARRAYD,	// . a => 申请一个实数数组(a为数组头地址,长度在栈顶)
		OP_NEWARRAYI,	// . a => 申请一个整数数组(a为数组头地址,长度在栈顶)
		OP_NOT,			//非
		OP_NOTEQUALD,	//不等于
		OP_NOTEQUALI,	//不等于
		OP_NULL,		//空操作,用于标志函数的头尾
		OP_OR,			//或
		OP_OUTPUTD,		//输出实数
		OP_OUTPUTI,		//输出整数
		OP_OUTPUTS,		// . a => 输出字符串于实地址a
		OP_PARAMTRANSD,	//参数传递,(sd为参数数目)
		OP_PARAMTRANSI,	//参数传递,(sd为参数数目)
		OP_PLUSD,		//加
		OP_PLUSI,		//加
		OP_RETURN,		// . a => 函数返回(a为当前函数的参数数目)
		OP_RETURND,		// . a => 函数返回(a为当前函数的参数数目)
		OP_RETURNI,		// . a => 函数返回(a为当前函数的参数数目)
		OP_SAVEARRAYD,	// . a => 存储实数数组值(a为数组头地址,数值在栈顶,下标在栈次顶)
		OP_SAVEARRAYI,	// . a => 存储整数数组值(a为数组头地址,数值在栈顶,下标在栈次顶)
		OP_SAVED,		// . a => 存储于地址a
		OP_SAVEI,		// . a => 存储于地址a
		OP_SLASHD,		//除
		OP_SLASHI,		//除
		OP_TIMESD,		//乘
		OP_TIMESI,		//乘
	};
	enum ZIdentType
	{
		IT_NULL,
		IT_VOID,		//void
		IT_INT,			//int
		IT_DOUBLE,		//double
		IT_INTARRAY,	//int[]
		IT_DOUBLEARRAY,	//double[]
		IT_FUNCTION,	//函数
		IT_INTINRANG,	//非当前嵌套层的作用域内的int
		IT_DOUBLEINRANG,//非当前嵌套层的作用域内的double
		IT_IARRAYINRANG,//非当前嵌套层的作用域内的int[]
		IT_DARRAYINRANG,//非当前嵌套层的作用域内的double[]
	};
	struct ZIdent
	{
		char name[IDENTLENGTH];	//标识符名
		int level;				//标识符定义处的嵌套层次,若为-1则已经在作用域外
		ZIdentType type;		//标识符类型
	};
	struct ZFunction
	{
		char name[IDENTLENGTH];	//函数名
		ZIdentType ReturnType;	//返回类型
		ZIdent ident[nIDENT];	//标识符表
		ZIdent param[nPARAM];	//参数表
		int iParam;				//参数计数
		int iIdent;				//当前的标识符计数
		int level;				//当前的嵌套层次
		int iMaxIdent;			//标识符数目的最大值
	};
	union ZSecond
	{
		char *string;
		struct{int iNumber;int nParam;};
		double dNumber;
	};
	struct ZCode
	{
		ZOperator op;
		ZSecond sd;
	};
	union ZMemory
	{
		int iNumber;
		double dNumber;
		struct{union{int *iArray;double *dArray;};int length;};
	};
	char		m_curIdent[IDENTLENGTH];//当前标识符
	int			m_nCurNumber;			//当前整数
	double		m_dCurNumber;			//当前实数
	CString		m_curString;			//当前字符串
	ZElement	m_curElement;			//当前的ZElement
	ZFunction	m_function[nFUNCTION];	//函数表
	ZCode		m_code[nCODE];			//代码序列
	int m_iFunction;		//函数数目计数
	int m_iCode;			//中间代码计数
	int m_iCount;			//源代码字符计数
	int m_iLine;			//源代码行计数
	int m_iErrorCount;		//所查到的错误计数
	int m_SourceLength;		//源代码总长
	BOOL m_bCompiled;		//为避免重复编译,当一次编译成功后设下此标记,即可多次运行

	BOOL m_bDouble;				//全局变量,标记表达式中是否含有浮点数运算
	int m_iContinue,m_iBreak;	//全局变量,标记continue和break的跳转位置
	int m_iCase;				//全局变量,标记case的跳转位置

	ZIdentType GetIdentType(char ident[IDENTLENGTH]);
	BOOL ErrorReport(CFCErrorDlg::ZErrorType et);
	BOOL GetElement(void);//返回值为是否成功的取得 ZElement
	BOOL TestCode(void);//检查代码是否太多
	BOOL SearchMain(void);				//查找main函数
	int SearchFunction(int n);			//查找第n个函数的地址
	int IdentIndex(char ident[IDENTLENGTH]);
	int FunctionIndex(char ident[IDENTLENGTH]);
	BOOL RecycleMemory(void);//回收内存,回收局部变量和数组所占用的内存

	BOOL Compile(void);			//返回值为是否成功的编译
	BOOL Interpret(void);		//返回值为是否成功的运行

	BOOL DoFunction(void);		//处理 函数
	BOOL DoStatement(void);		//处理 语句
	BOOL DoOutput(void);		//处理 输出语句
	BOOL DoExpression(void);	//处理 表达式
	BOOL DoTerm(void);			//处理 项
	BOOL DoFactor(void);		//处理 因子
	BOOL DoCall(void);			//处理 函数调用
	BOOL DoDefine(void);		//处理 变量定义
	BOOL DoBecomes(void);		//处理 赋值语句
	BOOL DoInput(void);			//处理 输入语句
	BOOL DoSpecial(void);		//处理 特殊语句
	BOOL DoCondition(void);		//处理 条件
	BOOL DoAndCondition(void);	//处理 条件与项
	BOOL DoSubCondition(void);	//处理 条件子项
	BOOL DoIf(void);			//处理 判断语句
	BOOL DoWhile(void);			//处理 循环语句
	BOOL DoDoWhile(void);		//处理 重复语句
	BOOL DoSwitch(void);		//处理 选择语句
	BOOL DoCase(void);			//处理 选择语句的case项
	BOOL DoDefault(void);		//处理 选择语句的default项
	BOOL DoSubscript(void);		//处理 数组下标

	BOOL TestAddress(int iAddress);		//检查地址是否溢出
	BOOL ZeroSlashMod(int i);			//除以或余0
	BOOL ZeroSlashMod(double d);		//除以或余0.0
	BOOL ArraySubscript(int index,int length);//检查数组下标的有效值
	BOOL ValideArray(void *pArray);

	void Output(CString);		//输出字符串
	void Output(int);			//输出整数
	void Output(double);		//输出实数
	int InputInt(void);			//输入整数
	double InputDouble(void);	//输入实数
private://有关翻译的成员函数和成员变量定义
	int m_iLevel;
	BOOL m_bMainFunction;
	ofstream m_fout;

	int m_iBack;
	int m_iBackChoice;
	BOOL m_bBlankLine;
	BOOL m_bExitWait;
	BOOL m_bOpSpace;
	BOOL m_bOutPrecision;
	BOOL m_bOutRuntime;
	CString m_strCppFile;

	void SpaceBack(void);
	void Translate(void);
	void OutOperator(char op[]);

	void TrsAndCondition(void);
	void TrsCondition(void);
	void TrsDefine(void);
	void TrsDoWhile(void);
	void TrsExpression(void);
	void TrsFactor(void);
	void TrsFunction(void);		//翻译 函数
	void TrsIf(void);
	void TrsInput(void);
	void TrsMultStat(void);
	void TrsOutput(void);
	void TrsParameter(void);
	void TrsSpecial(void);
	void TrsStatement(void);
	void TrsSubCondition(void);
	void TrsSwitch(void);
	void TrsTerm(void);
	void TrsWhile(void);
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_FCDLG_H__A6FFEF3A_FC86_4C56_83CE_059D27679C10__INCLUDED_)

⌨️ 快捷键说明

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