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

📄 mydialog.cpp

📁 本程序为用VC开发的词法分析程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MyDialog.cpp : implementation file
//

#include "stdafx.h"
#include "ProCompile.h"
#include "MyDialog.h"
#include "token.h"
#include "error.h"
#include "Ttoken.h"
//#include "Shlwapi.h"
 
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyDialog dialog


CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/)
	: CDialog(CMyDialog::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMyDialog)
	m_Verror = _T("");
	m_out = _T("");
	m_edit = _T("");
	//}}AFX_DATA_INIT

	c_word="";
	hcount=lcount=0;
	num_token=0;
	num_error=0;
	num_sign=0;
	flag=0;
	signtable.tail=0;
	for(int i=0;i<200;i++)
	{
		signtable.addname[i]=0;signtable.addr[i]=0;
		signtable.kind[i]=0;signtable.lenname[i]=0;
		signtable.type[i]=0;signtable.val[i]=0; 
		etable[i].x=0;etable[i].y=0;etable[i].kerror="";
	}
	tokentable[0].word="and";tokentable[0].knum=1;      
	tokentable[1].word="array";tokentable[1].knum=2;
	tokentable[2].word="begin";tokentable[2].knum=3;
	tokentable[3].word="bool";tokentable[3].knum=4;
	tokentable[4].word="call";tokentable[4].knum=5;
	tokentable[5].word="case";tokentable[5].knum=6;
	tokentable[6].word="char";tokentable[6].knum=7;
	tokentable[7].word="constant";tokentable[7].knum=8;
	tokentable[8].word="do";tokentable[8].knum=9;
	tokentable[9].word="else";tokentable[9].knum=10;
	tokentable[10].word="end";tokentable[10].knum=11;
	tokentable[11].word="false";tokentable[11].knum=12;
	tokentable[12].word="for";tokentable[12].knum=13;
	tokentable[13].word="if";tokentable[13].knum=14;
	tokentable[14].word="input";tokentable[14].knum=15;
	tokentable[15].word="integer";tokentable[15].knum=16;
	tokentable[16].word="not";tokentable[16].knum=17;
	tokentable[17].word="of";tokentable[17].knum=18;
	tokentable[18].word="or";tokentable[18].knum=19;
	tokentable[19].word="output";tokentable[19].knum=20;
	tokentable[20].word="procedure";tokentable[20].knum=21;
	tokentable[21].word="program";tokentable[21].knum=22;
	tokentable[22].word="read";tokentable[22].knum=23;
	tokentable[23].word="real";tokentable[23].knum=24;
	tokentable[24].word="repeat";tokentable[24].knum=25;
	tokentable[25].word="set";tokentable[25].knum=26;
	tokentable[26].word="then";tokentable[26].knum=27;
	tokentable[27].word="to";tokentable[27].knum=28;
	tokentable[28].word="true";tokentable[28].knum=29;
	tokentable[29].word="until";tokentable[29].knum=30;
	tokentable[30].word="var";tokentable[30].knum=31;
	tokentable[31].word="while";tokentable[31].knum=32;
	tokentable[32].word="write";tokentable[32].knum=33;
	tokentable[33].word="标识符";tokentable[33].knum=34;
	tokentable[34].word="整常数";tokentable[34].knum=35;
	tokentable[35].word="实常数";tokentable[35].knum=36;
	tokentable[36].word="字符常数";tokentable[36].knum=37;
	tokentable[37].word="'";tokentable[37].knum=38;
	tokentable[38].word="(";tokentable[38].knum=39;
	tokentable[39].word=")";tokentable[39].knum=40;
	tokentable[40].word="*";tokentable[40].knum=41;
	tokentable[41].word="*/";tokentable[41].knum=42;
	tokentable[42].word="+";tokentable[42].knum=43;
	tokentable[43].word=",";tokentable[43].knum=44;
	tokentable[44].word="-";tokentable[44].knum=45;
	tokentable[45].word=".";tokentable[45].knum=46;
	tokentable[46].word="..";tokentable[46].knum=47;
	tokentable[47].word="/";tokentable[47].knum=48;
	tokentable[48].word="/*";tokentable[48].knum=49;
	tokentable[49].word=":";tokentable[49].knum=50;
	tokentable[50].word=":=";tokentable[50].knum=51;
	tokentable[51].word=";";tokentable[51].knum=52;
	tokentable[52].word="<";tokentable[52].knum=53;
	tokentable[53].word="<=";tokentable[53].knum=54;
	tokentable[54].word="<>";tokentable[54].knum=55;
	tokentable[55].word="=";tokentable[55].knum=56;
	tokentable[56].word=">";tokentable[56].knum=57;
	tokentable[57].word=">=";tokentable[57].knum=58;
	tokentable[58].word="[";tokentable[58].knum=59;
	tokentable[59].word="]";tokentable[59].knum=60;

}


