📄 11.cpp
字号:
#include<stdio.h>
#include<iomanip.h>
#include<iostream.h>
#include<process.h>
#include<string.h>
int al=10,norw=13,nmax=14;
int kk=al,cc,ll,cx,num;
char line[81],ch,id[10]=" ",a[20];
enum symbol
{nul,ident,number,plus,minus,times,slash,oddsym,eql,neq,lss,
leq,gtr,geq,lparen,rparen,comma,semicolon,period,becomes,
beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,
dosym,callsym,constsym,varsym,procsym};
enum symbol sym;
char word[][11]={"begin ",
"begin ",
"call ",
"const ",
"do ",
"end ",
"if ",
"odd ",
"procedure ",
"read ",
"then ",
"var ",
"while ",
"while "
};
enum symbol wsym[14],ssym[200];
FILE *fin,*fal,*fp;
void getch()
{
if((fal=fopen("d:\\li.txt","a"))==NULL)
{
cout<<"can not open the fal"<<endl;
exit(0);
}
if(cc==ll)
{
if(feof(fin))
{
cout<<"program incomplete";
return ;
}
ll=0;cc=0;
printf("%4d ",cx);
fprintf(fal,"%4d ",cx);
ch=' ';
while(ch!=10)
{
ch=fgetc(fin);
if(feof(fin)) break;
printf("%c",ch);
fputc(ch,fal);
line[ll]=ch;
ll++;
}
}
ch=line[cc];
cc++;
fclose(fal);
}
void write(symbol sym,char *a)
{
fp=fopen("d:\\liword.txt","a+");
if(fp){
fprintf(fp,"(%-4d",sym);
fprintf(fp,"%s)\n",a);
}
fclose(fp);
}
void getsym()
{
int k,i,j;
// char a[20]=" ";
while(ch==' '||ch=='\n')
getch();//滤掉空格和换行符//
if(ch>=97&&ch<=122)
{
k=0;
while((ch>=97&&ch<=122)||(ch>='0'&&ch<='9'))
{
if(k<al)
{
a[k]=ch;k++;
}
getch();
}
if(k>=kk) kk=k;
else
{
while(kk!=k-1)
{
a[kk]=' ';
kk--;
}
}
strncpy(id,a,10);
i=1;
j=norw;//折半查找法
/*do
{
k=(i+j)/2;
if(strcmp(id,word[k])<=0)//有问题*********
j=k-1;
if(strcmp(id,word[k])>=0)
i=k+1;
}
while(i<=j);
if(i-1>=j)
sym=wsym[k];
else
sym=ident;*/
while(i<j){
k=(i+j)/2;
if(strcmp(id,word[k])<0)
j=k-1;
else if(strcmp(id,word[k])>0)
i=k+1;
else if(strcmp(id,word[k])==0)
{
sym=wsym[k];
break;}
}
if(strcmp(id,word[i])==0)
sym=wsym[i];
else sym=ident;
write(sym,id);
}//getsym识别标识符结束
else if(ch>='0'&&ch<='9')
{
k=0;num=0;
sym=number;
strcpy(id," ");
while(ch>='0'&&ch<='9')
{
a[k]=ch;
num=10*num+(ch-'0');
k++;
getch();
}
if(k>nmax)
cout<<"error(30)"<<endl;
write(sym,a);
}//getsym识别整数
else if(ch==':')
{
strcpy(id," ");
id[0]=ch;
getch();
if(ch=='=')
{
id[1]=ch;
sym=becomes;//:=
write(sym,id);
getch();
}
else
{sym=nul;//:
write(sym,id);
}
}
else if(ch=='<') {
strcpy(id," ");
id[0]=ch;
getch();
if(ch=='=')
{ id[1]=ch;
sym=leq;//<=
write(sym,id);
getch();
}
else {
sym=lss;//<
write(sym,id);
}
}
else if(ch=='>')
{
strcpy(id," ");
id[0]=ch;
getch();
if(ch=='=')
{id[1]=ch;
sym=geq;//>=
write(sym,id);
getch();
}
else {sym=gtr;//>
write(sym,id);
}
}
else
{ //if(ch=='\n')
strcpy(id," ");
id[0]=ch;
sym=ssym[ch];//其它运算符则到main中的ssym[]数组中进行处理
write(sym,id);
if(ch=='.') exit(0);
else getch();
}
//getsym识别运算符
// fclose(fal);
}
void main()
{
int cc=0,cx=0,ll=0;
wsym[1]=beginsym;wsym[2]=callsym;
wsym[3]=constsym;wsym[4]=dosym;
wsym[5]=endsym;wsym[6]=ifsym;
wsym[7]=oddsym;wsym[8]=procsym;
wsym[9]=readsym;wsym[10]=thensym;
wsym[11]=varsym;wsym[12]=whilesym;
wsym[13]=writesym;
ssym['+']=plus;ssym['-']=minus;
ssym['*']=times;ssym['/']=slash;
ssym['(']=lparen;ssym[')']=rparen;
ssym['=']=eql;ssym[',']=comma;
ssym['.']=period;ssym['#']=comma;
ssym[';']=semicolon;//其中'='的ASCII最大
if((fin=fopen("D:\\lei.txt","r"))==NULL)
{
cout<<"can not open the fin"<<endl;
exit(0);
}
while(ch!='.')
getsym();
cout<<sym<<endl;
fclose(fin);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -