📄 pl0dlg.h
字号:
// PL0Dlg.h : header file
//
#if !defined(AFX_PL0DLG_H__023613E1_216F_4FD2_A4BA_EA592142FBF4__INCLUDED_)
#define AFX_PL0DLG_H__023613E1_216F_4FD2_A4BA_EA592142FBF4__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CPL0Dlg dialog
# define norw 23 /*关键字个数*/
# define txmax 100 /*名字表容量*/
# define nmax 14 /*number的最大位数*/
# define al 10 /*符号的最大长度*/
# define amax 2047 /*地址上界*/
# define levmax 3 /*最大允许过程嵌套声明层数[0,lexmax]*/
# define cxmax 200 /*最多的虚拟机代码数*/
/*当函数中会发生fatal error时,返回-1告知调用它的函数,最终退出程序*/
#define getsymdo if(-1==getsym())return -1
#define getchdo if(-1==getch())return -1
#define testdo(a,b,c) if(-1==test(a,b,c))return -1
#define gendo(a,b,c) if(-1==gen(a,b,c))return -1
#define expressiondo(a,b,c) if(-1==expression(a,b,c))return -1
#define factordo(a,b,c) if(-1==factor(a,b,c))return -1
#define termdo(a,b,c) if(-1==term(a,b,c))return -1
#define conditiondo(a,b,c) if(-1==condition(a,b,c))return -1
#define statementdo(a,b,c) if(-1==statement(a,b,c))return -1
#define constdeclarationdo(a,b,c) if(-1==constdeclaration(a,b,c))return -1
#define vardeclarationdo(a,b,c) if(-1==vardeclaration(a,b,c))return -1
enum symbol{
nul, ident, number, plus, minus,
times, slash, oddsym, eql, neq,
lss, leq, gtr, geq, lparen,
rparen, comma, semicolon,period, becomes,
beginsym, endsym, ifsym, thensym, whilesym,
writesym, readsym, dosym, callsym, constsym,
varsym, procsym, elsesym, forsym, tosym, downtosym,
returnsym, plueql, mineql, incsym, decsym,muleql,
diveql,casesym,ofsym,colon,repeatsym,untilsym,
stepsym,lepa,ripa,
};
#define symnum 51
enum object{
constant,
variable,
array,
procedur,
};
/*--------------*/
enum fct{
lit, opr, lod, sto, cal, inte, jmp, jpc, get, kep,
};
#define fctnum 10
/*--------------*/
typedef struct
{
enum fct f;
int l;
int a;
}instruction;
typedef struct
{
char name[al]; /*名字*/
enum object kind; /*类型:const,var,array or procedure*/
int val; /*数值,仅const使用*/
int level; /*所处层,仅const不使用*/
int adr; /*地址,仅const不使用*/
int size; /*需要分配的数据区空间,仅procedure使用*/
}tablestruct;
class CPL0Dlg : public CDialog
{
// Construction
public:
int compile();
int getsym();
int getch();
void init();
void error(int n,int errline);
int gen(enum fct x,int y,int z);
int test(bool*s1,bool*s2,int n);
int inset(int e,bool*s);
int addset(bool*sr,bool*s1,bool*s2,int n);
int subset(bool*sr,bool*s1,bool*s2,int n);
int mulset(bool*sr,bool*s1,bool*s2,int n);
int block(int lev,int tx,bool* fsys);
void interpret();
int factor(bool* fsys,int* ptx,int lev);
int term(bool*fsys,int*ptx,int lev);
int condition(bool*fsys,int*ptx,int lev);
int expression(bool*fsys,int*ptx,int lev);
int statement(bool*fsys,int*ptx,int lev);
void listcode(int cx0);
int vardeclaration(int* ptx,int lev, int* pdx);
int constdeclaration(int* ptx,int lev, int* pdx);
int position(char* idt,int tx);
void enter(enum object k,int* ptx,int lev,int* pdx);
int base(int l,int* s,int b);
CPL0Dlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CPL0Dlg)
enum { IDD = IDD_PL0_DIALOG };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPL0Dlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CPL0Dlg)
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 OnCompile();
afx_msg void OnRun();
afx_msg void OnNew();
afx_msg void OnABOUT();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
OPENFILENAME ofn;
FILE * fas;
FILE * fa;
FILE * fa1;
FILE * fp;
tablestruct table[txmax]; /*名字表*/
instruction code[cxmax];
bool tableswitch;
bool listswitch;
char ch;
enum symbol sym;
char id[al+1];
int cx3[levmax],cx4[levmax],ifi,elsei; /*用于存放if语句的嵌套中需要回填的代码的序号*/
int cx5[10],cx6[10],casei,casej; /* 用于存放case语句中jmp和jpc需要回填的那些代码的序号*/
int num;
int cc;
int cx;
int line; /*用来记录程序运行到了哪一行*/
char a[al+1];
char word[norw][al];
enum symbol wsym[norw];
enum symbol ssym[256];
char mnemonic[fctnum][5];
bool declbegsys[symnum];
bool statbegsys[symnum];
bool facbegsys[symnum];
int err;
char buf[65536]; /*输入缓冲区*/
char str[512]; /*文件名缓冲区*/
char bufOut[2048]; /*输出缓冲区*/
};
BOOL CALLBACK inputproc(HWND,UINT,WPARAM,LPARAM);
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_PL0DLG_H__023613E1_216F_4FD2_A4BA_EA592142FBF4__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -