scau编译原理综合性实验

news2024/11/25 9:15:54

一、题目要求

题目

选择部分C语言的语法成分,设计其词法分析程序、语法语义分析程序。

要求

设计并实现一个一遍扫描的词法语法语义分析程序,将部分C语言的语法成分(包含赋值语句、if语句、while循环语句)翻译成三地址代码,要求有一定的出错提示和错误恢复功能。

二、源码 

#include <stdio.h>
#include <string.h>
#include   <stdlib.h>

#define BUFFSIZE 5000
char prog[BUFFSIZE],token[8];
char ch,ch1;
int syn,p,q,m,n,sum,i=1,k=0,kk,flag=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[p++]=fgetc(fp);
       if(p>=5000)
       {  printf("缓冲区容量不够!\n");
          exit(1);
           }
    }/*把文件test中的内容存入数组prog中*/
  fclose(fp);
  printf("%s\n",prog);
  p=0;
printf("输出词法分析结果:\n");
	do
	{
		scaner();
		switch(syn)
		{
		case 34:printf("(%d,%d),",syn,sum);break;
		case -1:printf("error,");break;
		default:printf("(%d,%s),",syn,token);
		}
	}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>='A'&&ch<='Z')||(ch>='a'&&ch<='z'))
  { while((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(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(token,rwtab[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=='=')
                { syn=40;
                  m++;
                  token[m]=ch;
                  p++;
                }/*出现:=的情况*/
                else
                {syn=39;}
                break;

       case '/':token[m]=ch;
                p++;
                ch=prog[p];
                if(ch=='*')
                { syn=51;
                  q=0;
                  m++;
                  token[m]=ch;
                  p++;
                  q=p+1;
                  while(prog[p]!='*'||prog[q]!='/')
                  {p++;q++;}
                    }/*出现注释'/*'的情况*/
                else
                {syn=38;}
                break;

       case '*':token[m]=ch;
                p++;
                ch=prog[p];
                if(ch=='/')
                { syn=52;
                  m++;
                  token[m]=ch;
                  p++;
                }
                else
                {syn=37;}
                break;

       case '+':syn=35;token[0]=ch;p++;break;
       case '-':syn=36;token[0]=ch;p++;break;
       case '=':syn=46;token[0]=ch;p++;break;
       case ';':syn=47;token[0]=ch;p++;break;
       case '(':syn=48;token[0]=ch;p++;break;
       case ')':syn=49;token[0]=ch;p++;break;
       case '%':syn=50;token[0]=ch;p++;break;
       case '{':syn=53;token[0]=ch;p++;break;
       case '}':syn=54;token[0]=ch;p++;break;
       case ',':syn=55;token[0]=ch;p++;break;
       case '#':syn=0;token[0]=ch;p++;break;
       default:syn=-1;
          }

}

void emit(char *result,char *ag1,char *op,char *ag2)
{
    printf("(%d) %s=%s%s%s\n",i,result,ag1,op,ag2);
    i++;
    return;
}

char *newtemp(void)
{
    char *p;
    char m[8];
    p=(char *)malloc(8);
    k++;
    itoa(k,m,10);
    strcpy(p+1,m);
    p[0]='t';
    return(p);
}

int lrparser()
{   int yucu();
    int schain=0;
    kk=0;
    if(syn!=1)
	{
	printf("缺main错误!!\n");
    flag++;
	}
    scaner();
    if(syn!=48)
	{
    printf("main后缺(括号!!\n");
    flag++;
	}
    else scaner();
    if(syn!=49)
	{
    printf("main后缺)括号!!\n");
    flag++;
	}
    else scaner();
    if(syn!=53)
	{
	printf("main后缺{括号!!\n");
    flag++;
	}
    else scaner();
      schain=yucu();
      if(syn==54)
      { scaner();
        if(syn==0&&kk==0&&flag==0)/*kk是用来记录其他错误的标识*/
        printf("语法与语义分析结束。分析结果为:success\n");
		else
			printf("程序存在着%d个错误\n",flag);
      }
      else
      {if(kk!=1)
       printf("缺}错误!!");
       kk=1;
      }
   return(schain);
}

int yucu()
{
  int statement();
  int schain=0;
  schain=statement();
  while(syn==47)
  { scaner();
    schain=statement();
      }
  return(schain);
}

int statement()
{
    char *expression();
    char tt[8],eplace[8];
    int schain=0;
    switch(syn)
    { case 33:

             strcpy(tt,token);
             scaner();
             if(syn==46)
               { scaner();
                 strcpy(eplace,expression());
                 emit(tt,eplace," "," ");
                 schain=0;
               }
             else{printf("赋值号=错误!!");kk=1;}
      return(schain);
      break;
    }
}

char *expression(void)
{ char *term();
  char *tp,*ep2,*eplace,*tt;
  tp=(char *)malloc(12);
  ep2=(char *)malloc(12);
  eplace=(char *)malloc(12);
  tt=(char *)malloc(12);
  strcpy(eplace,term());
  while(syn==35||(syn==36))
  {   strcpy(tt,token);
      scaner();
      strcpy(ep2,term());
      strcpy(tp,newtemp());
      emit(tp,eplace,tt,ep2);
      strcpy(eplace,tp);
      }
  return(eplace);
}

char *term(void)
{
  char *factor();
  char *tp,*ep2,*eplace,*tt;
  tp=(char *)malloc(12);
  ep2=(char *)malloc(12);
  eplace=(char *)malloc(12);
  tt=(char *)malloc(12);
  strcpy(eplace,factor());
  while(syn==37||(syn==38))
  {   strcpy(tt,token);
      scaner();
      strcpy(ep2,factor());
      strcpy(tp,newtemp());
      emit(tp,eplace,tt,ep2);
      strcpy(eplace,tp);
      }
  return(eplace);
}

char *factor(void)
{
    char *fplace;
    fplace=(char *)malloc(12);
    strcpy(fplace," ");

    if(syn==33)
    {
       strcpy(fplace,token);
       scaner();
    }
    else if(syn==34)
    {
       itoa(sum,fplace,10);
       scaner();
    }
    else if(syn==48)
     {
         scaner();
        fplace=expression();
        if(syn==49)
        scaner();
        else{printf("缺‘)’错误!!\n");kk=1;flag++;}
     }

     else{printf("表达式错误!!\n");kk=1;flag++;}
     return(fplace);
}















本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell脚本(完结)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;shell编程&#xff08;完结&#xff09;_哔哩哔哩_bilibili 本文主要讲解不同shell脚本中的相互调用以及输入输出重定向操作。 一、不同脚本之间…

禁用达梦DEM的agent

agent占用内存较多&#xff0c;实际没什么使用&#xff0c;考虑停止agent 应该切换到root执行停止 cd /dm/dmdbms/tool/dmagent/service/ ./DmAgentService stop禁用

使用ChatGPT生成和优化电子商务用户需求规格说明书

在电子商务项目开发中&#xff0c;用户需求规格说明书&#xff08;User Requirement Specification, URS&#xff09;是团队沟通与项目成功的基石。然而&#xff0c;面对复杂多变的需求&#xff0c;如何快速生成清晰、完整且具备说服力的文档&#xff1f;这正是AI工具的用武之地…

产品研发管理和研发项目管理的区别是什么

产品研发管理与研发项目管理有显著的区别&#xff0c;主要体现在管理范围、目标导向和执行方法上。产品研发管理侧重于产品生命周期的规划与执行&#xff0c;强调产品的创新性和市场需求对接&#xff0c;而研发项目管理则更注重具体项目的执行过程&#xff0c;聚焦项目时间、成…

摆烂仙君传——深度学习秘境奇缘

第一章&#xff1a;深度学习秘境 在修仙界与科技交织的边缘&#xff0c;八荒六合九天无上摆烂仙君在其高科技修炼室中感应到一股神秘的召唤。这股力量似乎与他的灵魂产生了共鸣&#xff0c;引导他前往传说中的深度学习秘境。在那里&#xff0c;古老的仙法与前沿的算法交织&…

【FPGA开发】Vivado自定义封装IP核,绑定总线

支持单个文件的封装、整个工程的封装&#xff0c;这里用单个文件举例。 在文件工程目录下&#xff0c;自建一个文件夹&#xff0c;里面放上需要封装的verilog文件。 选择第三个&#xff0c;指定路径封装&#xff0c;找到文件所在目录 取个名&#xff0c;选择封装IP的路径 会…

【CS61A 2024秋】Python入门课,全过程记录P2(Week3开始,更新中2024/11/24)

文章目录 关于基本介绍&#x1f44b;Week 3Mon Environments阅读材料Lab 02: Higher-Order Functions, Lambda ExpressionsQ1: WWPD: The Truth Will PrevailQ2: WWPD: Higher-Order FunctionsQ3: WWPD: Lambda 关于 个人博客&#xff0c;里面偶尔更新&#xff0c;最近比较忙。…

在Linux下配置gitee与Github的远程仓库

目录 前言 云服务器下载git 检测是否下载成功git Linux下配置gitee远程仓库 代码提交演示 git三板斧 Linux下配置Github远程仓库 最后的提醒 前言 那么本篇文章将是在&#xff0c;你已经创建了本地仓库的基础上&#xff0c;在Linux下配置gitee的远程仓库的步骤&#xff…

Mac配置maven环境及在IDEA中配置Maven

Mac配置maven环境及在IDEA中配置Maven 1. 介绍 Maven是一款广泛用于Java等JVM语言项目的工具&#xff0c;它以项目对象模型&#xff08;POM&#xff09;为基础进行项目管理&#xff0c;通过POM文件来定义项目信息和依赖关系。同时&#xff0c;它也是构建自动化工具&#xff0…

硬中断关闭后的堆栈抓取方法

一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段&#xff0c;帮助我们发现问题&#xff0c;识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里&#xff0c;除了panic问题…

STL关联式容器之hashtable

hashtable的桶子与节点 下图为开链法(separate chaining)完成hashtable的图形表述。为了剖析SGI STL源码&#xff0c;我们遵循SGI的命名&#xff0c;称hash table表格内的元素为桶(bucket),此名称的大约意义是&#xff0c;表格内的每个单元&#xff0c;涵盖的不只是个节点(元素…

基于python的长津湖评论数据分析与可视化,使用是svm情感分析建模

引言 研究背景及意义 上世纪初开始&#xff0c;中国电影就以自己独有的姿态登上了世界电影史的舞台。中国电影作为国家文化和思想观念的反映与延伸&#xff0c;能够增强文化自信&#xff0c;在文化输出方面有着极其重要的作用1[1]。 改革开放以来&#xff0c;随着生产力的提高…

阿里云oss转发上线-实现不出网钓鱼

本地实现阿里云oss转发上线&#xff0c;全部代码在文末&#xff0c;代码存在冗余 实战环境 被钓鱼机器不出网只可访问内部网络包含集团oss 实战思路 若将我们的shellcode文件上传到集团oss上仍无法上线&#xff0c;那么就利用oss做中转使用本地转发进行上线&#xff0c;先发送…

预测未来 | MATLAB实现Transformer时间序列预测未来

预测未来 | MATLAB实现Transformer时间序列预测未来 预测效果 基本介绍 1.Matlab实现Transformer时间序列预测未来&#xff1b; 2.运行环境Matlab2023b及以上&#xff0c;data为数据集&#xff0c;单变量时间序列预测&#xff1b; 3.递归预测未来数据&#xff0c;可以控制预…

局域网与广域网:探索网络的规模与奥秘(3/10)

一、局域网的特点 局域网覆盖有限的地理范围&#xff0c;通常在几公里以内&#xff0c;具有实现资源共享、服务共享、维护简单、组网开销低等特点&#xff0c;主要传输介质为双绞线&#xff0c;并使用少量的光纤。 局域网一般是方圆几千米以内的区域网络&#xff0c;其特点丰富…

可视化建模与UML《协作图实验报告》

有些鸟儿毕竟是关不住的。 一、实验目的&#xff1a; 1、熟悉协作图的构件事物。 2、掌握协作图的绘制方法。 二、实验环境&#xff1a; window7 | 10 | 11 EA15 三、实验内容&#xff1a; 下面列出了打印文件时的工作流&#xff1a; 用户通过计算机指定要打印的文件。(2)打…

docker搭建私有的仓库

docker搭建私有仓库 一、为什么要搭建私有的仓库&#xff1f; 因为在国内&#xff0c;访问&#xff1a;https://hub.docker.com/ 会出现无法访问页面。。。。&#xff08;已经使用了魔法&#xff09; 当然现在也有一些国内的镜像管理网站&#xff0c;比如网易云镜像服务、Dao…

微信小程序条件渲染与列表渲染的全面教程

微信小程序条件渲染与列表渲染的全面教程 引言 在微信小程序的开发中,条件渲染和列表渲染是构建动态用户界面的重要技术。通过条件渲染,我们可以根据不同的状态展示不同的内容,而列表渲染则使得我们能够高效地展示一组数据。本文将详细讲解这两种渲染方式的用法,结合实例…

订单日记为“惠采科技”提供全方位的进销存管理支持

感谢温州惠采科技有限责任公司选择使用订单日记&#xff01; 温州惠采科技有限责任公司&#xff0c;成立于2024年&#xff0c;位于浙江省温州市&#xff0c;是一家以从事销售电气辅材为主的企业。 在业务不断壮大的过程中&#xff0c;想使用一种既能提升运营效率又能节省成本…

mysql-分析并解决可重复读隔离级别发生的删除幻读问题

在 MySQL 的 InnoDB 存储引擎中&#xff0c;快照读和当前读的行为会影响事务的一致性。让我们详细分析一下隔离级别味可重复读的情况下如何解决删除带来的幻读。 场景描述 假设有一个表 orders&#xff0c;其中包含以下数据&#xff1a; 事务 A 执行快照读 START TRANSACTION…