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

📄 wordanalysis.cpp

📁 PL0的编译系统,使用MFC编写界面,采用浮动窗口来仿VC的环境
💻 CPP
字号:
// WordAnalysis.cpp : implementation file
//

#include "stdafx.h"
#include "My1.h"
#include "WordAnalysis.h"
#include "Error.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWordAnalysis

CWordAnalysis::CWordAnalysis()
{
}
CWordAnalysis::CWordAnalysis(CCompiler *compiler)
{
	mCompiler=compiler;
	wt=new WordTable[16];
	strcpy(wt[0].word,"begin");		wt[0].sym=beginsym;
	strcpy(wt[1].word,"call");		wt[1].sym=callsym;
	strcpy(wt[2].word,"const");		wt[2].sym=constsym;
	strcpy(wt[3].word,"do");		wt[3].sym=dosym;
	strcpy(wt[4].word,"end");		wt[4].sym=endsym;
	strcpy(wt[5].word,"if");		wt[5].sym=ifsym;
	strcpy(wt[6].word,"odd");		wt[6].sym=oddsym;
	strcpy(wt[7].word,"procedure");		wt[7].sym=procsym;
	strcpy(wt[8].word,"read");		wt[8].sym=readsym;
	strcpy(wt[9].word,"then");		wt[9].sym=thensym;
	strcpy(wt[10].word,"var");		wt[10].sym=varsym;
	strcpy(wt[11].word,"while");		wt[11].sym=whilesym;
	strcpy(wt[12].word,"write");		wt[12].sym=writesym;
	strcpy(wt[13].word,"else");		wt[13].sym=elsesym;
	strcpy(wt[14].word,"repeat");		wt[14].sym=repeatsym;
	strcpy(wt[15].word,"until");		wt[15].sym=untilsym;

	CreateHashTable();
	ch=' ';
	line=1;
}
symbol CWordAnalysis::GetSymbol()
//get the symbol of the word
{
	FILE *fs=mCompiler->mFile;
	CError  *err=mCompiler->mError;
	int k,p;
	symbol sym;     
	
	while (ch==' '||ch=='\t'||ch=='\n')
		{
		if (ch=='\n') line++;
		ch=getc(fs);
		}
	//identifiers
	if ('a'<=ch&&ch<='z' || 'A'<=ch&&ch<='Z')
		{
		k=0;
		do{
			if (k<IDENT_LENGTH)
				id[k++]=ch;
			ch=getc(fs);
			}while ('a'<=ch&&ch<='z' || 'A'<=ch&&ch<='Z' ||'0'<=ch&&ch<='9');
		id[k]=0;		
		p=Hushsrch(id);
		sym=(p>=0) ? wt[p].sym : ident;
		}
	//number
	else if ('0'<=ch && ch<='9')
		{
		k=0;
		num=0;
		sym=number;
		do{
			num=num*10+ch-'0';
			k++;
			ch=getc(fs);
			}while ('0'<=ch && ch<='9');
		if (k>NUMBER_LENGTH)
			err->Add(30);
		if (num>MAX_NUMBER)
			{
			err->Add(31);
			num=0;
			}
		}
	//others
	else if (ch==':')
		{
		ch=getc(fs);
		if (ch=='=')
			{
			sym=becomes;
			ch=getc(fs);
			}
		else
			sym=nul;
		}
	else if (ch=='<')
		{
		ch=getc(fs);
		if (ch=='=')
			{
			sym=leq;
			ch=getc(fs);
			}
		else
			sym=lss;
		}
	else if (ch=='>')
		{
		ch=getc(fs);
		if (ch=='=')
			{
			sym=geq;
			ch=getc(fs);
			}
		else
			sym=gtr;
		}
	else
		{
		switch (ch)
		{
		case '+':sym=plus;break;
		case '-':sym=minus;break;
		case '*':sym=times;break;
		case '/':sym=slash;break;
		case '(':sym=lparen;break;
		case ')':sym=rparen;break;
		case '=':sym=eql;break;
		case '#':sym=neq;break;
		case ',':sym=comma;break;
		case '.':sym=period;break;
		case ';':sym=semicolon;break;
		case EOF:sym=endfile;break;
		default: sym=nul;
		}
		ch=getc(fs);
		}
	return sym;
}
int CWordAnalysis::Hushsrch(char *word)
{
	int p=ht[Hush(word)];
	if (p==-1) return -1;
	if (stricmp(word,wt[p].word)!=0)
		return -1;
	return p;
}
void CWordAnalysis::CreateHashTable()
{
	for (int i=0;i<20;i++) ht[i]=-1;
	for (i=0;i<16;i++)
		ht[Hush(wt[i].word)]=i;
}
int CWordAnalysis::Hush(char *s)
{
	int a=s[1],b=s[2];
	if (a>='a') a-='a'-'A';
	if (b>='a') b-='a'-'A';
	int h=a*2+b-100;
	if (h==40) h=0;
	else if(h==103) h=2;
	h%=21;
	if (h==20) h=3;
	return h;
}
CWordAnalysis::~CWordAnalysis()
{
	delete[] wt;
}


BEGIN_MESSAGE_MAP(CWordAnalysis, CWnd)
	//{{AFX_MSG_MAP(CWordAnalysis)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CWordAnalysis message handlers

⌨️ 快捷键说明

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