?? 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 + -