www.pudn.com > compiler.rar > shixunView.cpp
// shixunView.cpp : implementation of the CShixunView class // #include "stdafx.h" #include "shixun.h" #includeusing namespace std; #include "stdio.h" //定义Kernighan和Ritchie在Unix System V 中定义的标准和扩展的类型和宏。 //还定义标准I/O 预定义流:stdin,stdout和stderr,说明 I/O流子程序 //#include "math.h" //说明数学运算函数,还定了 HUGE VAL 宏, 说明了matherr和matherr子程序用到的特殊结构 #include "string.h" //说明一些串操作和内存操作函数 //#include "malloc.h" //定义动态链表所用到的函数库 #include "stdlib.h" #include "shixunDoc.h" #include "shixunView.h" char temp2[30]; char temp20[30]; char temp5[30]; char temp6[30]; char temp7[30]; char temp8[30]; char temp9[30]; char temp10[30]; char temp11[30]; char temp12[30]; /*char temp13[30]; char temp14[30]; char temp15[30]; char temp16[30]; char temp17[30]; char temp18[30]; char temp19[30]; char temp20[30];*/ int k2=0; //using namespace std; vector v; #define NULL 0 #define EOP -1 char keyword[6][10]={{"real"},{"else"},{"main"},{"if"},{"char"},{"int"}};//标识符表 CHARFORMAT yanse; //unsigned int flog=0; //全局变量,可随便调用 struct //保存结果二元式流的结构体 { char *class0; char value0[30]; } result[100]; struct //保存坐标的结构体 { char value1[30]; char value2[30]; } result1[100]; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CShixunView IMPLEMENT_DYNCREATE(CShixunView, CFormView) BEGIN_MESSAGE_MAP(CShixunView, CFormView) //{{AFX_MSG_MAP(CShixunView) ON_BN_CLICKED(IDC_BUTTON_READ, OnButtonRead) ON_BN_CLICKED(IDC_BUTTON_BAOCUN, OnButtonBaocun) ON_BN_CLICKED(IDC_BUTTON_QINGLING, OnButtonQingling) ON_BN_CLICKED(IDC_BUTTON_CIFA, OnButtonCifa) ON_BN_CLICKED(IDC_BUTTON_TUICHU, OnButtonTuichu) ON_BN_CLICKED(IDC_BUTTON_YUFA, OnButtonYufa) ON_NOTIFY(NM_CLICK, IDC_RICHEDIT, OnClickRicheditResouce) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CShixunView construction/destruction CShixunView::CShixunView() : CFormView(CShixunView::IDD) { //{{AFX_DATA_INIT(CShixunView) m_jieguo = _T(""); m_chucuo = _T(""); m_resouce = _T(""); //}}AFX_DATA_INIT // TODO: add construction code here ZeroMemory(&yanse, sizeof(CHARFORMAT)); yanse.cbSize = sizeof(CHARFORMAT); // InitRichEdit(); } CShixunView::~CShixunView() { } void CShixunView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CShixunView) DDX_Control(pDX, IDC_RICHEDIT_RESOUCE, m_a); DDX_Control(pDX, IDC_BUTTON_YUYI, m_yuyi); DDX_Control(pDX, IDC_BUTTON_YUFA, m_yufa); DDX_Control(pDX, IDC_BUTTON_TUICHU, m_tuichu); DDX_Control(pDX, IDC_BUTTON_READ, m_read); DDX_Control(pDX, IDC_BUTTON_QINGLING, m_qingling); DDX_Control(pDX, IDC_BUTTON_CIFA, m_cifa); DDX_Control(pDX, IDC_BUTTON_BAOCUN, m_baocun); DDX_Text(pDX, IDC_EDIT_JIEGUO, m_jieguo); DDX_Text(pDX, IDC_EDIT_CHUCUO, m_chucuo); DDX_Text(pDX, IDC_RICHEDIT_RESOUCE, m_resouce); //}}AFX_DATA_MAP } BOOL CShixunView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CFormView::PreCreateWindow(cs); } void CShixunView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); } ///////////////////////////////////////////////////////////////////////////// // CShixunView printing BOOL CShixunView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CShixunView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CShixunView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } void CShixunView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/) { // TODO: add customized printing code here } ///////////////////////////////////////////////////////////////////////////// // CShixunView diagnostics #ifdef _DEBUG void CShixunView::AssertValid() const { CFormView::AssertValid(); } void CShixunView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } CShixunDoc* CShixunView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CShixunDoc))); return (CShixunDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CShixunView message handlers void CShixunView::OnButtonRead() { // TODO: Add your control notification handler code here char ch; FILE *fp; m_resouce=_T(""); //m_chucuo.Format("gg%d",12); m_jieguo=_T(""); UpdateData(FALSE); CString strFilter = _T("TXT File (*.txt)|*.txt|BY File (*.by)|*.by|DOC File (*.doc)|*.doc|"); CFileDialog dlgOpen(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter, this); if (IDOK == dlgOpen.DoModal()) { filePath = dlgOpen.GetPathName(); fp=fopen(filePath,"r"); } else { fp=NULL; } if(fp==NULL) AfxMessageBox("无法读取文件,请检查路径是否正确再重试"); else { m_resouce=_T(""); ch=fgetc(fp); while(ch!=EOF) { if(ch=='\n') m_resouce+=_T("\r"); m_resouce+=_T(ch); //row++; ch=fgetc(fp); } m_resouce+=_T("\r"); UpdateData(FALSE); } //filePath.Close(); if(m_resouce!=_T("")) { m_baocun.EnableWindow(TRUE); m_cifa.EnableWindow(TRUE); } } void CShixunView::OnButtonBaocun() { // TODO: Add your control notification handler code here FILE *fp; int l; UpdateData(TRUE); if(m_resouce==_T("")) AfxMessageBox("文件为空,无法保存!"); else { m_resouce.Replace("\r",""); l=m_resouce.GetLength(); if((fp=fopen("F:/text1.by","w+t"))!=NULL) fwrite(m_resouce,sizeof(char),l,fp); fclose(fp); MessageBox("源文件保存成功!"); //this->OnButtonRead(); } } void CShixunView::OnButtonQingling() { // TODO: Add your control notification handler code here m_resouce=_T(""); //m_shezhi=_T(""); m_jieguo=_T(""); m_chucuo=_T(""); UpdateData(FALSE); m_baocun.EnableWindow(FALSE); m_cifa.EnableWindow(FALSE); m_yufa.EnableWindow(FALSE); m_yuyi.EnableWindow(FALSE); } void CShixunView::OnButtonCifa() { // TODO: Add your control notification handler code here int i=0,j=0,j1=0,add=0; int k=0; int c=0,d=0; unsigned int row=1,line=1; //记录行数,列数 char a[1000]; //保存源文件 char temp[30]; //临时存储数据数组 char A[1000]; //char temp1[100]; strcpy(a,"\0"); strcpy(temp,"\0"); UpdateData(TRUE); m_chucuo=_T(""); m_jieguo=_T(""); UpdateData(FALSE); c=m_resouce.GetLength(); while(c--) { a[d]=m_resouce.GetAt(d); //将程序存放道a[]数组中 d++; } a[d]='\0'; int b=0; char R[300]; char L[300]; R[b]=row; L[b]=line; yanse.crTextColor = RGB(0,0,0);//设置颜色 //m_a.Setsel(0,-1); //m_a.SetSelectionCharFormat(yanse); while(a[i]!='\0') { if(isalpha(a[i])) { int m=0,n=0,q=0; strcpy(temp,"\0"); while(isalpha(a[i])||(isdigit(a[i]))) //isalpha()判断某字符是否是英文字母,是则返回非零值,否则返回零值。isdigit()判断一个字符是否为数字(0-9),是数字返回1,不是返回0; { temp[m]=a[i]; m++; i++; } temp[m]='\0'; if(m>=8) //判断字符长度是否大于八,是则出错 { itoa(row,R,10); itoa(line,L,10); add++; itoa(add,A,10); m_chucuo+=_T(A); m_chucuo+=_T(".位置:"); m_chucuo+=_T("非法标识符"); m_chucuo+=_T(temp); m_chucuo+=_T("出现在第"); m_chucuo+=_T(R); m_chucuo+=_T("行,第"); m_chucuo+=_T(L); m_chucuo+=_T("列"); m_chucuo+=_T(";\t"); m_chucuo+=_T("//标识符字符长度不大于8!\r\n"); } while(strcmp(temp,keyword[n])!=0) //跟关键字匹配 { n++; if(n>=6) break; } if(n<6) { result[j].class0="1"; strcpy(result[j].value0,temp); itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=m; } else { result[j].class0="2"; strcpy(result[j].value0,temp); itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=m; } j++; j1++; } else { if(isdigit(a[i])) { if('1'<=a[i]&&a[i]<='9') { i++; if(isdigit(a[i])||(a[i]=='.')) { int h=0,z=0; strcpy(temp,"\0"); i=i-1; while(isdigit(a[i])||(a[i]=='.')) { temp[h]=a[i]; h++; i++; } temp[h]='\0'; z=atoi(temp); if(z>65535) { itoa(row,R,10); itoa(line,L,10); add++; itoa(add,A,10); m_chucuo+=_T(A); m_chucuo+=_T(".位置:"); m_chucuo+=_T("非法常量"); m_chucuo+=_T(temp); m_chucuo+=_T("出现在第"); m_chucuo+=_T(R); m_chucuo+=_T("行,第"); m_chucuo+=_T(L); m_chucuo+=_T("列"); m_chucuo+=_T(";\t"); m_chucuo+=_T("//整数不能超过65535!\r\n"); } result[j].class0="3"; strcpy(result[j].value0,temp); j++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=h; j1++; } else if((a[i]==',')||(a[i]==';')||(a[i]=='+')||(a[i]=='-')||(a[i]=='*')||(a[i]=='/')) { int s=0; strcpy(temp,"\0"); i=i-1; temp[s]=a[i]; i++; s++; temp[s]='\0'; result[j].class0="3"; strcpy(result[j].value0,temp); j++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=s; j1++; } else { int h=0,z=0; strcpy(temp,"\0"); i=i-1; temp[h]=a[i]; h++; i++; temp[h]='\0'; result[j].class0="2"; strcpy(result[j].value0,temp); j++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=h; j1++; } } else if(a[i]=='0') { i++; if(isdigit(a[i])) { int h=0,z=0; strcpy(temp,"\0"); i=i-1; temp[h]=a[i]; h=1; i=i+1; while(isdigit(a[i])) { temp[h]=a[i]; h++; i++; } temp[h]='\0'; //temp[s]='\0'; result[j].class0="8"; strcpy(result[j].value0,temp); j++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=h; j1++; add++; itoa(add,A,10); m_chucuo+=_T(A); m_chucuo+=_T(".位置:"); m_chucuo+=_T("非法标识符"); m_chucuo+=_T(temp); m_chucuo+=_T("出现在第"); m_chucuo+=_T(R); m_chucuo+=_T("行,第"); m_chucuo+=_T(L); m_chucuo+=_T("列"); m_chucuo+=_T(";\t"); m_chucuo+=_T("//常量无法识别!\r\n"); } else if(a[i]=='.') { int q=0,z=0; strcpy(temp,"\0"); i=i-1; temp[q]=a[i]; q=1; i=i+1; temp[q]=a[i]; q=2; i=i+1; while(isdigit(a[i])) { temp[q]=a[i]; i++; q++; } temp[q]='\0'; result[j].class0="3"; strcpy(result[j].value0,temp); j++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=q; j1++; } else { int h=0,z=0; strcpy(temp,"\0"); i=i-1; temp[h]=a[i]; h++; i++; temp[h]='\0'; result[j].class0="3"; strcpy(result[j].value0,temp); j++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=h; j1++; } } } else { strcpy(temp,"\0"); if(a[i]=='+') { result[j].class0="4"; strcpy(result[j].value0,"+"); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]=='-') { result[j].class0="4"; strcpy(result[j].value0,"-"); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]=='*') { result[j].class0="4"; strcpy(result[j].value0,"*"); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]=='/') { i++; if(a[i]=='/') { i++; line+=2; while(a[i]!=10&&a[i+1]!=NULL)i++; if(a[i+1]!=NULL) { row++; line=1; } } else if(a[i]=='*') { i++; line+=2; while(a[i]!=NULL) { if((a[i]=='*')&&(a[i+1]=='/')) { i+=2; line+=2; break; } else if(a[i]==10) { row++; line=1; } else if(a[i]==9) { line+=8-(line%8)+1; //i++; } else line++; i++; } } else { i--; result[j].class0="4"; strcpy(result[j].value0,"/"); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; int h=0,z=0; strcpy(temp,"\0"); //i=i-1; if(isalpha(a[i])) { temp[h]=a[i]; h++; i++; temp[h]='\0'; result[j].class0="2"; strcpy(result[j].value0,temp); j++; //i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(isdigit(a[i])) { while(isdigit(a[i])) { temp[h]=a[i]; h++; i++; } temp[h]='\0'; result[j].class0="3"; strcpy(result[j].value0,temp); j++; //i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else { temp[h]=a[i]; h++; i++; temp[h]='\0'; result[j].class0="8"; strcpy(result[j].value0,temp); j++; //i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } } } else if(a[i]==',') { result[j].class0="5"; strcpy(result[j].value0,","); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]==';') { result[j].class0="5"; strcpy(result[j].value0,";"); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]=='(') { result[j].class0="5"; strcpy(result[j].value0,"("); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]==')') { result[j].class0="5"; strcpy(result[j].value0,")"); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]=='.') { result[j].class0="5"; strcpy(result[j].value0,"."); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]=='{') { result[j].class0="5"; strcpy(result[j].value0,"{"); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]=='}') { result[j].class0="5"; strcpy(result[j].value0,"}"); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]==':') { i++; if(a[i]=='=') { result[j].class0="6"; strcpy(result[j].value0,":="); i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=2; //j1++; } else { result[j].class0="5"; strcpy(result[j].value0 ,":"); itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; //j1++; } j++; j1++; } else if(a[i]=='=') { result[j].class0="6"; strcpy(result[j].value0,"="); j++; i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; j1++; } else if(a[i]=='>') { i++; if(a[i]=='=') { result[j].class0="7"; strcpy(result[j].value0,">="); i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=2; //j1++; } else { result[j].class0="7"; strcpy(result[j].value0,">"); itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; //j1++; } j++; j1++; } else if(a[i]=='<') { i++; if(a[i]=='=') { result[j].class0="7"; strcpy(result[j].value0,"<="); i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=2; //j1++; } else { result[j].class0="7"; strcpy(result[j].value0,"<"); itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; //j1++; } j++; j1++; } else if(a[i]=='!') { i++; if(a[i]=='=') { result[j].class0="9"; strcpy(result[j].value0,"!="); i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=2; //j1++; } else { itoa(row,R,10); itoa(line,L,10); add++; itoa(add,A,10); m_chucuo+=_T(A); m_chucuo+=_T(".位置:"); m_chucuo+=_T("非法标识符"); m_chucuo+=_T(a[i-1]); m_chucuo+=_T("出现在第"); m_chucuo+=_T(R); m_chucuo+=_T("行,第"); m_chucuo+=_T(L); m_chucuo+=_T("列"); m_chucuo+=_T(";\r\n"); result[j].class0="8"; strcpy(result[j].value0,"!"); itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; //j1++; } j++; j1++; } else if(a[i]=='&') { i++; if(a[i]=='&') { result[j].class0="9"; strcpy(result[j].value0,"&&"); i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=2; //j1++; } else { itoa(row,R,10); itoa(line,L,10); add++; itoa(add,A,10); m_chucuo+=_T(A); m_chucuo+=_T(".位置:"); m_chucuo+=_T("非法标识符"); m_chucuo+=_T(a[i-1]); m_chucuo+=_T("出现在第"); m_chucuo+=_T(R); m_chucuo+=_T("行,第"); m_chucuo+=_T(L); m_chucuo+=_T("列"); m_chucuo+=_T(";\r\n"); result[j].class0="8"; strcpy(result[j].value0,"&"); itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; //j1++; } j++; j1++; } else if(a[i]=='|') { i++; if(a[i]=='|') { result[j].class0="9"; strcpy(result[j].value0,"||"); i++; itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=2; //j1++; } else { itoa(row,R,10); itoa(line,L,10); add++; itoa(add,A,10); m_chucuo+=_T(A); m_chucuo+=_T(".位置:"); m_chucuo+=_T("非法标识符"); m_chucuo+=_T(a[i-1]); m_chucuo+=_T("出现在第"); m_chucuo+=_T(R); m_chucuo+=_T("行,第"); m_chucuo+=_T(L); m_chucuo+=_T("列"); m_chucuo+=_T(";\r\n"); result[j].class0="8"; strcpy(result[j].value0,"|"); itoa(row,R,10); itoa(line,L,10); strcpy(result1[j1].value1,R); strcpy(result1[j1].value2,L); line+=1; //j1++; } j++; j1++; } else if(a[i]==' ')//space { i++; line++; } else if(a[i]==10) { i++; //row++; //line=1; } else if(a[i]=='\r'&&a[i]=='\n')//enter { i++; row++; line=1; } else if(a[i]=='\r') { i++; row++; line=1; } else if(a[i]=='\t') { i++; line+=8-(line%8)+1; } else { itoa(row,R,10); itoa(line,L,10); add++; itoa(add,A,10); m_chucuo+=_T(A); m_chucuo+=_T(".位置:"); m_chucuo+=_T("非法标识符"); m_chucuo+=_T(a[i]); m_chucuo+=_T("出现在第"); m_chucuo+=_T(R); m_chucuo+=_T("行,第"); m_chucuo+=_T(L); m_chucuo+=_T("列"); m_chucuo+=_T(";\r\n"); line++; i++; } //i++; } } UpdateData(FALSE); } m_jieguo+=_T("define 关键字 1\r\n"); m_jieguo+=_T("define 变量 2\r\n"); m_jieguo+=_T("define 常量 3\r\n"); m_jieguo+=_T("define 算术运算符 4\r\n"); m_jieguo+=_T("define 分隔符 5\r\n"); m_jieguo+=_T("define 赋值运算符 6\r\n"); m_jieguo+=_T("define 关系运算符 7\r\n"); m_jieguo+=_T("define 逻辑运算符 9\r\n"); m_jieguo+=_T("define 非法字符 8\r\n"); for(k=0;k "); m_jieguo+=_T("("); m_jieguo+=_T(result1[k].value1); m_jieguo+=_T(","); m_jieguo+=_T(result1[k].value2); m_jieguo+=_T("\t)\r\n"); } //m_chucuo+=_T("aaaaaaaa"); if(m_chucuo==_T("")) { m_chucuo+=_T("词法分析成功,可继续进行语法分析!"); m_yufa.EnableWindow(TRUE); } UpdateData(FALSE); } bool CShixunView::isdigit(char ch) { if( '0' <= ch && ch<='9') { return true; } else { return false; } } bool CShixunView::isalpha(char ch) { if( ('A' <= ch && ch<='Z') || ('a' <= ch && ch<='z')) { return true; } else { return false; } } void CShixunView::OnButtonTuichu() { // TODO: Add your control notification handler code here // CDialog::OnCancel(); //EndDialog(IDC_BUTTON_TUICHU); PostQuitMessage(0); } void CShixunView::OnClickRicheditResouce(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here *pResult = 0; } /*void CShixunView::shezhi() { int l=0; while(result[l].class0==8) { yanse.dwMask|=CFM_COLOR; yanse.crTextColor = RGB(255,0,0);//设置颜色 m_resouce.SetSel(error1[e1],error1[e1]+error2[e1]); m_resouce.SetSelectionCharFormat(yanse); l++; } //error1[0]=-1; }*/ void CShixunView::OnButtonYufa() { // TODO: Add your control notification handler code here UpdateData(TRUE); m_chucuo=_T(""); flog=0; bb=0; //strcpy(result[100].value0,"\0"); UpdateData(FALSE); m_chucuo+=_T("语法分析如下:\r\n"); if(chengxu()) { m_chucuo+=_T("\t语法分析成功,可继续进行语义分析!\r\n"); m_yuyi.EnableWindow(TRUE); } else { m_chucuo+=_T("\t语法分析失败,具体错误如上面所示.\r\n"); } UpdateData(FALSE); } //<程序> → main(){分程序} bool CShixunView::chengxu(void) { if(!strcmp(result[flog].value0,"main")) { flog++; if(!strcmp(result[flog].value0,"(")&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) { flog++; if(!strcmp(result[flog].value0,")")&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) { flog++; if(!strcmp(result[flog].value0,"{"))/*&&(!strcmp(result1[flog-1].value1,result1[flog].value1-1)))*/ { flog++; if(fenchengxu()) { flog++; if(strcmp(result[flog].value0,"")) { if(!strcmp(result[flog].value0,"}")) { return 1; } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中程序结尾缺少}!\r\n"); return 0; } } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中程序结尾缺少}!\r\n"); return 0; } } else//分程序出错 { flog++; if(strcmp(result[flog].value0,"")) { if(strcmp(result[flog].value0,"}")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中缺少}!\r\n"); } } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("文件末尾缺少}!\r\n"); } return 0; } } else//缺少{ { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中'()'后面缺少'{'!\r\n"); fenchengxu(); flog++; if(strcmp(result[flog].value0,"")) { if(strcmp(result[flog].value0,"}")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中555555缺少}!\r\n"); } } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中777缺少}!\r\n");/////////// } return 0; } } else//缺少) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中'('后面缺少')'!\r\n"); if(strcmp(result[flog].value0,"{")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中')'后面缺少'{'!\r\n"); } else { flog++; } fenchengxu(); flog++; if(strcmp(result[flog].value0,"")) { if(strcmp(result[flog].value0,"}")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中'{'后面缺少'}'!\r\n"); } } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中'{'后面缺少'}'!\r\n"); } return 0; } } else//( { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中main后面缺少'('!\r\n"); if(strcmp(result[flog].value0,")")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序5555})中main后面缺少')'!\r\n"); } else { flog++; } if (strcmp(result[flog].value0,"{")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程5555序})中main后面缺少'{'!\r\n"); } else { flog++; } fenchengxu(); flog++; if(strcmp(result[flog].value0,"")) { if(strcmp(result[flog].value0,"}")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分444程序})中main后面缺少'}'!\r\n"); } } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中main后5555面缺少'}'!\r\n"); } return 0; } } else//main { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<程序> → main(){分程序})中源文件开头缺少'main'!\r\n"); return 0; } } //<分程序> → <变量说明2> <变量说明><语句> bool CShixunView::fenchengxu(void) { if(bianliangsm2()) { flog++; if(bianliangsm()) { flog++; return yuju(); } else { flog++; yuju(); // m_chucuo+=_T("产生式(<分程序> → <变量说明2> <变量说明><语句>)中<<变量说明>分析出错!\r\n"); return 0; } } else { flog++; bianliangsm(); flog++; yuju(); //m_chucuo+=_T("产生式(<分程序> → <变量说明> <语句>)中<变量说明>分析出错!\r\n"); return 0; } } //<变量说明> → 空| <类型><标识符><变量>;<变量声明> bool CShixunView::bianliangsm() { int d; if(leixing()) { flog++; if(!strcmp(result[flog].class0,"2")) { flog++; if(bianliang()) { flog++; if(!strcmp(result[flog].value0,";")) { flog++; return bianliangsm(); } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量说明> → <类型> <变量>;| <类型> <变量>;<变量说明>)中变量后面缺少缺少;!\r\n"); bianliangsm(); return 0; } } else//,a变量出错 { flog++; if(strcmp(result[flog].value0,";")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量说明> → <类型> <变量>;| <类型> <变量>;<变量说明>)中变量后面缺少缺少;!\r\n"); flog--; } flog++; bianliangsm(); return 0; } } else//标识符出错 { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量说明> → <类型> <变量>;| <类型> <变量>;<变量说明>)中<变量>分析出错!\r\n"); bianliang(); flog++; if(strcmp(result[flog].value0,";")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量说明> → <类型> <变量>;| <类型> <变量>;<变量说明>)中变量后面缺少缺少;!\r\n"); flog--; } flog++; bianliangsm(); return 0; } } else//类型不符 { if(!strcmp(result[flog].class0,"2")) { flog++; d=bianliang(); if(d&&(!strcmp(result1[flog].value2,result1[flog-1].value2))) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量说明> → <类型> <变量>;| <类型>000000 <变量>;<变量说明>)中<类型>分析出错!\r\n"); //return 0; flog++; if(strcmp(result[flog].value0,";")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量说明> → <类型> <变量>;| <类型> <变量>;<变量说明>)中缺少:!\r\n"); //return 0; flog--; } flog++; bianliangsm(); } else if(!d)//非法的变量,| a { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量说明> → <类型> <变量>;| <类型> <变量>;<变量说明>)中<类型>分析出错!\r\n"); //return 0; flog++; if(strcmp(result[flog].value0,";")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量说明> → <类型> <变量>;| <类型> <变量>;<变量说明>)中缺少:!\r\n"); //return 0; flog--; } flog++; bianliangsm(); } else { flog--; return 1; } return 0; } else { flog--; return 1; } } } // <变量声明2>-><类型><标识符><变量>;为空时出错! bool CShixunView::bianliangsm2() { int d; if(leixing()) { flog++; if(!strcmp(result[flog].class0,"2")&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) { flog++; if((!strcmp(result1[flog-1].value1,result1[flog].value1))&&bianliang()) { flog++; if(!strcmp(result[flog].value0,";")&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) return 1; else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中<类型>缺少;!\r\n"); //return 0; flog--; return 0; } } else//,a变量出错 { flog++; if(strcmp(result[flog].value0,";")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中<类型>缺少:!\r\n"); //return 0; flog--; } return 0; } } else//标识符出错 { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中缺少变量名!\r\n"); bianliang(); flog++; if(strcmp(result[flog].value0,";")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中<类型>缺少:!\r\n"); //return 0; flog--; } return 0; } } else//类型不符 { if(!strcmp(result[flog].class0,"2")) { flog++; d=bianliang(); if(d&&(strcmp(result1[flog].value2,result1[flog-1].value2))) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中<类型>缺少类型名!\r\n"); //return 0; flog++; if(strcmp(result[flog].value0,";")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中<类型>缺少:!\r\n"); //return 0; flog--; } } else if(!d)//非法的变量,| a { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中<类型>缺少:!\r\n"); //return 0; flog++; if(strcmp(result[flog].value0,";")) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中<类型>缺少:!\r\n"); //return 0; flog--; } } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中<类型>缺少:!\r\n"); //return 0; flog--; } return 0; } else//标识符不符 { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<变量声明2>-><类型><标识符><变量>)中<类型>缺少:!\r\n"); //return 0; flog--; return 0; } } } //<语句> → <赋值语句>| <条件判断语句> bool CShixunView::yuju() { if(!strcmp(result[flog].value0,"if")) { return tiaojian(); } else { return fuzhi(); } } //<类型> → int | real | char bool CShixunView::leixing() { if((strcmp(result[flog].value0,"int")==0)||(strcmp(result[flog].value0,"real")==0)||(strcmp(result[flog].value0,"char")==0)) { return 1; } else { return 0; } } //变量-〉,<标志符><变量>|空 bool CShixunView::bianliang() { if(!strcmp(result[flog].value0,",")&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) { flog++; if(!strcmp(result[flog].class0,"2")&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) { flog++; return bianliang(); } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(变量-〉,<标志符><变量>|空)中多余;!\r\n"); bianliang(); return 0; } } else { if(!strcmp(result[flog].class0,"2")&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(变量-〉,<标志符><变量>|空)中缺少多余的,!\r\n"); flog++; bianliang(); return 0; } else { flog--; return 1; } } } //<赋值语句> →<变量> = <算术表达式><赋值语句2> bool CShixunView::fuzhi() { if(!strcmp(result[flog].class0,"2")) { strcpy(temp6,result[flog].value0); flog++; if(!strcmp(result[flog].value0,"=")&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) { strcpy(temp5,"="); flog++; strcpy(temp7,suanshubds()); if(suanshubds()) { strcpy(temp8," "); bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T("."); m_chucuo+=_T("<"); m_chucuo+=_T(temp5); m_chucuo+=_T(","); m_chucuo+=_T(temp6); m_chucuo+=_T(","); m_chucuo+=_T(temp7); m_chucuo+=_T(","); m_chucuo+=_T(temp8); m_chucuo+=_T("\t>\r\n"); flog++; return fuzhi2(); } else { flog++; fuzhi2(); return 0; } } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<赋值语句> →<变量> = <算术表达式><赋值语句2>)中缺少=!\r\n"); suanshubds(); flog++; fuzhi2(); return 0; } } else { if(!strcmp(result[flog].class0,"6")&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<赋值语句> →<变量> = <算术表达式><赋值语句2>)中左边必须是变量!\r\n"); flog++; suanshubds(); flog++; fuzhi2(); return 0; } else { suanshubds(); flog++; fuzhi2(); return 0; } } } //<赋值语句2> →;<语句><赋值语句2>|; bool CShixunView::fuzhi2() { if(!strcmp(result[flog].value0,";")) { flog++; if(!strcmp(result[flog].class0,"2")) { return fuzhi(); } else if(!strcmp(result[flog].value0,"if")) { return tiaojian(); } else { flog--; return 1; } } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<赋值语句2> →;<语句><赋值语句2>|;)中缺少;!\r\n"); if(!strcmp(result[flog].class0,"2")) { return fuzhi(); } else if(!strcmp(result[flog].value0,"if")) { return tiaojian(); } flog--; return 0; } } //<条件判断语句> → if <关系表达式> <语句><条件判断语句2>| // if <关系表达式> <语句> else <语句><条件判断语句2> bool CShixunView::tiaojian() { flog++; if(guanxibds()&&(!strcmp(result1[flog-1].value1,result1[flog].value1))) { flog++; if(yuju()) { flog++; if(!strcmp(result[flog].value0,"else")) { flog++; return yuju(); } else { flog--; return 1; } } else { flog++; if(!result[flog].value0,"else") { flog++; yuju(); return 0; } flog--; return 0; } } else { flog++; yuju(); flog++; if(!strcmp(result[flog].value0,"else")) { flog++; yuju(); } else { tiaojian2(); } return 0; } } // <条件判断语句2> →;<语句><条件判断语句2>|空 bool CShixunView::tiaojian2() { if(!strcmp(result[flog].value0,";")) { flog++; if(!strcmp(result[flog].class0,"2")) { return fuzhi(); } else if(!strcmp(result[flog].value0,"if")) { return tiaojian(); } else { flog--; return 1; } } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<条件判断语句2> →;<语句><条件判断语句2>|空)中缺少;!\r\n"); if(!strcmp(result[flog].class0,"2")) { return fuzhi(); } else if(!strcmp(result[flog].value0,"if")) { return tiaojian(); } flog--; return 0; } } //<算术表达式> →<项><算术表达式2> char* CShixunView::suanshubds() { strcpy(temp20,xiang()); if(xiang()) { flog++; return suanshubds2(); } else { flog++; suanshubds2(); return(temp20); //m_chucuo+=_T("产生式(<算术表达式> →<项><算术表达式2>)中<项>分析出错!\r\n"); //return 0; } } //<算术表达式2> → + <项><算术表达式2>|-<项><算术表达式2>|空 char* CShixunView::suanshubds2() { int f1=0,f2=0,f3=0,f4=0; f1=atoi(result1[flog-1].value1); f2=atoi(result1[flog].value1); f3=atoi(result1[flog-1].value2); f4=atoi(result1[flog].value2); char temp1[30]; char temp3[30]; char temp4[30]; if((!strcmp(result[flog].value0,"+"))||(!strcmp(result[flog].value0,"-"))) { strcpy(temp1,result[flog].value0); flog++; strcpy(temp3,xiang()); if(xiang()) { strcpy(temp4,newtemp()); bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T("."); m_chucuo+=_T("<"); m_chucuo+=_T(temp1); m_chucuo+=_T(","); m_chucuo+=_T(temp20); m_chucuo+=_T(","); m_chucuo+=_T(temp3); m_chucuo+=_T(","); m_chucuo+=_T(temp4); m_chucuo+=_T("\t>\r\n"); strcpy(temp20,temp4); flog++; return suanshubds2(); } else { flog++; suanshubds(); //return 0; return(temp20); } } else if((!strcmp(result[flog].value0,"(")) ||(!strcmp(result[flog].class0,"3")) ||(!strcmp(result[flog].class0,"2")) &&(f1==f2) &&(f3==f4-1)) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<算术表达式2> → + <项><算术表达式2>|-<项><算术表达式2>|空)中缺少算术运算符!\r\n"); flog++; suanshubds2(); //return 0; return(temp20); } else { flog--; return(temp20); //return 1; } } //<项>→<因式><项2> char* CShixunView::xiang() { strcpy(temp2,yinshi()); if(yinshi()) { flog++; return xiang2(); //strcpy(eplace,xiang2()); } else { flog++; xiang2(); return(temp2); //return 0; m_chucuo+=_T("产生式(<项>→<因式><项2>)中<因式>分析出错!\r\n"); } } //<项2>→*<因式><项2>|/<因式><项2>|空 char* CShixunView::xiang2() { int f5=0,f6=0,f7=0,f8=0; f5=atoi(result1[flog-1].value1); f6=atoi(result1[flog].value1); f7=atoi(result1[flog-1].value2); f8=atoi(result1[flog].value2); char temp1[30]; char temp3[30]; char temp4[30]; if((!strcmp(result[flog].value0,"*"))||(!strcmp(result[flog].value0,"/"))) { strcpy(temp1,result[flog].value0); flog++; strcpy(temp3,yinshi()); if(!yinshi()) { flog++; xiang2(); //return 0; return(temp2); } else { strcpy(temp4,newtemp()); bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T("."); m_chucuo+=_T("<"); m_chucuo+=_T(temp1); m_chucuo+=_T(","); m_chucuo+=_T(temp2); m_chucuo+=_T(","); m_chucuo+=_T(temp3); m_chucuo+=_T(","); m_chucuo+=_T(temp4); m_chucuo+=_T("\t>\r\n"); strcpy(temp2,temp4); flog++; return xiang2(); } } else if((!strcmp(result[flog].value0,"(")) ||(!strcmp(result[flog].class0,"3")) ||(!strcmp(result[flog].class0,"2")) &&(!strcmp(result1[flog-1].value1,result1[flog].value1)) &&(f7==f8-1)) { yinshi(); bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<项2>→*<因式><项2>|/<因式><项2>|空)中缺少算术运算符!\r\n"); flog++; xiang2(); //return 0; return(temp2); } else { flog--; //return 1; return(temp2); } } //<因式> → <变量> | <常数>|(<算术表达式>) char* CShixunView::yinshi() { char *fplace; fplace=(char*)malloc(30); strcpy(fplace," "); if((!strcmp(result[flog].class0,"2"))||(!strcmp(result[flog].class0,"3"))) { strcpy(fplace,result[flog].value0); //return 1; } else if(!strcmp(result[flog].value0,"(")) { flog++; if(suanshubds()) { strcpy(fplace,suanshubds()); flog++; if(strcmp(result[flog].value0,")")!=0) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<因式> → <变量> | <常数>|(<算术表达式>))中缺少)!\r\n"); flog--; //return 0; } //return 1; } else { if(strcmp(result[flog].value0,")")!=0) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<因式> → <变量> | <常数>|(<算术表达式>))中缺少)!\r\n"); //return 0; } flog++; //return 0; } } else//!=( { if((!strcmp(result[flog].class0,"2"))||(!strcmp(result[flog].class0,"3"))) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<因式> → <变量> | <常数>|(<算术表达式>))中缺少(!\r\n"); flog++; if(strcmp(result[flog].value0,")")!=0) { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<因式> → <变量> | <常数>|(<算术表达式>))中缺少)!\r\n"); flog--; } } else { if(!strcmp(result[flog].value0,")")) { flog++; bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<因式> → <变量> | <常数>|(<算术表达式>))中缺少(!\r\n"); } bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); m_chucuo+=_T("产生式(<因式> → <变量> | <常数>|(<算术表达式>))中没有预期的算术表达式或是常量!\r\n"); } //return 0; } return(fplace); } //<关系表达式> → <算术表达式><关系符><算术表达式> bool CShixunView::guanxibds() { strcpy(temp10,suanshubds()); if(suanshubds()) { flog++; if(!strcmp(result[flog].class0,"7")) { strcpy(temp9,result[flog].value0); flog++; strcpy(temp11,suanshubds()); strcpy(temp12," "); bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T("."); m_chucuo+=_T("<"); m_chucuo+=_T(temp9); m_chucuo+=_T(","); m_chucuo+=_T(temp10); m_chucuo+=_T(","); m_chucuo+=_T(temp11); m_chucuo+=_T(","); m_chucuo+=_T(temp12); m_chucuo+=_T("\t>\r\n"); return suanshubds(); } else { bb++; itoa(bb,B,10); m_chucuo+=_T(B); m_chucuo+=_T(".语法出错的位置坐标为"); m_chucuo+=_T("("); m_chucuo+=_T(result1[flog-1].value1); m_chucuo+=_T(","); m_chucuo+=_T(result1[flog-1].value2); m_chucuo+=_T("):"); //m_chucuo+=_T("产生式(<条件判断语句2> →;<语句><条件判断语句2>|空)中缺少;!\r\n"); m_chucuo+=_T("产生式(<关系表达式> → <算术表达式><关系符><算术表达式>) 中缺少<关系符>!\r\n"); suanshubds(); return 0; } } else { if(!strcmp(result[flog].class0,"7")) { flog++; suanshubds(); } else suanshubds(); return 0; } } char* CShixunView::newtemp() { char *p; char m[100]; p=(char*)malloc(100); k2++; itoa(k2,m,10); strcpy(p+1,m); p[0]='T'; return(p); }