📄 cifa.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 + -