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

📄 by2view.cpp

📁 VC编译环境下实现编译器。 实现词法和语法分析。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// BY2View.cpp : implementation of the CBY2View class
//

#include "stdafx.h"
#include "BY2.h"
#include <stdlib.h>
#include "BY2Doc.h"
#include "BY2View.h"
#include "MainFrm.h"
#include "DataView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBY2View

IMPLEMENT_DYNCREATE(CBY2View, CEditView)

BEGIN_MESSAGE_MAP(CBY2View, CEditView)
	//{{AFX_MSG_MAP(CBY2View)
	ON_COMMAND(IDM_TEST, OnTest)
	ON_COMMAND(IDM_Build, OnBuild)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBY2View construction/destruction

CBY2View::CBY2View()
{
	// TODO: add construction code here
    keyword[0]="main";
	keyword[1]="int";
	keyword[2]="real";
	keyword[3]="char";
	keyword[4]="if";
	keyword[5]="else";
	r=0;
}

CBY2View::~CBY2View()
{
}

BOOL CBY2View::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
	cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// Enable word-wrapping

	return bPreCreated;
}

/////////////////////////////////////////////////////////////////////////////
// CBY2View drawing

void CBY2View::OnDraw(CDC* pDC)
{
	CBY2Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

}

/////////////////////////////////////////////////////////////////////////////
// CBY2View printing

BOOL CBY2View::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default CEditView preparation
	return CEditView::OnPreparePrinting(pInfo);
}

void CBY2View::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView begin printing.
	CEditView::OnBeginPrinting(pDC, pInfo);
}

void CBY2View::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView end printing
	CEditView::OnEndPrinting(pDC, pInfo);
}

/////////////////////////////////////////////////////////////////////////////
// CBY2View diagnostics

#ifdef _DEBUG
void CBY2View::AssertValid() const
{
	CEditView::AssertValid();
}

void CBY2View::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}

