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

📄 lyy036.cpp

📁 只学过C++语言,对C语言不是很了解,所以在用到C语言里面的知识时有点不知所以然,只能向别的同学请教,他们都耐心的给我详细的解释,以此同时,我发现C语言里面一些函数的奥妙,也发现了自己的不足.也认识到
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////////////////////

/*.........................编译原理课程设计........................*/
/*                            (词法分析器)                           */


#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define   Max 100



///////////////////////////////////////////////////////////////////////
/*..............本程序所要用到的函数说明(开始).......................*/
void Openlyy();                   /*    打开文件                     */
void Change();                    /*    状态转换                     */
void Getchar(char  *p);           /*    输入字符                     */
int  Isletter(char ch);           /*    判断是否为字母               */           
int  Isdigit(char ch);            /*    判断是否为数字               */
void Concat(char *p);             /*    将字符连接到Lyy之后          */
bool Checkn();                    /*    判断是否为关键字             */
void Display();                   /*    结果显示在Dos界面上          */
void Error();                     /*    出错处理                     */
/*..............本程序所要用到的函数头说明(结束).....................*/
///////////////////////////////////////////////////////////////////////

                                

//////////////////////////////////         
struct Liyingyun                //
{                               //
	char   Char[100];           //
}Lyy;                           //
//////////////////////////////////



FILE *f1;               /*.......读入文件........*/                                         
int Pcount;             /*...种别编码的识别编号....*/         

/*............关键字库.............*/                             
char keyword[][20]={"begin", "end",	"while","if", "then", "else", "integer","var", "do","add",
                	"sub", "div", "mod", "real","int", "char", "float", "Boolean", "void", 
					"const", "of", "file", "goto", "type",	"with",	"true",	"false", "array",
                    "eof",	"put", "input",	"output", "and", "or","not","procedure",
					"function",	"program"};				





/*..........主函数................*/
void main()
{
	           

	cout<<"               !!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!"<<endl;
	cout<<"                          你已进入李应运词法分析器 !"<<endl;
    cout<<"               !!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!!\n"<<endl;
	cout<<"对此词法分析器的几点说明: 1,结果写在Dos上. "<<endl; 
	cout<<"	                  2,种别编码如下:( 关键字  keyword )"<<endl;
	cout<<"                                         ( 标识符      1   )"<<endl;
	cout<<"                                         ( 符号        2   )"<<endl;
	cout<<"                                         ( 数组        3   )"<<endl;
	cout<<"                                         ( 整形数      4   )"<<endl;
	cout<<"                                         ( 浮点型数    5   )"<<endl;
	cout<<"                                         ( 错误输出    -   )"<<endl;
	cout<<"\n 请输入你的Pascal语言程序的路径:"<<endl;

	Openlyy();          /*............要编译的Pascal文件............*/
	Change();           /*...........调用状态转换..........*/

/*.....已分析完毕.......*/
	printf("\n\n~~~~~~~你输入的Pascal语言程序已经分析完!~~~~~~~~\n");
	printf("***************感觉还可以吧?*********************\n");
	printf(" ^^^^^^^^^^^^^^^^^^^^^欢迎再次使用^^^^^^^^^^^^^^!\n");
}
/////////////////////////////////////////////////////////////////////////////////////////


/*......结果写在Dos上..........*/

	
/////////////////////////////////////////////////////////////////////////////////////////////
void Openlyy()                        
{
	
	char Myfile[Max];  
	
	/*..........文件的路径..............*/
	cin>>Myfile;
	cout<<"\n"<<endl;

    /* .......... 装入要编译的Pascal语言程序.............*/
    if((f1 = fopen (Myfile, "r")) == NULL)
	{
		cout<<"你输入的路径不对!"<<endl;
		exit(1);
	}
}
/////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////////////////////
/*.......将下一个字符读到ch中,搜索指示器前移一字符位置.........*/
void Getchar(char *p)
{ 
	*p=fgetc(f1);

}
/////////////////////////////////////////////////////////////////////////////////////////////


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


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


/////////////////////////////////////////////////////////////////////////////////////////////
/*...将字符连接到Lyy之后...*/
void Concat(char *p)
{
	char ch[2];
	ch[0]=*p;
	ch[1]='\0';
	strcat(Lyy.Char,ch);
}
/////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////////////////////
/*............判断是否为关键字............*/
bool Checkn() //判别是否为关键字
{
	for(int i=0;i<22;i++)
		if(!strcmp(Lyy.Char,keyword[i]))
			return true;
		return false;
}
/////////////////////////////////////////////////////////////////////////////////////////////





/////////////////////////////////////////////////////////////////////////////////////////////
/*.........结果显示在Dos界面上....................*/
void Display()
{
	if(Pcount == 1)
	{
		if(Checkn())
			cout<<"<"<<Lyy.Char<<",keyword>"<<endl;
		else cout<<"<"<<Lyy.Char<<","<<Pcount<<">"<<endl;
	}
	else cout<<"<"<<Lyy.Char<<","<<Pcount<<">"<<endl;
	strcpy(Lyy.Char,"");
}
/////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////////////////////
/*..........出错处理........*/
void Error()
{
	cout<<"<Your program is Error,->"<<endl;
	strcpy(Lyy.Char,"");
}
/////////////////////////////////////////////////////////////////////////////////////////////




