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

📄 pl0dlg.h

📁 编译原理的课程设计,对PL0进行扩充完成内容如下:1. 基本内容: (1)增加单词:保留字;运算符 (2)修改单词:不等号# 改为 <> (3)增加条件语句的ELSE子句 (4)扩
💻 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 + -