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

📄 1.cpp

📁 实现了编译原理词法分析的部分
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"pl0.h"


void init ()
{
	int i;
	for (i=0; i<=20; i++)
	{
		ssym[i] = " ";
	}
		ssym[0] = "plus";
		ssym[1] = "minus";
		ssym[2] = "times";
		ssym[3] = "slash";
		ssym[4] = "lparen";
		ssym[5] = "rparen";
		ssym[6] = "eql";
		ssym[7] = "comma";
		ssym[8] = "period";
		ssym[9] = "neq";
		ssym[10] = "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]), "odd");
		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;

		wsym1[0]="beginsym";
		wsym1[1]="callsym";
		wsym1[2]="constsym";
		wsym1[3]="dosym";
		wsym1[4]="endsym";
		wsym1[5]="ifsym";
		wsym1[6]="oddsym";
		wsym1[7]="procsym";
		wsym1[8]="readsym";
		wsym1[9]="thensym";
		wsym1[10]="varsym";
		wsym1[11]="whilesym";
		wsym1[12]="writesym";
}
void error(int n)
{	
	space[cc]=0;
	printf("****%s!error%d\n",space,n);
	fprintf(fa1,"****%s!error%d\n",space,n);
	err++;
	cspace=0;
	memset(space,32,81);
}
void  getch()
{
	if(cc==ll)
	{
 		if(feof(fin))
		{
			printf("Program incomplete!");
			return;
		}
		ll=0;
		cc=0;
		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;
}

void getsym()
{
	int i,j,k;
	while(ch==' '||ch==10||ch==9) 
		getch();
	if (ch>='a'&&ch<='z')               
	{
		k=0;
		do
		{
	     if (k<AL)             
		 {
			a[k]=ch;
			k++;
		 }
			getch();
		}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;
			else if (strcmp(id,word[k])>0)
				i=k+1;
			else if (strcmp(id,word[k])==0)
				break;
		}while (i<=j);
		if (i<=j)
		{
			sym=wsym[k];
			sym1=wsym1[k];
			fprintf(fa1,"%4s\t%5s\n",id,sym1); 
		}
		else
		{
			sym=ident;
			sym1="ident";
			fprintf(fa1,"%4s\t%5s\n",id,sym1);
		}
	}
	else if (ch>='0'&&ch<='9')
	{
		k=0;
		num=0;
		sym=number;
		do
		{  
			space[cspace]=ch;
			cspace++;
			num=10*num+ch-'0';
			k=k++;
			getch();
		if(ch!=10&&(ch>='a'&&ch<='z'))
			{			    	
				do{
                   space[cspace]=ch;
				   cspace++;
					getch();
				}while(ch!=10&&(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));	
				error(5);
				return;
			}
		}while(ch!=10&&(ch>='0'&&ch<='9')||(ch>='a'&&ch<='z'));
		k--;
		if(k<=NMAX)
		{
		sym1="number";
		fprintf(fa1,"%13s\t%2d\t\n",sym1,num);
		}
		if(k>NMAX)     
		{
		    error(30);
		}
	}
	else if (ch==':')             
	{
		char b=ch;
		getch();
		if (ch=='=')
		{
			sym=becomes;
			sym1="becomes";
			fprintf(fa1,"%4c%c\t%5s\t\n",b,ch,sym1);
			getch();
		}
		else 
		{
		sym=nul;
		sym1="nul";
		fprintf(fa1,"%4c\t%5s\t\n",b,sym1);
		}
	}
	else if (ch=='<')             
	{
		char c=ch;
		getch();
		if (ch=='=')
		{
			sym=leq;
			sym1="leq";
			fprintf(fa1,"%4c%c\t%5s\t\n",c,ch,sym1);
			getch();
		}
		else
		{
			sym=lss;
		sym1="lss";
		fprintf(fa1,"%4c\t%5s\t\n",c,sym1);
		}
	}
	else if (ch=='>')
	{
		char d=ch;
		getch();
		if (ch=='=')
		{
		    sym=geq;
			sym1="geq";
			fprintf(fa1,"%4c%c\t%5s\t\n",d,ch,sym1);
			getch();
		}
		else
		{
			sym=gtr;
			sym1="gtr";
			fprintf(fa1,"%4c\t%5s\t\n",d,sym1);
		}

	}
	else
	{
		if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='='||ch==','||ch=='.'||ch=='#'||ch==';')
		{
			ss=ch;
		switch(ss)
		{
		  case '+':
            s=0;break;
          case '-':
           	s=1;break;
          case '*':
           	s=2;break;
          case '/':
	        s=3;break;
          case '(':
        	s=4;break;
          case ')':
         	s=5;break;
          case '=':
          	s=6;break;
          case ',':
	        s=7;break;
          case '.':
	        s=8;break;
          case '#':
         	s=9;break;
          case ';':
	        s=10;break;
		}
		sym1=ssym[s];
		fprintf(fa1,"%3c\t%5s\t\n",ch,sym1);
		}
		getch();
	}
}

void main()
{
	memset(space,32,81); 
	init ();
	printf("请输入文件名:");
	scanf("%s",filename);
	fin=fopen(filename,"r");
	if(fin)
	{
		fa1=fopen("fa1.txt","w");
		err=0;
		cc=ll=0;
		ch=9;
		while(!feof(fin))
		{
			getsym();
		}
		fclose(fa1);
		fclose(fin);
	}
	else
		printf("不能打开文件!\n");
}


⌨️ 快捷键说明

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