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

📄 cifa.cpp

📁 实现编译
💻 CPP
字号:
#include <string.h>
#include "cifa.h"
#include "pl0.h"
#include "errors.h"

CCifa::CCifa(CPlCompiler *ppl)
{
	wt=new word_table[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;

	create_ht();

	ch=' ';
	line=1;
	pl=ppl;
}
CCifa::~CCifa()
{
	delete[] wt;
}
symbol CCifa::GetSymbol()
{
	FILE *fs=pl->fp;
	CErrors *err=pl->errors;
	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;
}
///////////////////////////////////////////////////////
//以下是保留字的查找表处理的相关函数
void CCifa::create_ht()
{
	for (int i=0;i<20;i++) ht[i]=-1;
	for (i=0;i<16;i++)
		ht[hush(wt[i].word)]=i;
}
int CCifa::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;
}
int CCifa::hushsrch(char *word)
{
	int p=ht[hush(word)];
	if (p==-1) return -1;
	if (stricmp(word,wt[p].word)!=0)
		return -1;
	return p;
}

⌨️ 快捷键说明

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