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

📄 词法.cpp

📁 词法分析程序
💻 CPP
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include"string.h"
int num=0;
char *coding[61]=
{
	    	  " ",     "and",      "array",   "begin",   "bool", "call",  
			  "case",  "char",     "constant","dim",     "do",   
			  "else",  "end",      "false",   "for",     "if",  
			  "input", "integer",  "not",     "of",      "or",	  
			  "output","procedure","program", "read",    "real", 
			  "repeat","set",      "stop",    "then",    "to",    
			  "true",  "until",    "var",     "while",   "write",
			  "标识符","整数",     "字符常数","(",       ")",   	
			  "*",     "*/",       "+",       ",",       "-", 
			  ".",     "..",       "/",       "/*",      ":",    
			  ":=",    ";",        "<",       "<=",      "<>",  
			  "=",     ">",        ">=",      "[",       "]"
};
struct Identify              //存放单词
{
	int index;
	char identify[30];
};
struct error                //存放错误
{
	int errn;
	int line1;
	char errword;
};
error errid[100];
int ch=0;                   //搜索指示器]
int line=0;
int ch3=0;
char ch2;                   //存放当前取得的字符
char array[200]="";         //存放一行字符
int wordn=0;                //结构数组下标
char word[20];              //存放构成单词符号的字符串
int errn=0;
int err[10];               //出错信息;
Identify wordID[100];       //符号表,存放标识符
void ReadChar()             //将下一个输入字读进ch2
{
		ch2=array[ch];
		ch++;
}
void IsBlack()
{
	while(ch2==' ')
	{	 
		ReadChar();
	}
}
void Concat()               //将ch中的字符链接到word后,搜索指示器前移一个字符
{
	word[ch3]=ch2;
	ch3++;
}
bool IsLetter()
{
	if(ch2>='a'&&ch2<='z'||ch2>='A'&&ch2<='Z')
		return(1);
	else 
		return(0);
}
bool IsDigit()
{
	if(ch2>='0'&&ch2<='9')
		return(1);
	else
		return(0);
}
int Reserve()
{
	
	for(int a=1;a<61;a++)
	{
		if(strcmp(word,coding[a])==0)
			return(a);
	}
	return(0);
}
int InsertId()
{
    strcpy(wordID[wordn].identify,word);
    wordID[wordn].index++;
	wordn++;
    return wordn;
}
void main()
{	
	int code;
	int ind=0;
	int value=0;
	int value2=0;
	int op=0;
	int i=0;
	int u=0;
	int compute=0;
	char filename[10];
	cout<<"......................................................................"<<endl;
    cout<<"                        计算机学院2002级2班                        "<<endl;
	cout<<"                        冯煦亮                                     "<<endl;
	cout<<"                        200245003020                               "<<endl;
	cout<<"......................................................................"<<endl;
	cout<<"请输入文件路径及文件名:";
	cin>>filename;
	ifstream file(filename,ios::in);
while(!file.eof())
	{
loop:
	line++;
    ch=0;
	ch3=0;
	file.getline(array,200);
	ReadChar();                  //预取一个字符
while(ch2!='\0')
	{	
	IsBlack();                   //判断是否为空格,是则调用readchar,直至ch2不为空格
	if(IsLetter())               //判断是否字母
	{
		while( IsLetter()||IsDigit() )	//保留字或标识符		
		{
			Concat();	                //把字符加入word
			ReadChar( );	            //读下一个字符
		}                   
			word[ch3]='\0';
			ch3=0;
			code=Reserve();      //判是否保留字
			if(code==0)          //是标识符
			{	
				for(int t=0;t<=wordn;t++)
				{
					if(strcmp(wordID[t].identify,word)==0)
					{						
						cout<<"("<<36<<","<<t+1<<")";
						op=1;
					    num++;
						if(num==5)
						{
							cout<<endl;
							num=0;
						}
					}		
				}
				if(op!=1)
				{
				wordn=InsertId();
				cout<<"("<<36<<","<<wordn<<")";num++;
						if(num==5)
						{
							cout<<endl;
							num=0;
						}
				}
			}
			else                  //是保留字
			{cout<<"("<<code<<","<<"-"<<")";
		                num++;
						if(num==5)
						{
							cout<<endl;
							num=0;
						}
			}		
	}
	else if(IsDigit())
	{
		while(IsDigit())
			{
				Concat();
				ReadChar();
			}
		    word[ch3]='\0';
			ch3=0;
			op=0;
				for(int t=0;t<=wordn;t++)
				{
					if(strcmp(wordID[t].identify,word)==0)
					{
						
						cout<<"("<<37<<","<<t+1<<")"; op=1;
						num++;
						if(num==5)
						{
							cout<<endl;
							num=0;
						}
					}				
				}
				if(op!=1)
				{
				wordn=InsertId();
	            cout<<"("<<37<<","<<wordn<<")";
				num++;
						if(num==5)
						{
							cout<<endl;
							num=0;
				}
				}	
	}
	else if(ch2=='\'')
	{
		u++;
		ReadChar( );
		while( IsLetter()||IsDigit() )	
		{
			Concat();	               
			ReadChar( );
		}
		word[ch3]='\0';
			ch3=0;
			op=0;
        if(ch2=='\'')
		{
			u++;
				for(int t=0;t<=wordn;t++)
				{
					if(strcmp(wordID[t].identify,word)==0)
					{
						cout<<"("<<38<<","<<t+1<<")"; 
						op=1;
						num++;
						if(num==5)
						{
							cout<<endl;
							num=0;
						}
					}					
				}
				if(op!=1)
				{
		         	wordn=InsertId();
		            cout<<"("<<38<<","<<wordn<<")";
					num++;
						if(num==5)
						{
							cout<<endl;
							num=0;
						}
				}		
		}
		else
			if(u==1)
			{errid[compute].line1=line;        //右边单引号
			errid[compute++].errn=2;}
		    	u=0;
				ReadChar( );
	}
else if(ch2=='(')
{
	cout<<"(39,-)";
	ReadChar( );
	num++;
    if(num==5)
	{
		cout<<endl;
		num=0;
}
}
else if(ch2==')')
{
	cout<<"(40,-)";
	ReadChar( );
	num++;
	if(num==5)
	{
		cout<<endl;
		num=0;
}
}
else if(ch2=='*')
{
	ReadChar();
	if(ch2=='/')
	{	
		cout<<"(42,-)";
		num++;
		if(num==5)
		{
			cout<<endl;
			num=0;
		}   
	}
    else
	{
		ch--;
        cout<<"(41,-)";
		num++;
     	if(num==5)
		{
			cout<<endl;
			num=0;
		}
		ReadChar( );
	}
}
else if(ch2=='+')
{
	cout<<"(43,-)";
	ReadChar( );
	num++;
	if(num==5)
	{
		cout<<endl;
		num=0;
}
}
else if(ch2==',')
{
	cout<<"(44,-)";
	ReadChar( );
	num++;
	if(num==5)
	{
		cout<<endl;
		num=0;
}
}
else if(ch2=='-')
{
	cout<<"(45,-)";
    ReadChar( );
	num++;
	if(num==5)
	{
		cout<<endl;
		num=0;
}
}
else if(ch2=='.')
{
	ReadChar();
	if(ch2=='.')
	{  
		cout<<"(47,-)";
		num++;
     	if(num==5)
		{
			cout<<endl;
			num=0;
		}
		ReadChar( );	   
	}
    else
	{
		cout<<"(46,-)";
		num++;
		if(num==5)
		{
			cout<<endl;
			num=0;
		}   
	}
}
else if(ch2=='/')
{
    ReadChar();
	if(ch2=='*')
	{ 
		ReadChar( );
		while(ch2!='*')
		ReadChar( );
		if(ch2=='*')
		{
			ReadChar( );
	     	if(ch2=='/')
			   ReadChar( );
	      	else 
			{
				errid[compute].errn=1;                  //右边届符
		    	errid[compute++].line1=line;
				goto loop;
			}
		}
		else
		{
			cout<<"(49,-)";
			num++;
			if(num==5)
			{
				cout<<endl;
				num=0;
			}
			ReadChar( );
		}  
	}
    else
	{
		cout<<"(48,-)";
     	num++;
       	if(num==5)
		{
    		cout<<endl;
    		num=0;
		}
	}
    	ReadChar( );	
}
else if(ch2==':')
{
	ReadChar();
	if(ch2=='=')
	{
		cout<<"(51,-)";
		num++;
    	if(num==5)
		{
			cout<<endl;
			num=0;
		}
		ReadChar( );
	}
    else
	{
		ch--;
        cout<<"(50,-)";
		num++;
		if(num==5)
		{
			cout<<endl;
			num=0;
		}
		ReadChar( );
	}
}
else if(ch2==';')
{
	cout<<"(52,-)";
	ReadChar( );
	num++;
	if(num==5)
	{
		cout<<endl;
		num=0;
}
}
else if(ch2=='<')
{
    ReadChar();
	if(ch2=='=')
	{
		cout<<"(54,-)";
		num++;
		if(num==5)
		{
			cout<<endl;
			num=0;
		}
		ReadChar( );
	}
    else 
	if(ch2=='>')
	{
        cout<<"(55,-)";
		num++;
		if(num==5)
		{
			cout<<endl;
			num=0;
		}
		ReadChar( );	
	}
	else
	{
		ch--;
    	cout<<"(53,-)";
		num++;
		if(num==5)
		{
			cout<<endl;
			num=0;
		}
		ReadChar( );
   }
}
else if(ch2=='>')
{
	ReadChar();
	if(ch2=='=')
	{
		cout<<"(58,-)";
		num++;
		if(num==5)
		{
			cout<<endl;
			num=0;
		}
		ReadChar( );	
	}
    else
	{
		ch--;
		cout<<"(57,-)";
		num++;
		if(num==5)
		{
			cout<<endl;
			num=0;
		}
		ReadChar( );	
	}
}
else if(ch2=='=')
{
	cout<<"(56,-)";
	ReadChar( );
	num++;
	if(num==5)
	{
		cout<<endl;
		num=0;
}
}
else if(ch2=='[')
{
	cout<<"(59,-)";
	ReadChar( );
	num++;
	if(num==5)
	{
		cout<<endl;
		num=0;
}
}
else if(ch2==']')
{
	cout<<"(60,-)";
	ReadChar( );
	num++;
	if(num==5)
	{
		cout<<endl;
		num=0;
	}
}
else 
{
	errid[compute].errword=ch2;         //非法字符
    errid[compute].errn=3;
	errid[compute].line1=line;
	compute++;
	ReadChar( );
}
}
}
for(int y=0;y<compute;y++)
{
	if(errid[y].errn==1)
	cout<<"第"<<errid[y].line1<<"行注释部分缺右边的界符*/"<<endl;
	if(errid[y].errn==2)
		cout<<"第"<<errid[y].line1<<"行字符常数缺右边的单引号'"<<endl;
	if(errid[y].errn==3)
	{	cout<<"第"<<errid[y].line1<<"行出现非法字符";
	cout<<errid[y].errword<<endl;
	}
}
}



⌨️ 快捷键说明

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