• 大小: 145KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-06-30
  • 语言: C/C++
  • 标签: 编译原理  

资源简介

内含代码+报告 题目: 选择部分C语言的语法成分,设计其词法分析程序、语法语义分析程序。 要求: 设计并实现一个一遍扫描的词法语法语义分析程序,将多条简单赋值语句翻译成三地址代码,要求有一定的出错提示和错误恢复功能。

资源截图

代码片段和文件信息

#include
#include
#include
#include

#define BUFFSIZE 5000
char prog[BUFFSIZE]token[8];
char chch1;
int synpqmnsumi=1k=0kkflag=0;
char *rwtab[32]={“main““break““case““char““define““continue““default“
                 “do““double““else““what““extern““float““for““goto““if“
                 “int““long““stack““return““short““fopen““sizeof“
 “static““struct““switch““typedef““enum““unsigned““void““fclose““while“};
int main()
{
  void scaner();
  int lrparser();
  FILE *fp;
  if((fp=fopen(“test.txt““r“))==NULL)
    { printf(“无法打开文件!\n“);
      exit(1);
    }
  p=0;
  while(!feof(fp))//把测试文件内容存入数组prog中
    {  prog[p++]=fgetc(fp);
       if(p>=5000)
       {  printf(“缓冲区容量不足!\n“);
          exit(1);
           }
    }
  fclose(fp);
  printf(“分析如下源程序:\n“);
  printf(“%s\n“prog);
  p=0;
printf(“词法分析结果:\n“);
do
{
scaner();
switch(syn)
{
case 34:printf(“(%d%d)“synsum);break;
case -1:printf(“error“);break;
default:printf(“(%d%s)“syntoken);
}
}
while(syn!=0);
p=0;
printf(“\n语法语义分析结果:\n“);
  scaner();
  lrparser(); 
  system(“pause“); 
  return 0; 
}

void scaner()//从文件中读取字符并检查词法

  for(n=0;n<8;n++) token[n]=NULL;
  m=0;
  sum=0;
  ch=prog[p];
  while(ch==‘ ‘||ch==‘\n‘)
  { p++;
    ch=prog[p];
      }//读下一个字符

  //if(ch==‘ ‘||ch==‘\n‘||ch==‘\t‘)continue;//跳过空格或换行或制表符
  if((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a‘&&ch<=‘z‘))//如果是字母
  { while (((ch>=‘A‘)&&(ch<=‘Z‘))||((ch>=‘a‘)&&(ch<=‘z‘))||(ch==‘_‘)||((ch>=‘0‘)&&(ch<=‘9‘)))//将连续的字符存储为字符串
    { token[m]=ch;
      m++;p++;
      ch=prog[p];
        }

  token[m++]=‘\0‘;
  syn=33;
  for(n=0;n<32;n++)
     if(strcmp(tokenrwtab[n])==0)
     { syn=n+1;
       break;
         }
  }//判断输入字符是否为标识符或者关键字的情况

  else
      if(ch>=‘0‘&&ch<=‘9‘)
      { while(ch>=‘0‘&&ch<=‘9‘)
        { sum=sum*10+ch-‘0‘;
          p++;
          ch=prog[p];
            }
        syn=34;
    }//判断输入字符是否为整型常数的情况

  else
      switch(ch)
      {
       case ‘<‘:token[m]=ch;
                p++;
                ch=prog[p];
                if(ch==‘>‘)
                { syn=42;
                  m++;
                  token[m]=ch;
                  p++;
                }//出现<>时
                else if(ch==‘=‘)
                { syn=43;
                  m++;
                  token[m]=ch;
                  p++;
                }//出现<=时
                else
                { syn=41;}
                break;

       case ‘>‘:token[m]=ch;
                p++;
                ch=prog[p];
                if(ch==‘=‘)
                { syn=45;
                  m++;
                  token[m]=ch;
                  p++;
                }//出现>=时
                else
                {syn=44;}
                break;

       case ‘:‘:token[m]=ch;
                p++;
                ch=prog[p];
                if(ch==‘=‘)
     

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件         62  2013-11-28 21:34  test.txt

     文件     159744  2013-11-28 21:45  实验报告.doc

     文件        298  2013-11-28 21:31  运行说明.txt

     文件       7745  2013-11-28 21:14  综合性实验.cpp

     文件     196672  2013-11-28 21:32  综合性实验.exe

----------- ---------  ---------- -----  ----

               364521                    5


评论

共有 条评论