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

📄 projectdlg.cpp

📁 编译器包括词法分析器,语法分析器,最后生成四元式
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ProjectDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Project.h"
#include "ProjectDlg.h"
#include "Dia.h"
#include "Dia2.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
char tokenfile_char[200][13];
char charfile_char[200][13];
	
struct fours_list fourslist[300];
struct varst_list varstlist[100];
int resent_vs=0;
int old_vs=resent_vs;
int resent_fl=0;
int and_pos=0;
struct entry keyword[]={"and",1,"array",2,"begin",3,"bool",4,"call",5,
"case",6,"char",7,"constant",8,"do",9,"else",10,"end",11,"false",12,
"for",13,"if",14,"input",15,"integer",16,"not",17,"of",18,"or",19,
"output",20,"procedure",21,"program",22,"read",23,"real",24,"repeat",
25,"set",26,"then",27,"to",28,"true",29,"until",30,"var",31,"while",
32,"write",33};
struct entry delimeter[]={"'",38,"(",39,")",40,"*",41,"*/",42,"+",43,
",",44,"-",45,"、",46,"..",47,"/",48,"/*",49,":",50,":=",51,";",52,
"<",53,"<=",54,"<>",55,"=",56,">",57,"=>",58,"[",59,"]",60,".",61};
struct entry selfdef[]={"identity",34,"intconst",35,"digit",36,"charconst",37};

CString tokenfile="\0",charfile="\0";
class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

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

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CProjectDlg dialog

CProjectDlg::CProjectDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CProjectDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CProjectDlg)
	m_content = _T("");
	m_TOKEN = _T("");
	m_CHAR = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
		m_sizeWin = CRect(0,0,0,0);
		m_nAdd = 5;
	m_bIsReSize = FALSE;

}

void CProjectDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CProjectDlg)
	DDX_Text(pDX, IDC_EDIT1, m_content);
	DDX_Text(pDX, IDC_TOKEN, m_TOKEN);
	DDX_Text(pDX, IDC_CHAR, m_CHAR);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CProjectDlg, CDialog)
	//{{AFX_MSG_MAP(CProjectDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_COMMAND(ID_read, Onread)
	ON_COMMAND(ID_Word_Analyse, OnWordAnalyse)
	ON_COMMAND(ID_Word_Save, OnWordSave)
	ON_COMMAND(ID_Grammer_Analyse, OnGrammerAnalyse)
	ON_COMMAND(ID_Grammer_Save, OnGrammerSave)
	ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
	ON_COMMAND(ID_d, Ond)
	ON_COMMAND(ID_S, OnS)
	ON_WM_TIMER()
	ON_WM_SIZE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CProjectDlg message handlers