void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDialog)
	DDX_Control(pDX, IDC_EINPUT, m_input);
	DDX_Control(pDX, IDC_ERESULT, m_result);
	DDX_Control(pDX, IDC_EERROR, m_Cerror);
	DDX_Control(pDX, IDC_BWANALAGY, m_ganalagy);
	DDX_Control(pDX, IDC_BEXIT, m_exit);
	DDX_Text(pDX, IDC_EERROR, m_Verror);
	DDX_Text(pDX, IDC_ERESULT, m_out);
	DDX_Text(pDX, IDC_EINPUT, m_edit);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
	//{{AFX_MSG_MAP(CMyDialog)
	ON_BN_CLICKED(IDC_BEXIT, OnBexit)
	ON_BN_CLICKED(IDC_BWANALAGY, OnBwanalagy)
	ON_BN_CLICKED(IDC_BOPEN, OnBopen)
	ON_WM_KEYDOWN()
	ON_WM_PAINT()
	ON_WM_CTLCOLOR()
	ON_BN_CLICKED(IDC_BSIGN, OnBsign)
	ON_BN_CLICKED(IDC_BTOKEN, OnBtoken)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDialog message handlers

void CMyDialog::OnBexit() 
{
	// TODO: Add your control notification handler code here
	int button;
	button=MessageBox(" 您真正想退出程序吗?","提示",MB_OKCANCEL|MB_DEFBUTTON2);
	if(button==1)
		CDialog::OnOK();
}

void CMyDialog::OnBwanalagy() 
{
	// TODO: Add your control notification handler code here
	CString str1[200],str2[200],str;
	CString str0="\r\n";
	int result;
	int t=m_input.GetLineCount();
	for(hcount=0;hcount<t;hcount++)
	{
		h_buffer=GetLineText(hcount);
		for(lcount=0;lcount<GetLineLength(hcount);lcount++)
		{
			c_ch=Getchar(lcount);
			result=Recognize(c_ch);
		}				
	}
	

	for(int i=0;i<num_error;i++)
	{
		str1[i].Format("%d",etable[i].x);
		str1[i]+=" ";
		str2[i].Format("%d",etable[i].y);
		str2[i]+=" ";
		str1[i]+=str2[i];
		str1[i]+=etable[i].kerror;
		str1[i]+=str0;
		str+=str1[i];
	}
	
	UAppendText(str);

	WriteToToken();
	WriteToSign();
	WriteToError();
}	

void CMyDialog::OnBopen() 
{
	// TODO: Add your control notification handler code here
	CString Filter;
	CFile myfile;
	CString Filename;
	CFileException e;

	Filter="PASIC文件 (*.TXT)|*.TXT||";
	CFileDialog FileDlg(true,NULL,NULL,OFN_HIDEREADONLY,Filter);
	if(FileDlg.DoModal()==IDOK)
	{
		
		Filename=FileDlg.GetPathName();		
	}

	if( !myfile.Open( Filename, CFile::modeRead, &e ) )
	{
	#ifdef _DEBUG
		afxDump << "File could not be opened " << e.m_cause << "\n";
	#endif
    }

	int LEN=myfile.GetLength();
	LPTSTR buffer;
	buffer=(char*)malloc((LEN)*sizeof(char));
	myfile.Read(buffer,LEN);

	CString str="";
	for(int i=0;i<LEN-2;i++)
	{
		str+=buffer[i];
	}

	LAppendText(str);
	myfile.Close();
}

void CMyDialog::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CMyDialog::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	
	// Do not call CDialog::OnPaint() for painting messages
}

BOOL CMyDialog::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

TCHAR CMyDialog::Getchar(int i)
{
	TCHAR ch;
	int length=h_buffer.GetLength();
	if(i<=length)
	{
		ch=h_buffer.GetAt(i);
		return ch;
	}
	else
	{
		return '~';
	}
}
//获得第i行文本的长度
int CMyDialog::GetLineLength(int i)
{
	int length;
	int k=2,m=0,len;
	for(int j=0;j<i;j++)
	{
		len=m_input.LineLength(k);
		m=m+len;
		m=m+2;
		k=m;
	}
	length=m_input.LineLength(m);
	return length;
}

//获得第i行文本内容
CString CMyDialog::GetLineText(int i)
{
	
	int iLength=GetLineLength(i);
	int t=m_input.GetLineCount();
	CString m_str=_T("");
	if(i<=t)
	{

		LPTSTR p=new TCHAR [iLength];
	    m_input.GetLine(i,p,iLength);
	    for(int j=0;j<iLength;j++)
		    m_str+=p[j];
	    delete p;
	}
	m_str+=' ';

	return m_str;//m_str长度是GetLineLength(i)+1
}

//左侧追加文本
void CMyDialog::LAppendText(LPCSTR pText)
{
	int nLen=m_input.GetWindowTextLength();
	m_input.SetFocus();
//	m_input.SetSel(nLen,nLen);
	m_input.SetSel(0,-1);
	m_input.ReplaceSel(pText);	
}

