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

📄 22.cpp

📁 编译原理的词法分析 改编PL/0成C
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>

#include <ctype.h>
#include <string.h>
/*const int*/
#define norw   13
#define txmax  100
#define nmax   14
#define al     10
#define amax   2047
#define levmax 3
#define cxmax  14
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
};
/*typedef alfa char[al+1];*/
char ch;
enum symbol sym;
/*alfa id;*/
char id[al+1];
int num;
int cc;   //用于控制每行的单个字符
int ll;   //计算每行的字符数
int linec=0;//行的计数器
int lastlinec=0;
int kk;
int cx;
/*alfa a*/
char a[al+1];
char line[82];
/*alfa word[norw+1][];*/
char word[norw+1][al+1]={{""},
{"begin     "},{"call      "},
{"const     "},{"do        "},
{"end       "},{"if        "},
{"odd       "},{"procedure "},
{"read      "},{"then      "},
{"var       "},{"while     "},
{"write     "}};
enum symbol wsym[norw+1];
char tokenword[norw+1][al+1]={{""},
{"beginsym  "},{"callsym  "},
{"constsym  "},{"dosym    "},
{"endsym    "},{"ifsym    "},
{"oddsym    "},{"procsym  "},
{"readsym   "},{"thensym  "},
{"varsym    "},{"whilesym "},
{"writesym  "}};
/*char tokenssym[127][al+1];
tokenssym['+'][al+1]="plus      ";
tokenssym['-'][al+1]="minus     ";
tokenssym['*'][al+1]="times     ";
tokenssym['/'][al+1]="slash     ";
tokenssym['('][al+1]="lparen    ";
tokenssym[')'][al+1]="rparen    ";
tokenssym['='][al+1]="eql       ";
tokenssym[','][al+1]="comma     ";
tokenssym['.'][al+1]="period    ";
tokenssym['#'][al+1]="neq       ";
tokenssym[';'][al+1]="semicolon ";*/
symbol ssym[127];/*常用的字符集合是0~127之间*/

int err;
//char inputchgetsym[al+1];
FILE *fa1,*ftoken,*fa2,*fin,*fou;
/*char *changedgtochar(int n)
{
	int ni,r;
	if(r=n%10)
} */
void error(int n)
{

	char ab[10]="error:";
	//ab[7]=linec+48;//0--48
	printf("  %d line",linec);
	//ab[8]=cc-1+48;
	printf(" %d column",cc-1);
	//ab[9]=n+48;
	printf("  error code is %d\n",n);
	//fwrite(ab,sizeof(char),10,fa1);
	err=err+1;
}

