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

📄 编译原理.txt

📁 本文是关于编绎原理中词法分析的重要内容,严格实验所以要求.
💻 TXT
字号:
/**********************SIMPLE语言词法分析******************************/


#include<iostream.h>
#include<string.h>
#include <stdio.h>
char word[60][20];

/*设置保留字名字*/
void init()
{
	strcpy(&(word[1][0]),"and");
	strcpy(&(word[2][0]),"array");
	strcpy(&(word[3][0]),"begin");
	strcpy(&(word[4][0]),"bool");
	strcpy(&(word[5][0]),"call");
	strcpy(&(word[6][0]),"case");	
	strcpy(&(word[7][0]),"char");
	strcpy(&(word[8][0]),"constant");
	strcpy(&(word[9][0]),"dim");
	strcpy(&(word[10][0]),"do");
	strcpy(&(word[11][0]),"else");
	strcpy(&(word[12][0]),"end");
	strcpy(&(word[13][0]),"false");
	strcpy(&(word[14][0]),"for");
	strcpy(&(word[15][0]),"if");
	strcpy(&(word[16][0]),"input");	
	strcpy(&(word[17][0]),"integer");
	strcpy(&(word[18][0]),"not");
	strcpy(&(word[19][0]),"of");
	strcpy(&(word[20][0]),"or");
	strcpy(&(word[21][0]),"output");
	strcpy(&(word[22][0]),"procedure");
	strcpy(&(word[23][0]),"program");
	strcpy(&(word[24][0]),"read");
	strcpy(&(word[25][0]),"real");
	strcpy(&(word[26][0]),"repeat");	
	strcpy(&(word[27][0]),"set");
	strcpy(&(word[28][0]),"stop");
	strcpy(&(word[29][0]),"then");
	strcpy(&(word[30][0]),"to");
	strcpy(&(word[31][0]),"true");
	strcpy(&(word[32][0]),"until");
	strcpy(&(word[33][0]),"var");
	strcpy(&(word[34][0]),"while");
	strcpy(&(word[35][0]),"write");
	strcpy(&(word[36][0]),"标识符");	
	strcpy(&(word[37][0]),"整数");
	strcpy(&(word[38][0]),"字符常数");
	strcpy(&(word[39][0]),"(");
	strcpy(&(word[40][0]),")");
	strcpy(&(word[41][0]),"*");
	strcpy(&(word[42][0]),"*/");
	strcpy(&(word[43][0]),"+");
	strcpy(&(word[44][0]),",");
	strcpy(&(word[45][0]),"-");
	strcpy(&(word[46][0]),".");	
	strcpy(&(word[47][0]),"..");
	strcpy(&(word[48][0]),"/");
	strcpy(&(word[49][0]),"/*");
	strcpy(&(word[50][0]),":");
	strcpy(&(word[51][0]),":=");
	strcpy(&(word[52][0]),";");
	strcpy(&(word[53][0]),"<");
	strcpy(&(word[54][0]),"<=");
	strcpy(&(word[55][0]),"<>");
	strcpy(&(word[56][0]),"=");	
	strcpy(&(word[57][0]),">");
	strcpy(&(word[58][0]),">=");
	strcpy(&(word[59][0]),"[");
	strcpy(&(word[60][0]),"]");
}

/*判断ch是否为数字*/
int IsDigit(char ch)
{
	if((ch>='0')&&(ch<='9'))return 1;
	else return 0;
}

/*判断ch是否为字母*/
int IsAlpha(char ch)
{
	if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))return 1;
	else return 0;
}

/*查表*/
int  Find(char *A,char B[60][20])
{
	for(int i=1; i<=60; i++)
	{
	
	
		if(!strcmp(A,B[i]))
		{
			return i ;
		}
	}
	return 0;
}



