yufafenxiqi.cpp

来自「编译原理实验中一个简单的语法分析器,用C++语言编写.」· C++ 代码 · 共 276 行

CPP
276
字号
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <iostream.h>

char progstring[1024];
char token[32];
char ch;
char *kws[6]={"begin","if","then","while","do","end"};
int syn,p,m,sum,kk;

void Irpareser();
void expression();
void scaner();
void factor();
void term();
void statement();
void yucu();

int IsAlpha(char ch)
{
  if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))
	  return 1;
  return 0;
}

int IsDigit(char ch)
{
  if(ch>='0' && ch<='9')
	  return 1;
  return 0;
}

int IsAlnum(char ch)
{
  if(IsDigit(ch) || IsAlpha(ch))
	  return 1;
  return 0;
}

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

void parser()
{
    if(syn==1){
        scaner();
        yucu();
        if(syn==6){
         scaner();
         if(syn==0 && kk==0)
           printf("success");
         }
        else{if(kk!=1) cout<<"缺少end"; kk=1;}
    }
    else {
    cout<<"缺少begin";
    kk=1;
    }
    return;
}

void scaner()
{
 char n;
 memset(token,0,32);
 ch=progstring[p++];
 m=0;
 kk=0; 
 while(ch==' ') 
   ch=progstring[p++]; 
 
  if(IsAlpha(ch))
  {
   while(IsAlnum(ch))
    {
     token[m++]=ch;
     ch=progstring[p++];
    }
   token[m++]='\0';
   p--;
   syn=10;
   for(n=0;n<6;n++)
    if(strcmp(token,kws[n])==0)
	{
	 syn=n+1;
	 break;
    }
  }
  else if(IsDigit(ch))
  {
   sum=0;
   while(IsDigit(ch))
   {
    sum=sum*10+ch-'0';
    ch=progstring[p++];
   }
   p--;
   syn=11;
  }
  else 
    switch(ch)
    {
    case '<':
      	m=0;
        token[m++]=ch;
       	ch=progstring[p++];
  		if(ch=='>')
  		{
 		 syn=21;
 		 token[m++]=ch;
	    }
        else if(ch=='=')
       	{
       	 syn=22;
       	 token[m++]=ch;
       	}
	   else
	   {
	    syn=20;
         p--;
	   }
	   break;
     case '>':
        token[m++]=ch;
        ch=progstring[p++];
	    if(ch=='=')
     	{
	     syn=24;
	     token[m++]=ch;
        }
        else 
	    {
	     syn=23;
	     p--;
	    }
	    break;
     case ':':
	     token[m++]=ch;
		 ch=progstring[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=0;
	     token[0]=ch;
	     return;
     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 32:
            break;                   
     default:
	     syn=-1;
	     break;
    }
}

void factor()
{
 if(syn==10 || syn==11)
   scaner();
 else if(syn==27){
   scaner();
   expression();
  if(syn==28)
   scaner();
  else {cout<<"括号不配对";kk=1;}
 }
 else {cout<<"表达式错误";kk=1;}
 return;
}

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

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

void statement()
{
 if(syn==10)
  {
    scaner();
    if(syn==18)
    {
      scaner();
      expression();
    }
    else {cout<<"赋值号错误";kk=1;}
  }
 else {kk=1;}
 return;
}

int main()
{
 int i;
 char cc;
 memset(progstring,0,1024);
 printf("please input:\n");
 i=0;
 while(1) {
	cc=getchar();
	progstring[i++]=cc;
	if(cc=='#')
		break;
 }
 p=0;
 scaner();
 parser();
 cout<<endl;
 getchar();
 return 1;
}

⌨️ 快捷键说明

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