void getchsym()
{
	if(cc==ll)
	{
	       //printf("end of a line!");
		if(feof(fin))
		{
			lastlinec=1;
			printf("\nprogram incomplete!");
			exit(1);
		}
		ll=0;
		cc=0;
		while((ch=fgetc(fin))!='\n'&&!feof(fin))
		{
			ll=ll+1;
			/*fputc(ch,fin);*/
			printf("%c",ch);
			//fputc(ch,fa1);
			/*ch=fgetc(fin);*/
			/*fputc(ch,fin);*/
			/*fputc(ch,fa1);*/
			line[ll]=ch;
		}
		printf("\n");
		ll=ll+1;
		line[ll]='\n';
		linec=linec+1;//出现一行,计数一行
	/*	fread(&line,sizeof(char),ll,fin);*/
	}
	cc=cc+1;
	ch=line[cc];
       //	printf("%c",ch);
}
void getsym()
{
	int i,j,k;
	while(ch==' '||ch=='\x0')/*one problem''ch=='\x0'''是保存在文件中的回车*/
	{
		getchsym();
	}
	if (islower(ch))//是ch in ['a'..'z']
	{
	   k=0;
	   do
		{
			if (k<al)
			{
				//k=k+1;
				a[k]=ch;
				k=k+1;
			}
			getchsym();
		}while(islower(ch)||isdigit(ch));//是not(ch in ['a'..'z','0'..'9'])
		if (k>=kk)
			kk=k;
		else
			do
			{
				a[kk]=' ';
				kk=kk-1;
			}while(kk>=k);
		//与id=a;对应
		for(i=0;i<al+1;i++)
			{
			 id[i]=a[i];
			 //printf("\nid[%d]=%c",i,id[i]);
			 }
		i=1;
		j=norw;
		do
			{
				k=(i+j)/2;
				if(strcmp(id,word[k])<=0)
				{      // printf("%d   ",strcmp(id,word[k]));
					j=k-1;

				}
				if(strcmp(id,word[k])>=0)
				{
					//printf("%d",strcmp(id,word[k]));
					i=k+1;
				}

			}while(i<=j);
		       //	printf("last%d",strcmp(id,word[k]));
			if(i-1>j)
			{
				sym=wsym[k];
				fwrite(&tokenword[k],sizeof(char),al+1,ftoken);
				return;
			}
			else
			 {
				sym=ident;
				fwrite(&id,sizeof(char),al+1,ftoken);
				return;
			 }

	}

	if(isdigit(ch))
	{
		k=0;
		num=0;
		sym=number;
		char numchar[cxmax];//max size of code array
		int numnum=0;
		//inputchgetsym[]="number    ";
		//fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
		do
		{
			numchar[numnum]=ch;
			numnum++;
			num=10*num+ch-'0';//ch-'0'为c语言的特点使用来获得到数值转化
			k=k+1;
			getchsym();

		}while(isdigit(ch));
		for(;numnum<cxmax;numnum++)
			numchar[numnum]=' ';
		fwrite(&numchar,sizeof(char),cxmax,ftoken);
		if (k>nmax)
		     {
			error(30);
			return;
		     }

	}
	else
		if (ch==':')
		{
			getchsym();
			if(ch=='=')
			{
				sym=becomes;
				char inputchgetsym[]=":=        ";
				fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
				getchsym();
				return;

			}
			else
			 {
				sym=nul;
				char inputchgetsym[]=":         ";
				fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
				return;
			 }
		}
		else
			if(ch=='<')
			{
				getchsym();
				if(ch=='=')
				{
					sym=leq;
					char inputchgetsym[]="<=        ";
					fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
					getchsym();
					return;
				}
				else
				 {
					sym=lss;
					char inputchgetsym[]="<         ";
					fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
					return;
				 }
			}
		else
			if(ch=='>')
			{
				getchsym();
				if(ch=='=')
				{
					sym=geq;
					char inputchgetsym[]=">=        ";
				    fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
					getchsym();
					return;
				}
				else
				  {
					sym=gtr;
					char inputchgetsym[]=">         ";
					fwrite(&inputchgetsym,sizeof(char),al+1,ftoken);
					return;
				  }
			}
		else if(ch=='\n')
			getchsym();
		else
	       {
		sym=ssym[ch];
		char inputchgetsym;
		if(sym==plus)
		   inputchgetsym='+';
		if(sym==minus)
		   inputchgetsym='-';
		if(sym==times)
		   inputchgetsym='*';
		if(sym==slash)
		   inputchgetsym='/';
		if(sym==lparen)
		   inputchgetsym='(';
		if(sym==rparen)
		   inputchgetsym=')';
		if(sym==eql)
		   inputchgetsym='=';
		if(sym==comma)
		   inputchgetsym=',';
		if(sym==period)
		   inputchgetsym='.';
		if(sym==neq)
		   inputchgetsym='#';
		if(sym==semicolon)
		   inputchgetsym=';';
		fwrite(&inputchgetsym,sizeof(char),1,ftoken);
		getchsym();
		return;
		}
}


main()
{
char ch,fname1[100]="source.txt",fname2[100]="error.txt",fname3[100]="token.txt";
/*fname[100]="D:\1.txt",fnamee[100];不能使用盘路径*/
char chafou[3]="w";/*写入文件的状态*/
char chafin[3]="r";/*读出文件的状态*/
/*clrscr()*/;
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['#']=neq;
ssym[';']=semicolon;

cc=0;
ll=0;
ch=' ';
kk=al-1;



/*printf("\nEnter a file name :");*/
/*scanf("%s",fname);*/
/*getchar();*/
if((fin=fopen(fname1,chafin))==NULL)
{
	printf("open %s file Error.\n",fname1);
	exit(0);
}
if((fa1=fopen(fname2,chafou))==NULL)
{
	printf("open %s file Error.\n",fname2);
	exit(0);
}
if((ftoken=fopen(fname3,chafou))==NULL)
{
	printf("open %s file Error.\n",fname3);
	exit(0);
}
ch=fgetc(fin);
while(ch!=EOF)
	{
	putchar(ch);
	ch=fgetc(fin);
	}
printf("\nOK! in read.\n");
rewind(fin);
while(lastlinec!=1)
	getsym();
fclose(fin);
fclose(fa1);
fclose(ftoken);
return 0;
}

⌨️ 快捷键说明

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