/*词法分析*/
void getsym(FILE *fin)
{
	init();
	char a[100][20];
	char A[20];
	int m=5;
	int n=1;
	int k=1;
	int i=0;
	int j=0;
	int p=0;
	char ch=' ';
	while(1)
	{
		if(feof(fin))break;
		if( ch==' '|| ch =='\t'||ch=='\n'){fscanf(fin,"%c",&ch);}
		else if( IsDigit(ch))
		{
			while(IsDigit(ch))
			{
				 
				A[j] = ch;
				j++;
				fscanf(fin,"%c",&ch);
				
			}
			A[j]='\0';
			if(!Find(A,a))
			{
				cout<<"(37,"<<k++<<")"<<'\t';
				m--;
			    if(m==0){cout<<'\n';m=5;}
				strcpy(a[n++],A);
			}
			else
			{
				cout<<"(37,"<<Find(A,a)<<")"<<'\t';
				m--;
			    if(m==0){cout<<'\n';m=5;}
			}

			
			j=0;
			
		}
		else if(IsAlpha(ch))//是字母开头的
		{
		
			while(IsAlpha(ch) || IsDigit(ch))
			{
				A[i] =ch;
				i++;
				fscanf(fin,"%c",&ch);
				
			}
			A[i]='\0';
		
            if(Find(A,word))       //查表
			{
				cout<<"("<<Find(A,word)<<",-)"<<'\t';
				m--;
				if(m==0){cout<<'\n';m=5;}
			}
		    else
			{
				if(!Find(A,a))
				{
					cout<<"(36,"<<k++<<")"<<'\t';
					m--;
					if(m==0){cout<<'\n';m=5;}
					strcpy(a[n++],A);
				}
				else
				{
					cout<<"(36,"<<Find(A,a)<<")"<<'\t';
					m--;
					if(m==0){cout<<'\n';m=5;}
				}

			  
			}
			i=0;
		}
		//以下为字符常数

		else if(ch=='\'')
		{
			fscanf(fin,"%c",&ch);
			while(ch!='\'')
			{
				if(ch=='\n'){cout<<"字符常数缺右边的单引号(字符常数要求左、右边用单引号界定,不能跨行);";return;}
				A[p] = ch;
				p++;
				fscanf(fin,"%c",&ch);
			}
			A[p]='\0';
			if(!Find(A,a))
			{
				cout<<"(38,"<<k++<<")"<<'\t';
				fscanf(fin,"%c",&ch);
				m--;
			    if(m==0){cout<<'\n';m=5;}
				strcpy(a[n++],A);
				
			}
			else
			{
				cout<<"(38,"<<Find(A,a)<<")"<<'\t';
				fscanf(fin,"%c",&ch);
				m--;
			    if(m==0){cout<<'\n';m=5;}
			}
			p=0;
		}

	
		//以下为2字节的运算符号
		

		else if( ch=='/')
		{
			fscanf(fin,"%c",&ch);
		    if(ch!='*') {cout<<"(48,-)"<<'\t';m--;if(m==0){cout<<'\n';m=5;}}
			if(ch=='*') 
			{
				do
				{
					fscanf(fin,"%c",&ch);
					if(ch=='\n'){cout<<"注释部分缺右边的界符*/(注释要求左右边分别用/*和*/界定,不能跨行)。";return;}
				}
				while(ch!='/');
				fscanf(fin,"%c",&ch);
			}

		}

		else if( ch=='.')
		{
			fscanf(fin,"%c",&ch);
			if(ch!='.') {cout<<"(46,-)"<<'\t';m--;if(m==0){cout<<'\n';m=5;}}
			if(ch=='.') 
			{
				cout<<"(47,-)"<<'\t';
				fscanf(fin,"%c",&ch);
				m--;
			    if(m==0){cout<<'\n';m=5;}
			}

		}

		else if( ch==':')
		{
			fscanf(fin,"%c",&ch);
			if(ch!='='){cout<<"(50,-)"<<'\t';m--;if(m==0){cout<<'\n';m=5;}}

			if(ch=='=') 
			{
				cout<<"(51,-)"<<'\t';
				fscanf(fin,"%c",&ch);
				m--;
			    if(m==0){cout<<'\n';m=5;}
			}


	
		}

		else if( ch=='<')
		{
			fscanf(fin,"%c",&ch);
			if(ch!='='&&ch!='>') {cout<<"(53,-)"<<'\t';m--;if(m==0){cout<<'\n';m=5;}}
			if(ch=='=') 
			{
				cout<<"(54,-)"<<'\t';
				fscanf(fin,"%c",&ch);
				m--;
			    if(m==0){cout<<'\n';m=5;}
			}
			if(ch=='>')
			{
				cout<<"(55,-)"<<'\t';
				fscanf(fin,"%c",&ch);
				m--;
			    if(m==0){cout<<'\n';m=5;}
			}

			
		}

		else if( ch=='>')
		{
			fscanf(fin,"%c",&ch);
			if(ch!='=') {cout<<"(57,-)"<<'\t';m--;if(m==0){cout<<'\n';m=5;}}
			if(ch=='=') 
			{
				cout<<"(58,-)"<<'\t';
				fscanf(fin,"%c",&ch);
				m--;
			    if(m==0){cout<<'\n';m=5;}
			}
			
		}
	
        //以下为一个字节的运算符号 
			else if(ch=='(') {cout<<"(39,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}
			else if(ch==')') {cout<<"(40,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}
			else if(ch=='*') {cout<<"(41,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}  
		    else if(ch=='+') {cout<<"(43,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}
		    else if(ch==',') {cout<<"(44,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}
		    else if(ch=='-') {cout<<"(45,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}
		    else if(ch==';') {cout<<"(52,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}
		    else if(ch=='=') {cout<<"(56,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}
		    else if(ch=='[') {cout<<"(59,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}
		    else if(ch==']') {cout<<"(60,-)"<<'\t';fscanf(fin,"%c",&ch);m--;if(m==0){cout<<'\n';m=5;}continue;}  
	
		else
		{
			cout<<"非法字符,即不是SAMPLE字符集的符号";
			fscanf(fin,"%c",&ch);
		}
	}
}

void main()
{
	cout<<"作者   05计算机联合班   薛江   200530612154"<<endl;
	cout<<"请输入要测试的程序:";
	char filename[10];
	cin>>filename;
	FILE* fin = fopen(filename,"r");
	getsym(fin);
	cout<<endl;
	fclose(fin);
}

⌨️ 快捷键说明

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