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

📄 词法分析.cpp

📁 C语言编译器的设计与实现
💻 CPP
字号:
 #include<stdio.h>
#include "string.h"
#include "pl0.h"
#define stacksize 500

void init()
{
	int i;
	for(i=0;i<=255;i++)
	{
		ssym[i]=nul;
	}
	ssym['+']=plus;
	ssym['-']=minus;
	ssym['*']=times;
	ssym['/']=slash;
	ssym['(']=lparen;
	ssym[')']=rparen;
	ssym['=']=eql;
	ssym[',']=comma;
    ssym['.']=period;
    ssym['#']=neq;
    ssym[';']=semicolon;
	
	strcpy(&(word[0][0]),"begin");
    strcpy(&(word[1][0]),"call");
    strcpy(&(word[2][0]),"const");
    strcpy(&(word[3][0]),"do");
    strcpy(&(word[4][0]),"end");
	strcpy(&(word[5][0]),"if");
	strcpy(&(word[6][0]),"ood");
	strcpy(&(word[7][0]),"procedure");
	strcpy(&(word[8][0]),"read");
	strcpy(&(word[9][0]),"then");
	strcpy(&(word[10][0]),"var");
	strcpy(&(word[11][0]),"while");
	strcpy(&(word[12][0]),"write");

	wsym[0]=beginsym;
    wsym[1]=callsym;
    wsym[2]=constsym;
    wsym[3]=dosym;
    wsym[4]=endsym;
    wsym[5]=ifsym;
    wsym[6]=oddsym;
    wsym[7]=procsym;
    wsym[8]=readsym;
    wsym[9]=thensym;
    wsym[10]=varsym;
    wsym[11]=whilesym;
    wsym[12]=writesym;

	strcpy(&(mnemonic[lit][0]),"lit");
	strcpy(&(mnemonic[opr][0]),"opr");
	strcpy(&(mnemonic[lod][0]),"lod");
	strcpy(&(mnemonic[sto][0]),"sto");
	strcpy(&(mnemonic[cal][0]),"cal");
	strcpy(&(mnemonic[inte][0]),"int");
	strcpy(&(mnemonic[jmp][0]),"jmp");
	strcpy(&(mnemonic[jpc][0]),"jpc");

	for(i=0;i<symnum;i++)
	{
		declbegsys[i]=false;
		statbegsys[i]=false;
        facbegsys[i]=false;
	}

	declbegsys[constsym]=true;
    declbegsys[varsym]=true;
    declbegsys[procsym]=true;
	
	statbegsys[beginsym]=true;
	statbegsys[callsym]=true;
	statbegsys[ifsym]=true;
	statbegsys[whilesym]=true;

	facbegsys[ident]=true;
	facbegsys[number]=true;
	facbegsys[lparen]=true;
}


int getch()
{
	if(cc==ll)
	{
		if(feof(fin))
		{
			printf("program incomplete");
			return -1;
		}                                                                          
		ll=0;                                                                                                                                                                                                                                                                                                                                                                                                                                    
		cc=0;
		cx++;                     //行号
		printf("%d   ",cx);
		fprintf(fa1,"%d",cx);
		ch=' ';
		while(ch!=10)
		{
			if(EOF==fscanf(fin,"%c",&ch))
			{
				line[ll]=0;
				break;
			}
			printf("%c",ch);
			fprintf(fa1,"%c",ch);
			line[ll]=ch;
			ll++;
		}
		printf("\n");
		fprintf(fa1,"\n");
	}
	ch=line[cc];
	cc++;
	return 0;
}

int getsym()
{
int i,j,k;
while(ch==' '||ch==10||ch==9)  /*忽略空格、换行和TAB*/
	{
       getchdo;
	}
if(ch>='a'&&ch<='z')          /*名字或保留字以a、z开头*/
  {
      k=0;
	  do
	  {
	    if(k<al)
		{
		   a[k]=ch;
		   k++;
		}		 
	    getchdo;
      }while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');
a[k]=0;
strcpy(id,a);
i=0;
j=norw-1;
   
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];
   printf("\n单词是%s  ",word[k]);//输出单词
}
else                                    
{
   sym=ident;
   printf("\n标示符是%s",a);//输出标示符
} 
}
     else 
	 {
	   if(ch>='0'&&ch<='9')          /*检测数字*/
	   {
        k=0;
        num=0;
        sym=number;

     do{
		num=10*num+ch-'0';

	    k++;
		getchdo;

	} while (ch>='0'&& ch<='9');
	printf("\n数字是%d",num);//输出数字
	printf("\n");
	printf("\n");
	k--;
	
   }
   else
   {
	   if(ch==':')
	   {
		   getchdo;
		   if(ch=='=')
		   {
			   sym=becomes;
			  getchdo;
               
		   }
		   else
		   {
			   sym=nul;
            }
	   }
   else
   {
	   if(ch=='<')
	   {
		   getchdo;
		   if(ch=='=')
		   {
			   sym=leq;
			   getchdo;
		   }
		   else
		   {
			   sym=lss;
		   }
	   }
	   else
	   {
		   if(ch=='>')
		   {
			   getchdo;
			   if(ch=='=')
			   {
				   sym=geq;
				 
				   getchdo;
			   }
			   else
			   {
				   sym=gtr;
			   }
              
		   }
		   
		   else
			{
			 sym=ssym[ch];
			       if(sym!=period)
				   {
					   getchdo;
				   }
		   }
		  }
		}
	   }
	}
	return 0;
   }

int main()
{
    printf("input pl/0 file?");
	scanf("%s",fname);
	fin=fopen(fname,"r");
	if(fin)
	{
		//printf("list object code?(Y/N)");
		//scanf("%s",fname);
		//listswich=(fname[0]=='y'||fname[0]=='Y');
		//printf("list symbol table?(Y/N)");
		//scanf("%s",fname);
		//tableswitch=(fname[0]=='y'||fname[0]=='Y');
   
		fa1=fopen("fa1.tmp","w");
	    fprintf(fa1,"Input p1/0 file?");
		fprintf(fa1,"%s\n",fname);
		init();
	 	err=0;
		cc=cx=ll=0;
		ch=' ';
		while(-1!=getsym())
		{
			fa=fopen("fa.tmp","w");
			fas=fopen("fas.tmp","w");
			fclose(fa);
			fclose(fa1);
			fclose(fas);
		}
		fclose(fin);
	}
	else
	{
		printf("Can't open file!\n");
	}
	printf("\n");
	return 0;
}






⌨️ 快捷键说明

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