CBY2Doc* CBY2View::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBY2Doc)));
	return (CBY2Doc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CBY2View message handlers

void CBY2View::OnTest() 
{
	// TODO: Add your command handler code here
	 CString str(this->LockBuffer());
	 
	 int i=str.GetLength();	 
	 char k;	 
	 k=(char)str.GetAt(2);
	 if(k=='i')
	 {
	 this->MessageBox("ok");
	 }
}

void CBY2View::OnBuild() 
{
	// TODO: Add your command handler code here
	CDataView *pView=(CDataView *)((CMainFrame *)AfxGetMainWnd())->m_wndSplitter.GetPane(1,0);
	CString str(this->LockBuffer());
    this->UnlockBuffer();
	int j=str.GetLength();
	int i=0;
	int k=0;
	int flag=0;
	char temp;
	char TOKEN[9];
	char NUM[5];
	int error=0;
    
    int r=0;
	CBY2Doc* pDoc = GetDocument();
	(pDoc->result).Empty( );	
	if(i<j)
	temp=(char)str.GetAt(i);
	i++;
	while(i<=j)
	{				
		if(isalpha(temp))
		{
			TOKEN[0]=temp;
			//TOKEN.SetAt(0,temp);
			k++;
			if(i<j)
            temp=(char)str.GetAt(i);
			else
			temp=001;
			i++;
			while(isalnum(temp))
			{
			   if(k<8)
			   {
                  TOKEN[k]=temp;
				  //TOKEN.SetAt(k,temp);
				  if(i<j)
				  temp=(char)str.GetAt(i);
				  else
				  temp=001;
			      i++;
				  k++;
			   }//if(k<8)
               else
               {
				   if(i<j)
                   temp=(char)str.GetAt(i);
				   else
				   temp=001;
				   i++;
                   error=1;			       
			   }
			}//while(isalnum(temp))          
			TOKEN[k]='\0';
			//TOKEN.SetAt(k,temp);
			k=0;
			if(error==0)
			{
			  char t=Check_alphabet(TOKEN);
			  int num1=atoi(&t);
			  pDoc->result+='(';
			  pDoc->result+=t;
			  pDoc->result+=" ,  ";
			  pDoc->result+=TOKEN;
		 	  pDoc->result+=')';
			  pDoc->result+='\r';
			  pDoc->result+='\n';
			  result[r][0]=num1;
			  result[r][1]=flag;
			  r++;
			}
			if(error==1)
			{   
				char ch[10];
				CBY2Doc* pDoc = GetDocument();
				pDoc->result+="The Error in the ROW:";
				itoa(flag,ch,10);
				pDoc->result+=ch;
				pDoc->result+='\r';
				pDoc->result+='\n';         
				error=0;
			}
			//处理; 
		}//if(isalpha(temp))
        else
	    if(isdigit(temp))
		{
            if(temp=='0')
			{
                NUM[0]=temp;
				//NUM.SetAt(0,temp);
				if(i<j)
                temp=(char)str.GetAt(i);
				else
				temp=001;
			    i++;
			    k++;
			}//if(temp=='0')
			else
			{
				NUM[0]=temp;
				//NUM.SetAt(0,temp);
				if(i<j)
                temp=(char)str.GetAt(i);
				else
				temp=001;
			    i++;
				k++;
				while(isdigit(temp))
				{
                   if(k<5)
				   {
                      NUM[k]=temp;
					  //NUM.SetAt(0,temp);
					  if(i<j)
                      temp=(char)str.GetAt(i);
					  else
				      temp=001;
			          i++;
				      k++;
				   }//if(k<5)
				   else
				   {
					  if(i<j)
                      temp=(char)str.GetAt(i);
					  else
					  temp=001;
			          i++;
					  error=2;
				   }
				}//while(isdigit(ch))				
			}//else//if(temp=='0')
			NUM[k]='\0';
			//NUM.SetAt(k,temp);
			k=0;
			if(error==0)
			{
				char t='7';
				pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+=NUM;
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=7;
			    result[r][1]=flag;
				r++;
            }
			if(error==2)
			{
				char ch[10];
				CBY2Doc* pDoc = GetDocument();
				pDoc->result+="The Error in the ROW:";
				itoa(flag,ch,10);
				pDoc->result+=ch;
				pDoc->result+='\r';
				pDoc->result+='\n';         
				error=0;
				error=0;
			}
			//处理;
		}//if(isdigit(ch))
		else
		switch(temp)
		{
           case '&':
			     if(i<j)
                 temp=(char)str.GetAt(i);
				 else
				 temp=001;
			     i++;
				 if(temp=='&')
				 {
					 char t='8';
					 pDoc->result+='(';
					 pDoc->result+=t;
					 pDoc->result+=" ,  ";
				 	 pDoc->result+="&&";
					 pDoc->result+=')';
					 pDoc->result+='\r';
					 pDoc->result+='\n';
					 result[r][0]=8;
					 result[r][1]=flag;
					 r++;
					 if(i<j)
                     temp=(char)str.GetAt(i);
					 else
				     temp=001;
			         i++;
				 }
				 else
				 {
					error=3;					 
				 }
				 break;//case '&':
		   case '>':
			   if(i<j)
			   temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   if(temp=='=')
			   {
				   //chuli
				   CString t='9';
				   pDoc->result+='(';
				   pDoc->result+=t;
				   pDoc->result+=" ,  ";
				   pDoc->result+=">=";
				   pDoc->result+=')';
				   pDoc->result+='\r';
				   pDoc->result+='\n';
				   result[r][0]=9;
				   result[r][1]=flag;
				   r++;
				   if(i<j)
				   temp=(char)str.GetAt(i);
				   else
				   temp=001;
			       i++;
			   }
			   else
			   {
				   //chuli
				   CString t="12";
				   pDoc->result+='(';
				   pDoc->result+=t;
				   pDoc->result+=" ,  ";
				   pDoc->result+=">";
				   pDoc->result+=')';
				   pDoc->result+='\r';
				   pDoc->result+='\n';
				   result[r][0]=12;
				   result[r][1]=flag;
				   r++;
			   }
			   break;
		   case '<':
			   if(i<j)
			   temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   if(temp=='=')
			   {
                   char t[5]="10";
				   pDoc->result+='(';
				   pDoc->result+=t;
				   pDoc->result+=" ,  ";
				   pDoc->result+="<=";
				   pDoc->result+=')';
				   pDoc->result+='\r';
				   pDoc->result+='\n';
				   result[r][0]=10;
				   result[r][1]=flag;
				   r++;
				   //chuli
				  if(i<j)
				  temp=(char)str.GetAt(i);
				  else
				  temp=001;
			      i++;
			   }
			   else
			   {
				   char t[5]="13";
				   pDoc->result+='(';
				   pDoc->result+=t;
				   pDoc->result+=" ,  ";
				   pDoc->result+="<";
				   pDoc->result+=')';
				   pDoc->result+='\r';
				   pDoc->result+='\n';
				   result[r][0]=13;
				   result[r][1]=flag;
				   r++;
			   }
			   break;
		   case '!':
			   if(i<j)
			   temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   if(temp=='=')
			   {
				   char t[5]="15";
				   pDoc->result+='(';
				   pDoc->result+=t;
				   pDoc->result+=" ,  ";
				   pDoc->result+=">";
				   pDoc->result+=')';
				   pDoc->result+='\r';
				   pDoc->result+='\n';
				   result[r][0]=15;
				   result[r][1]=flag;
				   r++;
				   //chuli
				  if(i<j)
				  temp=(char)str.GetAt(i);
				  else
				  temp=001;
			      i++;
			   }
			   else
			   {
				    error=3;
			   }
			   break;
		   case '(':
			   {
			    char t[5]="16";
			    pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+="  (  ";
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=16;
				result[r][1]=flag;
				r++;
			   }
               //chuli
			   if(i<j)
               temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   break;
		   case ')':
			   {
			    char t[5]="17";
			    pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+="  )  ";
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=17;
				result[r][1]=flag;
				r++;
			   }
               //chuli
			   if(i<j)
               temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   break;		   
           case '{':
			   {
               	char t[5]="18";
			    pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+="  {  ";
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=18;
				result[r][1]=flag;
				r++;
			   }
               //chuli
			   if(i<j)
               temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   break;
		   case '}':
			   {
			   	char t[5]="19";
			    pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+="  }  ";
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=19;
				result[r][1]=flag;
				r++;
			   }
               //chuli
			   if(i<j)
               temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   break;
           case '+':
			   {
			   	char t[5]="20";
			    pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+="  +  ";
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=20;
				result[r][1]=flag;
				r++;
			   }
               //chuli
			   if(i<j)
               temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   break;
		   case '-':
			   {
			   	char t[5]="21";
			    pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+="  -  ";
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=21;
				result[r][1]=flag;
				r++;
			   }
               //chuli
			   if(i<j)
               temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   break;
		   case '*':
			   {
			   	char t[5]="22";
			    pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+="  *   ";
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=22;
				result[r][1]=flag;
				r++;
			   }
               //chuli
			   if(i<j)
               temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   break;
		   case '/':
			   if(i<j)
			   temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   if(temp=='/')
			   {
				  if(i<j)
                  temp=(char)str.GetAt(i);
				  else
			      temp=001;
			      i++;
				  while(temp!=13)
				  {
					  if(i<j)
					  temp=(char)str.GetAt(i);
					  else
					  temp=13;
					  i++;
				  }
				  if(i<j)
                  temp=(char)str.GetAt(i);
				  else
			      temp=10;
			      i++;
			   }
			   else
			   if(temp=='*')
			   {
				  if(i<j)
                  temp=(char)str.GetAt(i);
				  else
			      temp=001;
			      i++;
				  int finish=1;
				  while(finish)
				  {
					  if(temp=='*')
					  {
						  if(i<j)
						  temp=(char)str.GetAt(i);
						  else
			              temp=001;
			              i++;
						  if(temp=='/')
						  {
							  finish=0;
						  }
						  else
						  i--;
					  }
					  if(i<j)
					  temp=(char)str.GetAt(i);
					  else
			          temp=001;
			          i++;
					  if(i>=j) break;
				  }
			   }//if(temp=='*')
			   else
			   {
					char t[5]="23";
					pDoc->result+='(';
					pDoc->result+=t;
					pDoc->result+=" ,  ";
					pDoc->result+="  /  ";
					pDoc->result+=')';
					pDoc->result+='\r';
					pDoc->result+='\n';
					result[r][0]=23;
				    result[r][1]=flag;
				    r++;
			   }
			   break;
		   case '.':
			   {
               	char t[5]="24";
			    pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+="  .  ";
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=24;
				result[r][1]=flag;
				r++;
			   }
			   if(i<j)
               temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   break;

          case ';':
			  {
               	char t[5]="25";
			    pDoc->result+='(';
				pDoc->result+=t;
				pDoc->result+=" ,  ";
				pDoc->result+="  ;  ";
				pDoc->result+=')';
				pDoc->result+='\r';
				pDoc->result+='\n';
				result[r][0]=25;
				result[r][1]=flag;
				r++;
			  }
			   if(i<j)
               temp=(char)str.GetAt(i);
			   else
			   temp=001;
			   i++;
			   break;
		  case ' ':

⌨️ 快捷键说明

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