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

📄 45663.cpp

📁 语法分析
💻 CPP
字号:
#include<iostream.h>

#include<string.h>
void factor();
void lrparser();
void yucu();
void statement();
void expression();
void scaner(); 
void term();
int IsLetter(char );
int IsDigit(char );
char prog[80],token[8];
char ch;
int syn,p,n,m,sum,kk=0;
char *rwtab[6]={"begin","if","then","while","do","end"};                                                                                                                                                                                                                                                                       

void main()
{
	p=0;
	int i=0;
	cout<<"please input string:"<<endl;
	 cin.get(prog,80);
    
	p=0;
    scaner();
	lrparser();
}


void lrparser()
{
   if(syn==1)
   {
	   scaner();
	   yucu();
	   if(syn==6)
	   {
		   scaner();
		   if(syn==0||(kk==0))cout<<"Success!"<<endl;
			   
	   }
	   else{ if(kk!=1){cout<<"缺end错误!"<<endl;kk=1;}}
	   
   }	   
		   
	 else{cout<<"缺begin错误!"<<endl;kk=1;}
  return ;
	   
}



void yucu()
{
	statement();
	while(syn==26)
	{
		scaner();
		statement();
	}
	return;
}


void statement()

{
	if(syn==10)
	{
		scaner();
		if(syn==18)
		{
			scaner();
			expression();
		}
		else
		{
			cout<<"赋值号错误!"<<endl;
			kk=1;
		}
	}
	/*	else
		{
			cout<<"语句错误!"<<endl;
			kk=1;
		}*/
		return;

}



void expression()
{
	term();
	while(syn==13||syn==14)
	{
		scaner();
		term();
	}
	return;
}


void term()
{
	factor();
	while(syn==15||syn==16)
	{
		scaner();
		factor();
	}
	return;
}


void factor()
{
	if(syn==10||syn==11) scaner();
	else if(syn==27)
	{
		scaner();
		expression();
		if(syn==28)scaner();
		else{cout<<"缺 ( 错误!"<<endl;kk=1;}
	}
	else{cout<<"表达式错误!"<<endl;kk=1;}
	return;
}


void scaner()
{
	for(n=0;n<8;n++)
		token[n]=NULL;
	ch=prog[p++];                          //读入ch
	while(ch==' ') ch=prog[p++];   //判断是否为空白

	if(IsLetter(ch))
	{
          int m=0; 
	while(IsDigit(ch)||IsLetter(ch))
	{
		token[m++]=ch;
		ch=prog[p++];
        
	}
	token[m++]='\0';
	
				
	p--;
	
	syn=10;
    for(n=0;n<6;n++)
	{
		if(strcmp(token,rwtab[n])==0)
		{
			
			if(n==0) syn=1;
			else if(n==1) syn=2;
			else if(n==2) syn=3;
			else if(n==3) syn=4;
			else if(n==4) syn=5;
			else if(n==5) syn=6;
			
		}
	
	}

	}
	else 
		if(IsDigit(ch))
		{
			sum=0;
			while(IsDigit(ch))
			{
				sum=sum*10+ch-'0';
				ch=prog[p++];
			}
			p--;syn=11;
		}
		else 
switch(ch)
		{
			case '<':
			      m=0;
				token[m++]=ch;
		ch=prog[p++];
		if(ch=='>')
		{
			syn=21;
             token[m++]=ch;
		}
		else if(ch=='=')
		{
			syn=22;
			token[m++]=ch;
		}
		else 
		{
			syn=20;p--;
		}
		break;
			case '>':   m=0;
				token[m++]=ch;
		ch=prog[p++];
		if(ch=='=')
		{
			syn=24;
             token[m++]=ch;
		}
		
		else 
		{
			syn=23;p--;
		}
		break;
			case ':':
				    m=0;
				token[m++]=ch;
		ch=prog[p++];
		
		 if(ch=='=')
		{
			syn=18;
			token[m++]=ch;
		}
		else 
		{
			syn=17;p--;
		}
		break;
			case '+':
				syn=13;token[0]=ch;break;
				case '-':
				syn=14;token[0]=ch;break;
				case '*':
				syn=15;token[0]=ch;break;
				case '/':
				syn=16;token[0]=ch;break;
				case '=':
				syn=25;token[0]=ch;break;
				case ';':
				syn=26;token[0]=ch;break;
				case '(':
				syn=27;token[0]=ch;break;
				case ')':
				syn=28;token[0]=ch;break;
				case '#':
				syn=0;token[0]=ch;break;
                default:
					syn=-1;break;

		}


	
}





int IsLetter(char ch)
{
	if(ch=='A'||ch=='B'||ch=='C'||ch=='D'||ch=='E'||ch=='F'||ch=='G'||ch=='H'||
		ch=='I'||ch=='J'||ch=='K'||ch=='L'||ch=='M'||ch=='N'||ch=='O'||ch=='P'||
		ch=='Q'||ch=='R'||ch=='S'||ch=='T'||ch=='U'||ch=='V'||ch=='W'||ch=='X'||
		ch=='Y'||ch=='Z'||ch=='a'||ch=='b'||ch=='c'||ch=='d'||ch=='e'||ch=='f'||
		ch=='g'||ch=='h'||ch=='i'||ch=='j'||ch=='k'||ch=='l'||ch=='m'||ch=='n'||ch=='o'||
		ch=='p'||ch=='q'||ch=='r'||ch=='s'||ch=='t'||ch=='u'||ch=='v'||ch=='w'||
		ch=='x'||ch=='y'||ch=='z')
	return 1;
	else return 0;
}


int IsDigit(char ch)
{
if(ch=='1'||ch=='2'||ch=='3'||ch=='4'||ch=='5'||ch=='6'||ch=='7'||ch=='8'||ch=='9'||ch=='0')
    return 1;
  else return 0;


}








































⌨️ 快捷键说明

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