www.pudn.com > yufa.rar > yufa.cpp


//  M:程序,S:语句串,S1:语句,Z:赋值语句,E:表达式,T:项,F:因子 
//  P ::= begin S end    
//  S ::= S{;S1} 
//  S1 ::= Z 
//  Z ::= ID:=E 
//  E ::= T{+T|-T} 
//  T ::= F{*F|/F} 
//  F ::= ID|NUM|(E) 
 
#include  
using namespace std; 
#include  
#include  
using std::cout; 
using std::cin; 
using std::endl; 
using std::string; 
    char prog[80],token[8];//prog存放原程序字符串,token存放单词自身字符串 
    char ch; 
    int a,syn,p,m,n,sum;//syn单词种别码,p是缓冲区prog的指针,m是token的指针 
    char *rwtab[6]={"begin","if","then","while","do","end"}; 
    void scaner();//扫描子程序 
     
    int i=0;     //用于控制当前要判断的字符 
 
    bool judge=0;//用于判断输出合法或不合法 
 
void M(); 
void S(); 
void S1(); 
void Z(); 
void E(); 
void T(); 
void F(); 
void match(int &k);//此程序对k执行加1操作 
void scaner(); 
 
int main() 
{ 
    cout<<"输入一个待判断的符号串(以#结尾):\n"; 
	do{ 
        cin>>ch; 
        prog[i++]=ch; 
    }while(ch!='#');//输入串存入数组A 
 
	p=0; 
	 
     
	M(); 
	if(judge==0) 
        cout<<"\n此输入串合法\n\n"; 
    else 
        cout<<"\n此输入串不合法\n\n"; 
    return 0; 
} 
 
void M() 
{ 
	scaner(); 
	if(syn==1) 
		match(i); 
	else 
		judge=1; 
	S(); 
	scaner(); 
	if(syn==6) 
	{ 
		match(i); 
	    scaner(); 
		if(syn!=0) 
		   judge=1; 
	} 
	else 
		judge=1; 
} 
 
void S() 
{ 
	S1(); 
	a=p; 
loop: 
	scaner(); 
	if(syn==26) 
	{ 
		match(i); 
		S1(); 
		a=p; 
	}  
	 
	else 
	{ 
		p=a; 
	    return; 
	} 
    goto loop; 
} 
 
 
 
void S1() 
{ 
	Z(); 
} 
 
void Z() 
{ 
	scaner(); 
	if(syn==10) 
	{ 
		match(i); 
		scaner(); 
		if(syn==18) 
		{ 
			match(i); 
			E(); 
		} 
		else  
			judge=1; 
	} 
	else judge=1; 
} 
 
void E() 
{ 
	T(); 
	a=p; 
loop: 
    scaner(); 
 
	if(syn==13||syn==14) 
	{ 
	 
		match(i); 
		T(); 
		a=p; 
	} 
	 
	else  
	{	 
		p=a; 
	    return; 
	} 
	goto loop; 
} 
void T() 
{ 
	F(); 
	a=p; 
loop: 
	scaner(); 
	if(syn==15||syn==16) 
	{ 
		match(i); 
		F(); 
		a=p; 
	} 
	else { 
		p=a; 
		return; 
	} 
  goto loop; 
} 
 
void F() 
{ 
	scaner(); 
	if(syn==10) 
		match(i); 
	else if(syn==11) 
		match(i); 
	else if(syn==27) 
	{ 
		match(i); 
		E(); 
		scaner(); 
		if(syn==28) 
			match(i); 
		else judge=1; 
	} 
	else judge=1; 
} 
 
 
void scaner() 
{ 
    for(n=0;n<8;n++) 
        token[n]=0;//每次调用都把 token清零 
    m=0; 
	sum=0; 
    ch=prog[p++];   //读入一个字符 
    while(ch=='_') 
        ch=prog[p++]; //若ch是空格则向后移动 
    if(isalpha(ch))//ch为字母字符 
    { 
        while(isalnum(ch))//ch为字母或数字字符; 
        { 
            token[m++]=ch; 
            ch=prog[p++];//读下一个字符; 
        } 
        token[m++]='\0'; 
        p=p-1;//回退一个字符; 
          
        for(n=0;n<6;n++) 
        { 
            if(strcmp(token,rwtab[n])==0)//判断token是否为关键字 
            { 
                syn=n+1;//设置关键字的syn分别为:1 2 3 4 5 6 
                break; 
            } 
            else 
                syn=10;//设置标识符syn 
        } 
    } 
    else if(isdigit(ch))//ch是数字字符 
            { 
                while(isdigit(ch))//ch为数字字符 
                { 
                    sum=sum*10+ch-'0'; 
                    ch=prog[p++];//读下一个字符 
                } 
                p=p-1;//回退一个字符; 
                syn=11; 
            } 
    else if(ch=='<') 
	{ 
		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=p-1;//回退一个字符; 
              } 
	} 
     else if(ch=='>') 
	 {             token[m++]=ch; 
                    ch=prog[p++]; 
                    if(ch=='=') 
                    { 
                        syn=24; 
                        token[m++]=ch; 
                    } 
                    else 
                    { 
                        syn=23; 
                        p=p-1;//回退一个字符 
					} 
	 } 
     else if(ch==':') 
	 { 
		            token[m++]=ch; 
                    ch=prog[p++]; 
                    if(ch=='=') 
                    { 
                        syn=18; 
                        token[m++]=ch; 
                    } 
                    else 
                    { 
                        syn=17; 
                        p=p-1; 
                    } 
	  } 
      else if(ch=='=') { syn=25;token[0]=ch; } 
 
      else if(ch=='+') { syn=13;token[0]=ch; } 
                    
      else if(ch=='-') { syn=14;token[0]=ch; } 
        
      else if(ch=='*') { syn=15;token[0]=ch; } 
        
      else if(ch=='/') { syn=16;token[0]=ch; } 
              
      else if(ch==';') { syn=26;token[0]=ch; } 
                
      else if(ch=='(') { syn=27;token[0]=ch; } 
                
      else if(ch==')') { syn=28;token[0]=ch; } 
	  
      else if(ch=='#') { syn=0;token[0]=ch; } 
              
      else syn=-1; 
} 
void match(int &k) 
{  
	k++; 
}