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

📄 bianyidekeshe.cpp

📁 (1) 写出符合给定的语法分析方法的文法及属性文法。 (2) 完成题目要求的中间代码三地址表示的描述。 (3) 写出给定的语法分析方法的思想
💻 CPP
字号:
#include<stdio.h>   
  #include<string.h>   
  #include<ctype.h>   
  #include<search.h>
#include<iostream.h>   
  extern   int   reserve(char*);   
  extern   void   output(int,char*);  
  char   token[20];  
  int impt[20];
  int num[10];
  char zf[2];
  char   ch;   
  int   i,c,re=100,h,z;   
  int n=0;  
  int l;

  int syjag();
  void S() ;
  char relop();       

  void   scanner(FILE   *fp)   
  {   
    ch=fgetc(fp);   //fgetc()是用来从文件中读取内容的。它可不管读到的内容是什么东西
    if(isalpha(ch))     //isalpha()如果是字母,返回真
    {   
      token[0]=ch;   
      i=1;   
      ch=fgetc(fp);   
      while(isalpha(ch)||isalnum(ch))   //isalnum()函数当参数是数字或者字母的时候返回非0值,其它是0
      {   
        token[i]=ch;   
        i++;   
        ch=fgetc(fp);   
      }   
      fseek(fp,-1,1);   //移动
      token[i]='\0';   
      c=reserve(token);   
      if(c!=-1)   
                  output(c,token);   
      else   
                  output(10,token);   
    }   
    else   if(isdigit(ch))   //isdigit() 如果参数是0,1,...,9中的一个字符,返回真,否则返回假,就是判断字符是否数字
              {   
      token[0]=ch;   
      ch=fgetc(fp);   //fgetc()是用来从文件中读取内容的。它可不管读到的内容是什么东西。
      i=1;   
      while(isdigit(ch))   
      {   
        token[i]=ch;   
        i++;   
        ch=fgetc(fp);   
      }   
      token[i]='\0';   
      fseek(fp,-1,1);   
      output(1,token);   
              }   
    else   
      switch(ch)   
      {   
        case'=':ch=fgetc(fp);   
          if(ch=='=')   
            output(39,"==");   
          else   
          {   
          fseek(fp,-1,1);   
          output(21,"=");   
          }   
          break;   
        case'+':output(22,"+");break;   
        case'-':output(23,"-");break;   
        case'*':output(24,"*");break;   
        case'/':output(25,"/");break;   
        case'(':output(26,"(");break;   
        case')':output(27,")");break;   
        case'[':output(28,"[");break;   
        case']':output(29,"]");break;   
        case'{':output(30,"{");break;   
        case'}':output(31,"}");break;   
        case',':output(32,",");break;   
        case':':output(33,":");break;   
        case';':output(34,";");break;   
        case'>':ch=fgetc(fp);   
          if(ch=='=')   
            output(37,">=");   
          else   
          {   
          fseek(fp,-1,1);   
          output(35,">");   
          }   
          break;   
        case'<':ch=fgetc(fp);   
          if(ch=='=')   
            output(38,"<=");   
          else   
          {   
          fseek(fp,-1,1);   
          output(36,"<");   
          }   
          break;   
        case'!':ch=fgetc(fp);   
          if(ch=='=')   
            output(40,"!=");   
          else   
          {   
          fseek(fp,-1,1);   
          output(-1,"ERROR!");   
          }   
          break;   
      }   
    
  }   
  void   main()   
  {               FILE   *fp;   
    char   wenjian[30];  
	//cout<<"词法分析的结果是:"<<endl;
	//cout<<"1表示数字和关键字的main;2表示int;3表示char;4表示if;5表示else;6表示for;"<<endl;
//	cout<<"7表示while;8表示case;9表示break10表示ID;20表示NUM;-1表示ERROR;22表示+;"<<endl;
	//cout<<"23表示-;24表示*;25表示/;26表示(;27表示);28表示[;29表示];30表示{;31表示};"<<endl;
	//cout<<"32表示,;33表示:;34表示;;35表示>;36表示<;37表示>=;38表示<=;39表示==;40!=;"<<endl;
    printf("Please   input   the   file   you   want   to   transform:"); 
	
    scanf("%s",&wenjian);   
    fp=fopen(wenjian,"r");      //打开一个文件
    while(!feof(fp))   
    {   
      scanner(fp);   
    }   
    int m;
    m=syjag();
	cout<<m<<endl;
    if(m==1)
	{
		cout<<"该文法是for循环语句"<<endl;
		cout<<"翻译的结果为:"<<endl;
        S();

	}
    else
		cout<<"该文法不是for循环语句"<<endl;

  }   
    
  /**************************search.h*********************************/   
    
  extern   struct   table   
  {   
      int   id;   
      char   code[10];   
  };   
  struct   table   key[31]   =   {{1,"main"},{2,"int"},{3,"char"},{4,"if"},{5,"else"},{6,"for"},{7,"while"},{8,"case"},{9,"break"},{10,"ID"},{20,"NUM"},{-1,"ERROR"}};   
  int   reserve(char*   p)   
  {     int   i=0;   
      for(i=0;i<9;i++)   
      {   
          if(strcmp(p,key[i].code)==0)   //strcmp(s1,s2) 对字符串s1和s2进行比较,返回比较结果--相等返回0,s1>s2时返回正数,s1<s2时返回负数
          return(key[i].id);   
      }   
      return(-1);   
  }   
  void   output(int   t,char   *s)   
  {   

	  impt[n]=t;
	  n++;
	  if(t==1){
		  num[h]=*s;
	  h++;
	  }
	  if(t==10){
		  zf[z]=*s;
		  z++;
	  }
      printf("[   %-2d   ,   %-6s   ]\n",t,s);   
  }   
  int syjag()
  {    
	  /*int sum;
	  for(int m=0;m<14;m++)
	  {		  
		 int a=impt[m];

	  }
	  return sum=impt[13];
      if(impt[0]==6)
		  if(impt[1]==26)
			  if(impt[2]==10)			
				  if(impt[3]==21)				
					  if(impt[4]==1)					
						  if(impt[5]==34)						
							  if(impt[6]==10)						
								  if(impt[7]==35&&impt[7]==36&&impt[7]==37&&impt[7]==38&&impt[7]==39&&impt[7]==40)							 								  
									  if(impt[8]==1)
									     if(impt[9]==34)
									    	if(impt[10]==10)
											   if(impt[11]==22)
												 if(impt[12]==22)
													  if(impt[13]==27)*/
	  if(impt[0]==6)//||impt[1]==26||impt[2]==10||impt[3]==21||impt[4]==1||impt[5]==34||impt[6]==10||(impt[7]==35&&impt[7]==36&&impt[7]==37&&impt[7]==38&&impt[7]==39&&impt[7]==40)||impt[8]==1||impt[9]==34||impt[10]==10||impt[11]==22||impt[12]==22||impt[13]==27)
	  {	
		  return 1;
	  }											  
	  else
			return 0;
  }
    
