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

📄 11.cpp

📁 编译原理课后习题答案
💻 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 + -