BOOL CProjectDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
		SetTimer(2,50,0);
	// TODO: Add extra initialization here
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CProjectDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CProjectDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CProjectDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
/////////////////////////////////////// 是否是标识符 ///////////////////////////////
bool CProjectDlg::isidentifier(char *token)
{
for(int i=0;charfile_char[i][0]!='\0';i++)
    if(!strcmp(token,charfile_char[i]))
		return true;
if(charfile_char[i][0]=='\0')
       return false;
}
/////////////////////////////////////// 从TOKEN 文件中取下一个字符///////////////////////////
int next=0;
char *CProjectDlg::getnexttoken()
{
   char *temp;
   temp=tokenfile_char[next++];////////////////一定要用[next++]这种方式
   return temp;
}
/////////////////////////////////////// 关键字 识别//////////////////////////////////////////
int CProjectDlg::iskeyword(CString str,struct entry keyword[])
{
   int i=0;
   while(i<33)
	  if(!strcmp(str,keyword[i].word))
		   return keyword[i].token;
	   else
		   i++;
   return false;
}
//////////////////////////////////////// 界符 识别///////////////////////////////////////////
int CProjectDlg::isdelimeter(CString str,struct entry delimeter[])
{
   int i=0;
   while(i<24)
       if(!strcmp(str,delimeter[i].word))
		   return delimeter[i].token;
	   else
		   i++;
   return false;
}
//////////////////////////////////////整型 与 浮点型 识别///////////////////////////////////
int CProjectDlg::digitsort(char str[])
{
	char state='0';
	int i=0;
	while(state!=7)
	{
		switch (state)
		{
		case '0': if(isdigit(str[0])) state='1';else return false;
		case '1': 
			if(i!=0&&(str[i]==32||str[i]==0)){ i--; return 35;}
			else if(isdigit(str[i])) {state='1';break;}
			else if(str[i]=='.') {state='2';break;}
			else if(str[i]=='e'||str[i]=='E') {state='4';break;}
			

		case '2': if(isdigit(str[i])) {state='3';break;}
			      else return false;

		case '3': if(isdigit(str[i])) {state='3';break;}
			else if(str[i]=='e'||str[i]=='E') {state='4';break;}
				  else{ i--; return 36;}

		case '4':if(isdigit(str[i])) {state='6';break;}
			else if(str[i]=='+'||str[i]=='-') {state='5';break;}
				 else return false;

		case '5':if(isdigit(str[i])) {state='6';break;}
			     else return false;

		case '6':if(isdigit(str[i])) {state='6';break;}
			else{ i--;return 36;}
		}
		i++;
	}
}
/////////////////////////////////////////标识符 与 关键字 识别//////////////////////////////////
int CProjectDlg::charsort(char str[])
{
	char state='0';
	int i=0,token;
	while(state!='2')
	{
		switch(state)
		{
		case '0':if(i!=0&&(str[i]==32||str[i]==0))
				 {
				   if(token=iskeyword(str,keyword))
					  return token;
				   else
					  return 34;
				 }
				 else if(isalpha(str[i])) {state='0';break;}
			     else if(isalnum(str[i])) {state='1';break;}

		case '1':if(isalnum(str[i]) &&(i<7)) {state='1';break;}
	             else if(i!=0&&(str[i]==32||str[i]==0))
				 {
				 state=2;
				 return 34;
			     i--;
				 }
		}
		i++;
	}

}
////////////////////////////////////多位数转换成字符串函数//////////////////////////////////////
char *CProjectDlg::transvert(int num)
{
	int flag=num/10;
	char totle[2];
	if(flag)
	{ 
		  totle[0]=char(flag+48);
		  totle[1]=char(num%10+48);
		  totle[2]='\0';
		  return totle;
    }
    else
	{
	   totle[0]=char(flag+48);
	   totle[1]='\0';
	   return totle;
	}
}
////////////////////////////////////////////变量说明函数
void CProjectDlg::varst(char *token)
{
	while(1)
	{
		if(isidentifier(token)) 
		{
			varstlist[resent_vs].no=resent_vs;
			varstlist[resent_vs].name=token;
		}
		token=getnexttoken();
		if(!strcmp(token,":="))
		{
			token=getnexttoken();
			varstlist[resent_vs].VAL=token;
			token=getnexttoken();
		}
		resent_vs++;
		if(token[0]==',')
		token=getnexttoken();
		else
		if(token[0]==58)///////////////是否是 :
		break;
		else
		{	AfxMessageBox("错误:变量名后只能出现 ':'和','!");}
	}
	char *type=getnexttoken();
	if(strcmp(type,"integer")&&
	   strcmp(type,"real")&&
	   strcmp(type,"bool")&&
	   strcmp(type,"char"))
	{ AfxMessageBox("变量类型说明有误!");}
	else
	{
		for(int temp=old_vs;temp<resent_vs;temp++)
			varstlist[temp].TYPE=type;
		old_vs=resent_vs;
	}
	if(strcmp(token=getnexttoken(),";"))
	{	AfxMessageBox("错误:缺少';'");}
    token=getnexttoken();
    if(isidentifier(token))
		varst(token);
	else if(!strcmp(token,"begin"))
		return;
	else
	{	AfxMessageBox("错误:缺少begin';'");}
	varstlist[resent_vs].no=999;
}
//////////////////////////////////////语句分类
char *CProjectDlg::ST_SORT(char *token)
{
	if(!strcmp(token,"if"))
		token=ifs(token);
    else if(!strcmp(token,"while"))
		token=whiles(token);
	else if(!strcmp(token,"repeat"))
		token=repeats(token);
	else if(!strcmp(token,"for"))
		token=fors(token);
	else
		token=assign(token);
	return token;
}
////////////////////////////////////// if
char *CProjectDlg::ifs(char *token)
{
	token=getnexttoken();
	bexp(token);
	token=getnexttoken();
	if(strcmp(token,"then"))
	{	AfxMessageBox("错误:then,缺少 !");}
	token=getnexttoken();
	token=ST_SORT(token);
	if(!strcmp(token,";"))
		resent_fl++;
	token=getnexttoken();
	if(!strcmp(token,"else"))
	{token=getnexttoken();
	  ST_SORT(token);}//	AfxMessageBox("错误:缺少 else !");}
	return token;
}
////////////////////////////////////// while
char *CProjectDlg::whiles(char *token)
{
	token=getnexttoken();	
	bexp(token);
	token=tokenfile_char[next-1];
	if(strcmp(token,"do")&&isidentifier(tokenfile_char[next]))
	{	AfxMessageBox("错误:缺少 do !");}
	token=ST_SORT(token);
	return token;
}
///////////////////////////////////// repeat
char *CProjectDlg::repeats(char *token)
{
	token=getnexttoken();
	token=ST_SORT(token);
	token=getnexttoken();
	if(!strcmp(token,"until"))
	{
	token=getnexttoken();
	token=bexp(token);
	}
	else if(!strcmp(token,";"))
	token=ST_SORT(token);
	else
	{	AfxMessageBox("错误:缺少 until !");}
	return token;
}
///////////////////////////////////// for
char *CProjectDlg::fors(char *token)
{
	token=getnexttoken();
	if(isidentifier(token))
	{ 
		token=getnexttoken();
		if(!strcmp(token,":="))
		{
		  token=getnexttoken();
          token=cal(token);
		}
	}
	if(!strcmp(token,"to")||!strcmp(token,"downto"))
	{
		  token=getnexttoken();
          token=cal(token);
	}
	if(strcmp(token,"do")&&isidentifier(tokenfile_char[next]))
	{	AfxMessageBox("错误:缺少 do !");}
	else
	{
	token=getnexttoken();
	while(token[0]>='0'&&token[0]<='9')
	token=getnexttoken();	                ////////////// to 后面的常数
	if(!strcmp(token,"do"))
	token=getnexttoken();
	token=ST_SORT(token);
	}
 return token;
}
///////////////////////////////////// 赋值语句
char *CProjectDlg::assign(char *token)
{
	if(isidentifier(token))
	{ 
		fourslist[resent_fl].RESULT=token;
		token=getnexttoken();
		if(!strcmp(token,":="))
		{
		  fourslist[resent_fl].no=resent_fl;
		  fourslist[resent_fl].op=token;
		  token=getnexttoken();
          token=cal(token);
		}
	}
	return token;
}
/////////////////////////////////////逻辑表达式处理
char *CProjectDlg::bexp(char *token)
{
     bt(token);
	 if(!strcmp(token,"or"))
	 {
	 token=getnexttoken();
	 bexp(token);
	 }
	 else
		 return token=tokenfile_char[next-2];
}
/////////////////////////////////////and处理
void CProjectDlg::bt(char *token)
{
	 bf(token);
	 if(!strcmp(tokenfile_char[next],"then"))
	 {next--;fourslist[and_pos].AG2=fourslist[resent_fl-1].RESULT;}
	 token=getnexttoken();
	 if(!strcmp(token,"and"))
	 {
	  and_pos=resent_fl;
	  fourslist[resent_fl].op=token;
	  CString temp;
	  temp.Format("%d",resent_fl-1);
	  fourslist[resent_fl].no=resent_fl;
	  fourslist[resent_fl].AG1="temp"+temp;
	  temp.Format("%d",resent_fl);
	  fourslist[and_pos].RESULT="temp"+temp;
	  resent_fl++;
	 token=getnexttoken();
	 bt(token);
	 }
	 else 
		 return;
}
/////////////////////////////////////not处理
void CProjectDlg::bf(char *token)

⌨️ 快捷键说明

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