📄 fcdlg.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 + -