//右侧追加文本
void CMyDialog::RAppendText(LPCSTR pText)
{
	int nLen=m_result.GetWindowTextLength();
	m_result.SetFocus();
//	m_result.SetSel(nLen,nLen);	
	m_result.SetSel(0,-1);	
	m_result.ReplaceSel(pText);	
}

//判断数字
int CMyDialog::ISDIG(TCHAR ch)
{
	if(ch<='9'&&ch>='0')
		return 1;
	else
		return 0;	
}
//判断字母
int CMyDialog::ISLETTER(TCHAR ch)
{
	if((ch<='Z'&&ch>='A')||(ch<='z'&&ch>='a'))
		return 1;
	else 
		return 0;
}

//判断界限符
int CMyDialog::ISEDGE(TCHAR ch)
{
	switch(ch)
	{
		case '+':case '-':case '*':case '/':
		case '=':case '<':case '>':case '(':
		case ')':case '[':case ']':case ':':
		case '.':case ';':case ',':case '_':
			return 1;
		default:
			return 0;

	}
}
//判断关键字
int CMyDialog::ISKEYWORD(CString string)
{
	for(int i=0;i<33;i++)
	{
		if(string==tokentable[i].word)
		{
			
			return i;
		}
					
	}
	return 0;	
}
//判断非法字符
int CMyDialog::ISILLEGLE(TCHAR ch)
{
	if(ISDIG(ch)||ISLETTER(ch)||ISEDGE(ch)||ISEMPTY(ch))
		return 0;
	else 
		return 1;
}


int CMyDialog::Recognize(TCHAR ch_in)
{
	int result;
			//识别标识符
			if(ISLETTER(ch_in))
			{
				result=recogGID(ch_in);
				return result;				
			}
			//识别注解及界限符
			if(ch_in=='/')
			{
				result=handleCOM(ch_in);
				return result;
			}
			//识别数字常数
			if(ISDIG(ch_in))
			{
				result=recogDIG(ch_in);
				return result;
			}
			//识别字符常数
			if(ch_in=='"')
			{
				result=recogSTR(ch_in);
				return result;
			}

			//识别各种界符
			if(ISEDGE(ch_in))
			{
				result=recogDEL(ch_in);
				return result;
			}

			if(ISILLEGLE(ch_in))
			{
				etable[num_error].x=hcount;
				etable[num_error].y=lcount;
				etable[num_error].kerror="非法字符";
				num_error++;
				result=0;
			}

		return result;

}

//识别各种界符
int CMyDialog::recogDEL(TCHAR ch_in)
{
	TCHAR ch=ch_in;
	if(ch_in=='+')
	{	
		tokenstring[num_token].knum=43;
		tokenstring[num_token].entry=-1;
		num_token++;
		return 1;
	}
	if(ch_in==')')
	{
		tokenstring[num_token].knum=40;
		tokenstring[num_token].entry=-1;
		num_token++;
		return 1;
	}
	if(ch_in=='<')
	{
		c_ch=Getchar(lcount);
		
		lcount++;
		ch=c_ch;
		if(ch=='=')
		{
			tokenstring[num_token].knum=54;
			tokenstring[num_token].entry=-1;
			num_token++;
			return 1;
		}
		else if(ch=='>')
		{
			tokenstring[num_token].knum=55;
			tokenstring[num_token].entry=-1;
			num_token++;
			return 1;
		}
		else
		{
			lcount--;
			tokenstring[num_token].knum=53;
			tokenstring[num_token].entry=-1;
			num_token++;
			return 1;
		}
		
	}
	if(ch_in=='>')
	{
		c_ch=Getchar(lcount);
		lcount++;
		ch=c_ch;
		if(ch=='=')
		{
			tokenstring[num_token].knum=58;
			tokenstring[num_token].entry=-1;
			num_token++;
			return 1;
		}
		else
		{
			lcount--;
			tokenstring[num_token].knum=57;
			tokenstring[num_token].entry=-1;
			num_token++;
			return 1;
		}
	}
	if(ch_in==':')
	{
		lcount++;
		c_ch=Getchar(lcount);
		
		ch=c_ch;
		if(ch=='=')
		{
			tokenstring[num_token].knum=51;
			tokenstring[num_token].entry=-1;
			num_token++;
			return 1;
		}
		else
		{
			lcount--;
			tokenstring[num_token].knum=52;
			tokenstring[num_token].entry=-1;
			num_token++;
			return 1;
		}
	}
	if(ch_in=='.')
	{
		c_ch=Getchar(lcount);
		lcount++;
		ch=c_ch;
		if(ch=='.')
		{
			tokenstring[num_token].knum=47;
			tokenstring[num_token].entry=-1;
			num_token++;
			return 1;
		}			
		else
		{
			lcount--;
			etable[num_error].x=hcount;
			etable[num_error].y=lcount;
			num_error++;
			return 0;
		}
	}
	if(ch_in==',')
	{
		tokenstring[num_token].knum=44;
		tokenstring[num_token].entry=-1;
		num_token++;

⌨️ 快捷键说明

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