void S()                            
{
	l=syjag();
	if(l==1)//
	{
        cout<<re<<"  "<<zf[0]<<":="<<num[0]-48<<endl;
		re++;
		cout<<re<<"  "<<"goto"<<re+2<<endl;
		re++;
		cout<<re<<"  "<<zf[0]<<":="<<zf[2]<<"+1"<<endl;
		re++;
		cout<<re<<"  "<<"if"<<zf[1]<< relop()<<num[1]-48<<"goto"<<re+2<<endl;
		re++;
		cout<<re<<"  "<<"goto"<<"结束"<<endl;
		re++;
		cout<<re<<"  "<<"T:="<<"M+"<<zf[0]<<endl;
		re++;
		cout<<re<<"  "<<"M:=T"<<endl;
		re++;
		cout<<re<<"  goto"<<re-5<<endl;
		re++;
		cout<<re<<"  结束"<<endl;
	}
    
}

char relop()                        
{
	c=impt[7];
	if(c==36)
	{
		return '<';
	}
	else
		if(c==39)
		{
			return '=';
		}
		else
			if(c==35)
			{
				return '>';
			}
			else
				if(c==37)
				{
                 return '>=';
				}
				else
					if(c==38)
					{
						return '<=';
					}
					else
						if(c==40)
						{
							return '!=';
						}
}

⌨️ 快捷键说明

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