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

📄 exam5_2view.cpp

📁 编译原理的词法分析程序的实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Exam5_2View.cpp : implementation of the CExam5_2View class
#include "stdafx.h"
#include "Exam5_2.h"

#include "Exam5_2Doc.h"
#include "Exam5_2View.h"


#include <iostream>
#include <fstream>
#include <new>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <climits>
#include "common.h"


using namespace std;



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

/////////////////////////////////////////////////////////////////////////////
// CExam5_2View


IMPLEMENT_DYNCREATE(CExam5_2View, CView)

BEGIN_MESSAGE_MAP(CExam5_2View, CView)
	//{{AFX_MSG_MAP(CExam5_2View)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CExam5_2View construction/destruction


char* prog;								//当前执行点在源代码中的位置
char* p_buf;							//指向程序缓冲区的开始
tok_types token_type;			        //保存令牌类型
char token[MAX_T_LEN + 1];				//当前的令牌
token_ireps tok;
 int floor[100];                  //记录每层的单词数
 int f=0;                                 //记录层数
 int flength[100]; //记录每层的长度 


CExam5_2View::CExam5_2View()
{
	// TODO: add construction code here

}

CExam5_2View::~CExam5_2View()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CExam5_2View drawing

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

	 CString outstr[13];
	outstr[0]="未定义字符";
	outstr[1]="分隔符";
	outstr[2]="标识符";
	outstr[3]="数值";
	outstr[4]="保留字";
    outstr[5]="保留字或标识符"; 
	outstr[6]="字符串";
	outstr[7]="代码块";
	outstr[8]="出错";
	outstr[9]=" ";
	outstr[10]="“";
	outstr[11]="”";
	outstr[12]="}";


      
  int x,y=0;
  for (int i=0;i<100;i++)
{
	flength[i]=0;
}

	try
    {
        p_buf = new char[PROG_SIZE];
    }
    catch (bad_alloc exc)
    {  x=y=0;
       pDC->TextOut(x,y,outstr[8]);
    }
     
    char* fname;
    
    fname = "source.txt";
    if (!load_program(p_buf, fname))
       	pDC->TextOut(x,y,outstr[8]);

	

    prog = p_buf;

    
    CString outstr1[PROG_SIZE];
	CSize strSize[PROG_SIZE-1];
	CSize strSize1[PROG_SIZE-1];
	CSize strSize2[PROG_SIZE-1];
	

    tok_types type;
    try
    {   
	  
		for (int i=0;i<=PROG_SIZE-1;i++)
		
        {
           type= get_token();

            if (tok == myEND)
			{   x=ENDL;y=ENDW;
				pDC->SetTextColor (RGB(176,224,230));
				pDC->TextOut(x,y,outstr[12]);
            	break;
			}
		
	    	outstr1[i]=(CString)token;
	     
		
			TEXTMETRIC tm;	
       switch (type)
	   { 
            case UNDEFTT:                //未定义字符  深蓝
                {   x=0;
					if (i==0)
			
				{
				pDC->SetTextColor (RGB(25,25,112));
				pDC->TextOut(x,y,outstr1[0]);
					}
				   
				else 
				{ 
					if (strcmp(outstr1[i-1],")")==0 || strcmp(outstr1[i-1],"}")==0 || strcmp(outstr1[i-1],";")==0 )
					{	y=y+tm.tmHeight+100*tm.tmExternalLeading;
				        x=0;
						floor[f]=i;
						f=f+1;
						for (int k=i-1;k>=0;k--)
						{  strSize2[k] =pDC->GetTextExtent(outstr1[k],outstr1[k].GetLength());
						    flength[f]=flength[f]+strSize2[k].cx;

						}

					}

					for (int j=0;j<=i-1;j++)
					{pDC->GetTextMetrics (&tm);
				 strSize[j] =pDC->GetTextExtent(outstr1[j],outstr1[j].GetLength());
				 x=x+strSize[j].cx;
	             }
					x=x+i*5; 

					

					

					if (f>=1)
					{   
						for (int k=f-1;k>=0;k--)
						{
							x=x-flength[k];
						}
						x=x-LENGTH;
					}
			
					

					
					
					pDC->SetTextColor (RGB(25,25,112));
				 pDC->TextOut(x,y,outstr1[i]);
				}
					}

				
				
				 break;
            case DELIMITER:                  //分隔符 灰色
               
				{    x=0;
					if(i==0)              
				{pDC->SetTextColor (RGB(155,155,155));   
				pDC->TextOut(x,y,outstr1[0]);}
				else{
					   if (strcmp(outstr1[i-1],")")==0 || strcmp(outstr1[i-1],"}")==0 || strcmp(outstr1[i-1],";")==0 )
					{	y=y+tm.tmHeight+100*tm.tmExternalLeading;
				        x=0;
						floor[f]=i;
						f=f+1;
						for (int k=i-1;k>=0;k--)
						{  strSize2[k] =pDC->GetTextExtent(outstr1[k],outstr1[k].GetLength());
						    flength[f]=flength[f]+strSize2[k].cx;

						}

					}

				    	for (int j=0;j<=i-1;j++)
						{pDC->GetTextMetrics (&tm);
				          strSize[j] =pDC->GetTextExtent(outstr1[j],outstr1[j].GetLength());
				         x=x+strSize[j].cx;
	                     }
						x=x+i*5; 
						
						  

						
                        if (f>=1)
					{   
						for (int k=f-1;k>=0;k--)
						{
							x=x-flength[k];
						}
						x=x-LENGTH;
					}
				
						

					
						pDC->SetTextColor (RGB(155,155,155));
				         pDC->TextOut(x,y,outstr1[i]);
				}
						}
			
				 break;
            case IDENTIFIER:            //标识符 黑色
			
				{    x=0;
					if (i==0)
				{	
						pDC->SetTextColor (RGB(0,0,0));
				    pDC->TextOut(x,y,outstr1[0]);}
				else{
					
				if (strcmp(outstr1[i-1],")")==0 || strcmp(outstr1[i-1],"}")==0 || strcmp(outstr1[i-1],";")==0 )
					{	y=y+tm.tmHeight+100*tm.tmExternalLeading;
				        x=0;
						floor[f]=i;
						f=f+1;
						for (int k=i-1;k>=0;k--)
						{  strSize2[k] =pDC->GetTextExtent(outstr1[k],outstr1[k].GetLength());
						    flength[f]=flength[f]+strSize2[k].cx;

						}

					}


				  for (int j=0;j<=i-1;j++)
				  {pDC->GetTextMetrics (&tm);
				  strSize[j] =pDC->GetTextExtent(outstr1[j],outstr1[j].GetLength());
				 x=x+strSize[j].cx;
	             }
				  
				  x=x+i*5; 

                  	
				  
				     if (f>=1)
					{   
						for (int k=f-1;k>=0;k--)
						{
							x=x-flength[k];
						}
						x=x-LENGTH;
					}
			
					
				 
				  pDC->SetTextColor (RGB(0,0,0));
				 pDC->TextOut(x,y,outstr1[i]);
				}
				  }
                    
				
				 break;
            case NUMBER:   //数值  亮红色
             
				
			
				{   x=0;
					if (i==0)	
				{	pDC->SetTextColor (RGB(246,20,50));
				pDC->TextOut(x,y,outstr1[0]);}
				else {

				
                 if (strcmp(outstr1[i-1],")")==0 || strcmp(outstr1[i-1],"}")==0 || strcmp(outstr1[i-1],";")==0 )
					{	y=y+tm.tmHeight+100*tm.tmExternalLeading;
				        x=0;
						floor[f]=i;
						f=f+1;
						for (int k=i-1;k>=0;k--)
						{  strSize2[k] =pDC->GetTextExtent(outstr1[k],outstr1[k].GetLength());
						    flength[f]=flength[f]+strSize2[k].cx;

						}

					}

				 for (int j=0;j<=i-1;j++)
				 { pDC->GetTextMetrics (&tm);
				  strSize[j] =pDC->GetTextExtent(outstr1[j],outstr1[j].GetLength());
				 x=x+strSize[j].cx;
	             }
				 
				 x=x+i*5;  
				 

				 	

				    if (f>=1)
					{   
						for (int k=f-1;k>=0;k--)
						{
							x=x-flength[k];
						}
						x=x-LENGTH;
					}
			
		
				 
				 pDC->SetTextColor (RGB(246,20,50));
				 pDC->TextOut(x,y,outstr1[i]);
				}
				 }

				
                break;
            case KEYWORD: //关键字  蓝色
			
				{ x=0;
					if (i==0)
				{pDC->SetTextColor (RGB(0,0,255));
				pDC->TextOut(x,y,outstr1[0]);}
				else{
				  
                     if (strcmp(outstr1[i-1],")")==0 || strcmp(outstr1[i-1],"}")==0 || strcmp(outstr1[i-1],";")==0 )
					{	y=y+tm.tmHeight+100*tm.tmExternalLeading;
				        x=0;
						floor[f]=i;
						f=f+1;
						for (int k=i-1;k>=0;k--)
						{  strSize2[k] =pDC->GetTextExtent(outstr1[k],outstr1[k].GetLength());
						    flength[f]=flength[f]+strSize2[k].cx;

						}

					}
					
					for (int j=0;j<=i-1;j++)
				  {pDC->GetTextMetrics (&tm);
				  strSize[j] =pDC->GetTextExtent(outstr1[j],outstr1[j].GetLength());
				 x=x+strSize[j].cx;
				  }
				  x=x+i*5; 


				  


				  
                 if (f>=1)
					{   
						for (int k=f-1;k>=0;k--)
						{
							x=x-flength[k];
						}
						x=x-LENGTH;
					}
				
				  
				 
				  pDC->SetTextColor (RGB(0,0,255));
				 pDC->TextOut(x,y,outstr1[i]);
				}
				  }

				
                break;
            case TEMP:         //保留字或标识符   绿松色
			
				{
					 x=0;
					 if (i==0)
				{pDC->SetTextColor (RGB(0,200,140));
				pDC->TextOut(x,y,outstr1[0]);}
			     else{

				if (strcmp(outstr1[i-1],")")==0 || strcmp(outstr1[i-1],"}")==0 || strcmp(outstr1[i-1],";")==0 )
					{	y=y+tm.tmHeight+100*tm.tmExternalLeading;
				        x=0;
						floor[f]=i;
						f=f+1;
						for (int k=i-1;k>=0;k--)
						{  strSize2[k] =pDC->GetTextExtent(outstr1[k],outstr1[k].GetLength());
						    flength[f]=flength[f]+strSize2[k].cx;

						}

					}

				  for (int j=0;j<=i-1;j++)
				  {pDC->GetTextMetrics (&tm);
				  strSize[j] =pDC->GetTextExtent(outstr1[j],outstr1[j].GetLength());
				 x=x+strSize[j].cx;
	             }
				  
				  x=x+i*5; 
				  
				  	 

				  

				  if (f>=1)
					{   
						for (int k=f-1;k>=0;k--)
						{
							x=x-flength[k];
						}
						x=x-LENGTH;
					}
			
				  
				  pDC->SetTextColor (RGB(0,200,140));
				 pDC->TextOut(x,y,outstr1[i]);
				 }
				  }

				
               break;
            case STRING:               //字符串  闪蓝色  加下划线
			
				{
					 x=0;
					 if (i==0)
				{
						 pDC->SetTextColor (RGB(30,144,255));
				pDC->TextOut(x,y,outstr1[0]);
					 }
			      else{

					  if (strcmp(outstr1[i-1],")")==0 || strcmp(outstr1[i-1],"}")==0 || strcmp(outstr1[i-1],";")==0 )
					{	y=y+tm.tmHeight+100*tm.tmExternalLeading;
				        x=0;
						floor[f]=i;
						f=f+1;
						for (int k=i-1;k>=0;k--)
						{  strSize2[k] =pDC->GetTextExtent(outstr1[k],outstr1[k].GetLength());
						    flength[f]=flength[f]+strSize2[k].cx;

						}

					}


				  for (int j=0;j<=i-1;j++)
				  {	 
				pDC->GetTextMetrics (&tm);
				  strSize[j] =pDC->GetTextExtent(outstr1[j],outstr1[j].GetLength());
				 x=x+strSize[j].cx;
	             }
				  
				  x=x+i*5;


				  
				  
				   if (f>=1)
					{   
						for (int k=f-1;k>=0;k--)
						{
							x=x-flength[k];
						}
						x=x-LENGTH;
					}
				
				    
				   

				   


				  
				    CFont NewFont1,NewFont2;
				
               
	NewFont1.CreateFont(0,0,0,0,
		FW_NORMAL,
		false,false,false,
		ANSI_CHARSET,
    	OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,
		DEFAULT_QUALITY,
		DEFAULT_PITCH|FF_DONTCARE,
		"黑体");
	
	CFont *pOldFont;

	pOldFont=pDC->SelectObject(&NewFont1);
					

	             NewFont2.CreateFont(0,0,0,0,
	                   		FW_NORMAL,
		               false,true,false,
		                ANSI_CHARSET,
		                OUT_DEFAULT_PRECIS,		
	                    CLIP_DEFAULT_PRECIS,
		                DEFAULT_QUALITY,
		                DEFAULT_PITCH|FF_DONTCARE,

⌨️ 快捷键说明

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