📄 mydialog.cpp
字号:
// 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 + -