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

📄 scanner.cpp

📁 snl语言的语法分析 (递归下降法)词法分析
💻 CPP
字号:
#include"Scanner.h"

#include<fstream>

#include"stdio.h"



string Reservations[21]=
{
	"program","type","var","procedure","begin",
	"end","array","of","record","if","then",
	"else","fi","while","do","endwh","read",
	"write","return","integer","char"
};

scanner::scanner()
{
	
	i_Row=1;     
	i_SmBr=0;     
	i_MiBr=0;     

	i_BiBr=0;
	i_SgQu=0;


	i_Isfirst=0;   
	

	i_IsRight=0;
}

scanner::~scanner()
{
	Token * T_tem=T_first;
	while(T_first!=T_last)
	{
		T_tem=T_first;
		T_first=T_first->T_next;
		delete T_tem;
		
	}
}

Token* scanner::GetToken()
{
	return T_first;
}
void scanner::AddNewToken(int r,string str1,string str2)
{
	
	if(i_Isfirst==0)
	{
		
		T_first=new Token;
		T_first->i_row=r;
		T_first->str_wom=str1;
		T_first->str_grm=str2;
		T_first->T_next=NULL;
		T_last=&(*T_first);
		i_Isfirst++;
	}
	else
	{
		T_last->T_next=new Token;
		T_last->T_next->i_row=r;
		T_last->T_next->str_wom=str1;
		T_last->T_next->str_grm=str2;
		T_last->T_next->T_next=NULL;
		T_last=T_last->T_next;
		i_Isfirst++;
	}

}

int scanner::IsLetter(char a)
{
	if(int(a)>=65&&int(a)<=90||int(a)>=97&&int(a)<=122)
		return 1;
	else return 0;
}

int scanner::IsNum(char a)
{
	if(int(a)>=48&&int(a)<=57)
		return 1;
	else return 0;
}

int scanner::Mscan()
{
	FILE *Input=fopen("test.txt","r");

	if(Input==NULL)
		cout<<"fopen is down!"<<endl;
	else
	{
		char ch;
		ch=fgetc(Input);
		while(ch!=EOF)
		{
			
			if(IsLetter(ch)==1)
			{
				
				string str_Temp;
				
				str_Temp+=ch;
				ch=fgetc(Input);
 				while(IsLetter(ch)==1||IsNum(ch)==1)
				{	
					str_Temp+=ch;
					ch=fgetc(Input);
				}
				int i_IsRe=0;     
				for(int i=0;i<=20;i++)
				{
					if(str_Temp==Reservations[i])
					{
						i_IsRe=1;
						AddNewToken(i_Row,str_Temp,"");
						
					}
				}
				if(i_IsRe==0)
				{
					AddNewToken(i_Row,"ID",str_Temp);
				
				}
			}

			
			else if(IsNum(ch)==1)
			{
				char c_Temp[32];
				int i_Temp=1;
				string str_Te;
				str_Te+=ch;
				c_Temp[0]=ch;
				ch=fgetc(Input);
				
				while(IsNum(ch)==1)
				{	
					str_Te+=ch;
					c_Temp[i_Temp]=ch;
					i_Temp++;
					ch=fgetc(Input);
				}
				
				if(IsLetter(ch)==1)
					cout<<i_Row<<'\t'<<"error!"<<endl;
				else 
				{
					AddNewToken(i_Row,"integer",str_Te);
					
				}
			}
			
			else if(ch==':')
			{
				ch=fgetc(Input);
				if(ch=='=')
				{
					AddNewToken(i_Row,":=","");
					
					ch=fgetc(Input);
				}
				else
				{
					i_IsRight++;
					cout<<i_Row<<'\t'<<"error,missng = !"<<endl;
				}
				
			}

			
			else if(ch==';'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='<'||ch=='='||ch==',')
			{
				char c_Temp=ch;
				string str_t;
				str_t+=ch;
				AddNewToken(i_Row,str_t,"");
				
				ch=fgetc(Input);
				if(ch==';'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='<'||ch=='='||ch==',')
				{
					i_IsRight++;
					cout<<i_Row<<'\t'<<"missing a Number or a char at the back of"<<endl;
				}

			}

			
			else if(ch=='('||ch==')'||ch=='['||ch==']'||ch=='{'||ch=='}'||ch=='\'')     //39是'的ASCII码
			{
				switch (ch)
				{
				case '(':
					i_SmBr++;
					AddNewToken(i_Row,"(","");
					
					break;
				case ')':
					i_SmBr--;
					AddNewToken(i_Row,")","");
					
					break;
				case '[':
					i_MiBr++;
					AddNewToken(i_Row,"[","");
					
					break;
				case ']':
					i_MiBr--;
					AddNewToken(i_Row,"]","");
					
					break;
				case '{':
					i_BiBr++;
				
					ch=fgetc(Input);
					while(ch!='}'&&ch!=EOF||ch=='\n')
					{
						if(ch=='\n')
							i_Row++;
						ch=fgetc(Input);
					}
				
					break;
				case '}':
					i_BiBr--;
					
					break;
				default:break;
				}
				if((int)ch==39)
					i_SgQu++;
				ch=fgetc(Input);
			}

		
			else if(ch=='.')
			{
				ch=fgetc(Input);
				if(ch=='.')
				{
					AddNewToken(i_Row,"..","");
				
					ch=fgetc(Input);
				}
				else
				{
					AddNewToken(i_Row,".","");
					
				}
			}

			
			else if(ch=='\n')
			{
				ch=fgetc(Input);
				
				if(i_SmBr<0)
				{
					i_IsRight++;
					cout<<i_Row<<'\t'<<"error,missing a '('."<<endl;
				}
				else if(i_SmBr>0)
				{
					i_IsRight++;
					cout<<i_Row<<'\t'<<"error,missing a ')'."<<endl;
				}
				if(i_MiBr<0)
				{
					i_IsRight++;
					cout<<i_Row<<'\t'<<"error,missing a '['."<<endl;
				}
				else if(i_MiBr>0)
				{
					i_IsRight++;
					cout<<i_Row<<'\t'<<"error,missing a ']'."<<endl;
				}
				if(i_SgQu%2!=0)
				{
					i_IsRight++;
					cout<<i_Row<<'\t'<<"error,missing a ' ."<<endl;
				}

				
				i_SmBr=0;     
				i_MiBr=0;     
				i_BiBr=0;
				i_SgQu=0;

				i_Row++;
			}

			
			else if(ch==' '||ch=='\t')
				ch=fgetc(Input);
			
			else
			{
				i_IsRight++;
				cout<<i_Row<<'\t'<<"Illegal character!"<<endl;
				ch=fgetc(Input);
			}
		}
		if(i_BiBr<0)
		{
			i_IsRight++;
			cout<<i_Row<<'\t'<<"error,missing "<<i_BiBr<<"'{'."<<endl;
		}
		else if(i_BiBr>0)
		{
			i_IsRight++;
			cout<<i_Row<<'\t'<<"error,missing "<<i_BiBr<<" '}'."<<endl;
		}
		
		AddNewToken(i_Row,"EOF","");
		
	}
	fclose(Input);
	
	return 1;
}
void scanner::scanner_out()
{
	Token * T_temp=T_first;

	while(T_temp!=T_last)
	{
		cout<<T_temp->i_row<<'\t'<<T_temp->str_wom<<'\t'<<T_temp->str_grm<<endl;
		T_temp=T_temp->T_next;
	}
	cout<<T_temp->i_row<<'\t'<<T_temp->str_wom<<'\t'<<T_temp->str_grm<<endl;
}

⌨️ 快捷键说明

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