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

📄 yufa.cpp

📁 编译原理实验递归下降语法分析源程序
💻 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 <iostream>
using namespace std;
#include <iomanip>
#include <string.h>
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++;
}

⌨️ 快捷键说明

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