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