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