/////////////////////////////////////////////////////////////////////////////////////////
void Change()
{
    char ch;
	Getchar(&ch);
	while (ch != EOF)                    
	{
/*.........若为"+",进入终态.......*/
		if(ch == '+')
		{
			Concat(&ch);
			Pcount= 2;
			Display();          
			Getchar(&ch);
		}

/*.........若为"-",进入终态.......*/
		else if(ch == '-')
		{
			Concat(&ch);
			Pcount= 2;
			Display();           
			Getchar(&ch);
		}

/*.........若为"*",进入终态.......*/
		else if(ch == '*')
		{
			Concat(&ch);
			Pcount= 2;
			Display();          
			Getchar(&ch);
		}

/*.........若为"/",进入终态.......*/
		else if(ch == '/')
		{
			Concat(&ch);
			Pcount= 2;
			Display();           
			Getchar(&ch);
		}

/*.........若为">",进入终态.......*/
		else if(ch == '>')
		{
			Concat(&ch);
			Getchar(&ch);

			if(ch == '=')
			{
				Concat(&ch);
				Pcount = 2;
				Display();          
			    Getchar(&ch);
			}
			else
			{
				Pcount = 2;
				Display();          
			}
		}

/*.........若为"<",进入终态.......*/
		else if(ch == '<')
		{
			Concat(&ch);
			Getchar(&ch);

			if(ch == '>')
			{
				Concat(&ch);
				Pcount = 2;
				Display();          
			    Getchar(&ch);
			}
			else if(ch == '=')
			{
				Concat(&ch);
				Pcount = 2;
				Display();          
			    Getchar(&ch);
			}
			else 
			{
				Pcount = 2;
				Display();          
			}
		}


/*.........若为"=",进入终态.......*/
		else if(ch == '=')
		{
			Concat(&ch);
			Pcount = 2;
            Display();         
			Getchar(&ch);
		}

	
/*.........若为"(",进入终态.......*/
		else if(ch == '(')
		{
			Concat(&ch);
			Pcount= 2;
			Display();           
			Getchar(&ch);
		}

		
/*.........若为")",进入终态.......*/
		else if(ch == ')')
		{
			Concat(&ch);
			Pcount= 2;
			Display();           
		    Getchar(&ch);
		}


/*.........若为":=",进入终态.......*/
		else if(ch == ':')
		{
			Concat(&ch);
			Getchar(&ch);

			if(ch == '=')
			{
			    Concat(&ch);
			    Pcount= 2;
			    Display();       
			    Getchar(&ch);
			}
			else
			{
				Pcount= 2;
			    Display();      
			}
		}

/*.........若为",",进入终态.......*/
        else if(ch == ',')
		{
			Concat(&ch);
			Pcount= 2;
			Display();           
			Getchar(&ch);
		}

/*.........若为";",进入终态.......*/
		else if(ch == ';')
		{
			Concat(&ch);
			Pcount= 2;
			Display();           
			Getchar(&ch);
		}

/*.........若为字母,接着判断.......*/		
		else if(Isletter(ch))
		{
			Concat(&ch);
			Getchar(&ch);

			while(Isletter(ch) || Isdigit(ch))
			{
				Concat(&ch);
			    Getchar(&ch);
			}
			
/*...........判断数组...............*/
 			if(ch == '[')
			{
				Concat(&ch);
				Getchar(&ch);

				if(Isletter(ch) || Isdigit(ch))
				{
						while(Isletter(ch) || Isdigit(ch))
						{
					         Concat(&ch);
					         Getchar(&ch);
						}

				        if(ch == ']')
						{
					             Concat(&ch);
								 Pcount= 3;
					             Display();           
					             Getchar(&ch);
						}

			            else Error();
                }

				else Error();
			}

/*.........判断名字.....*/
			else
			{
				Pcount= 1;
			    Display();            
			}

		}

/*.........若为数字,接着判断.......*/
		else if(Isdigit(ch))
		{
			Concat(&ch);
			Getchar(&ch);
			
			while(Isdigit(ch))
			{
				Concat(&ch);
			    Getchar(&ch);
			}

    /*..........判断整数..........*/
			if(ch == 'E')
			{
				Concat(&ch);
				Getchar(&ch);

				if(ch == '+' || ch == '-')
				{
					Concat(&ch);
				    Getchar(&ch);

				    if(Isdigit(ch))
					{
					    while(Isdigit(ch))
						{
					        Concat(&ch);
				            Getchar(&ch);
						}
						Pcount= 4;
                        Display();       
					}
					else Error();
				}
		
			    else Error();
			}
	
	
		
/*............判断小数.......*/
			else if(ch == '.')
			{
			    Concat(&ch);
				Getchar(&ch);

				if(Isdigit(ch))
				{
					while(Isdigit(ch))
					{
						Concat(&ch);
				        Getchar(&ch);
					}
					if(ch == 'E')
					{
					     Concat(&ch);
					     Getchar(&ch);
					     if(ch == '+' || ch == '-')
						 {
						      Concat(&ch);
				              Getchar(&ch);

				              if(Isdigit(ch))
							  {
					               while(Isdigit(ch))
								   {
					                     Concat(&ch);
				                         Getchar(&ch);
								   }
								   Pcount= 5;
                                   Display();  
							  }
					          else Error();					
						 }
					}
					else if(ch==' ')
					{
						Pcount= 5;
						Display();
						Getchar(&ch);
					}
					else 
					{
						Pcount= 5;
					    Display();
					}
				}
				else Error();
			}
			else 
			{
				Pcount= 4;
			    Display();
			}
		}
/*.........跳过空格和回车.........*/
		else if(ch == ' '||ch =='\n')
		{
			Getchar(&ch);
		}

	
/*......其它...............*/
		else 
		{
			Error();
			Getchar(&ch);
		}	
    }
}

/////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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