scau编译原理综合性实验
一、题目要求
题目:
选择部分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;}}/*判断输入字符是否为标识符或者关键字的情况*/elseif(ch>='0'&&ch<='9'){ while(ch>='0'&&ch<='9'){ sum=sum*10+ch-'0';p++;ch=prog[p];}syn=34;}/*判断输入字符是否为整型常数的情况*/elseswitch(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");elseprintf("程序存在着%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);
}
相关文章:
scau编译原理综合性实验
一、题目要求 题目: 选择部分C语言的语法成分,设计其词法分析程序、语法语义分析程序。 要求: 设计并实现一个一遍扫描的词法语法语义分析程序,将部分C语言的语法成分(包含赋值语句、if语句、while循环语句…...
ETAS工具导入DBC生成Com协议栈
文章目录 前言DBC配置关键属性Cobra参数配置Cobra使用isolar工程配置总结前言 ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项 DBC配置关键属性 对于普通Com报文,配置为周期发送,及其周期,NmMessage配置为No,示例如下: 对…...
表单校验规则
这里简单记录下vue使用表单时候,给表单添加校验规则,直接上代码 <script setup>import { ref } from vue// 定义表单对象const form ref({account: ,password: ,agree: true})// 定义表单验证规则const rules {account: [{required: true, mess…...
接口的扩展
1. 接口中新增的方法 JDK7之前接口中只能定义抽象方法。 JDK8的新特性:接口中可以定义有方法体的方法。(默认、静态) JDK9的新特性:接口中可以定义有私有方法体的方法。 有方法体的方法:接口升级时,为了兼容…...
新能源电机轴承电腐蚀,如何破?
近年来,随着全球范围内对可再生能源的重视与推动,新能源电机作为新能源汽车、风力发电和太阳能发电等系统的重要组成部分,得到了迅猛的发展。然而,在实际应用中,新能源电机的维护与管理越来越受到关注,其中…...
Java中的File和IO流
File对象 File对象本质是一个文件或文件夹,用于写入和读取文件内容 注意:对于相对路径而言,在单元测试方法中的File是相对于Module,在main中的File是相对于Project 构造器 File(String pathname)File file1 new File("D:…...
ls命令实操笔记
ls命令:全称list,显示文件的文件名与相关属性。(目前工作目录所含之文件及子目录) 4567 45678 7891 a1b2 a2b3c abcd Abcd acde aD7E bcde 通过ls浏览上述文件所在的目录,实现以下需求: 浏览含…...
线段数--算法
线段树是常用来维护 区间信息 的数据结构 线段树可以在 O(logN) 的时间复杂度内实现 单点修改区间修改区间查询 区间求和求区间最大值求区间最小值 简单介绍一下线段树 线段树是一个将区间内的数不断细分的一种数据结构,也就是一个完全二叉树,用每一…...
JS的DOM操作和事件监听综合练习 (具备三种功能的轮播图案例)
下面是是对dom操作的一个综合练习 下面代码是html的基本骨架(没有任何的功能): <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" c…...
低温存储开关机问题
问题: 某消费电子产品在进行可靠性实验室,在低温-30C存储两个小时后,上电不开机。在常温25C时,开关机正常。 分析: 1、接串口抓log信息,从打印信息可以看出uboot可以起来,在跑kernel时&#x…...
mysql系列1—mysql架构和协议介绍
背景: 本文开始整理mysql相关的文章,用于收集数据库相关内容;包括mysql架构和存储方式、索引结构和查询优化、数据库锁等内容。思考如何根据具体的业务给出最优的分表规划和表设计、字段选择和索引设计、优化的SQL语句,以及数据库…...
设计模式——模板模式
定义与基本概念 模板模式(Template Pattern)是一种行为设计模式。它在一个抽象类中定义了一个操作的算法骨架,将一些步骤的实现延迟到具体子类中。这个抽象类就像是一个模板,定义了执行某个流程的基本框架,而具体的细…...
CV22_语义分割基础
1. 常见的分割类型 在计算机视觉领域,根据不同的应用场景和需求,分割任务可以分为几种主要类型。以下是几种常见的分割类型: 语义分割(Semantic Segmentation): 语义分割的目标是将图像中的每个像素分配到…...
Dubbo源码解析-Dubbo的线程模型(九)
一、Dubbo线程模型 首先明确一个基本概念:IO 线程和业务线程的区别 IO 线程:配置在netty 连接点的用于处理网络数据的线程,主要处理编解码等直接与网络数据 打交道的事件。 业务线程:用于处理具体业务逻辑的线程,可以…...
【Canvas与标志】圆角三角形生化危险警示标志
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角三角形生化危险警示标志 Draft1</title><style type&qu…...
解决Dcat Admin laravel框架登录报错问题,(blocked:mixed-content)
前言 在使用 Dcat Admin 后台登录时,发生 error 报错:(blocked:mixed-content) xhr VM484:1,浏览器拦截 其实这是浏览器在 HTTPS 页面中尝试加载 HTTP 资源,导致浏览器阻止了这些不安全的请求。 解决 在 .env 文件中添加或修改 AD…...
(三)Sping Boot学习——升级jdk1.8-jdk18
1.修改系统环境变量。 2.idea中修改配置。 3.项目setting中设置修改 4.更新后还要重新下载依赖mvn clean install ,并且记住reload 项目。同时查看java -version查看一下jdk版本。...
语言模型中的多模态链式推理
神经网络的公式推导 简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模块 实验结果运行代码补充细节安装包下载Flan-T5数据集准备rougenltkall-MiniLM-L6-v2运行 简介 本文主要对2023一篇论文《Multimodal Chain-of-Thought Reason…...
SCons:下一代构建工具,如何用 Python 驱动高效构建?
在现代软件开发中,构建工具是开发流程中不可或缺的一环。无论是小型项目还是跨平台的复杂工程,选择一个高效、灵活的工具都能显著提高开发效率和代码质量。SCons,一个以 Python 为基础的构建工具,通过自动化依赖管理、灵活的扩展性…...
springboot 整合 rabbitMQ (延迟队列)
前言: 延迟队列是一个内部有序的数据结构,其主要功能体现在其延时特性上。这种队列存储的元素都设定了特定的处理时间,意味着它们需要在规定的时间点或者延迟之后才能被取出并进行相应的处理。简而言之,延时队列被设计用于存放那…...
如何用20万条真实动作数据,终结机器人动作“脑补”
3月30日,某知名媒体报道了一项来自南洋理工大学的前沿技术突破。研究团队利用超过20万条“4D交互数据”结合“运动学锚定”,研发出一种新型的“生成式仿真”技术,有效解决了机器人动作模拟中长期存在的“脑补”难题。据悉,这一技术…...
从WiFi4到WiFi7:一张表格看懂所有代际的真实网速差距(附选购建议)
从WiFi4到WiFi7:四代协议性能全景对比与智能组网决策指南 当你在电商平台搜索"WiFi6路由器"时,超过200款不同价位的设备会瞬间涌入视野。从299元的入门款到4999元的旗舰机型,商家宣传的"AX3000"、"BE6500"等参…...
别再死记硬背TTS原理了!用Python+TensorFlow复现一个简易Deep Voice,从音素到语音全流程拆解
用PythonTensorFlow实战Deep Voice:从音素到语音的完整实现指南 当你第一次听到计算机生成的语音时,是否好奇过这背后的魔法是如何实现的?现代文本转语音(TTS)系统已经能够产生几乎与真人无异的语音,而Deep Voice作为早期端到端TT…...
超实用AI专著生成攻略,掌握工具技巧,轻松搞定大型学术著作
学术专著创作困境与AI写作工具解决方案 撰写学术专著时的困难,不仅仅体现在“能够写出来”,更关键的是“能够成功出版并获得认可”。在当今的出版行业,学术专著的受众群体相对较小,出版社在选择题材时,对其学术价值以…...
电脑PC下载SMART200PLC和SMART 触摸屏程序的方法
西门子S7-200smartPLC和smart触摸屏通过本笔记本下载程序时,笔记本和smart触摸屏需完成相应设置,即笔记本电脑和smart触摸屏需通过固定IP通信下载程序,设置方法如下,本文档设置之前默认已将电脑、PLC和触摸屏通过RJ45接口网线连接…...
SiameseAOE中文-base惊艳效果:结构化输出JSON兼容下游BI/报表系统直连
SiameseAOE中文-base惊艳效果:结构化输出JSON兼容下游BI/报表系统直连 1. 模型效果惊艳展示 SiameseAOE通用属性观点抽取模型在中文文本处理方面表现出色,能够从非结构化文本中精准提取结构化信息。最令人印象深刻的是,模型输出的JSON格式数…...
别再手动调参了!用C#和Halcon的HSmartWindow控件,5分钟搞定ROI绘制与参数提取
工业视觉开发革命:用C#封装Halcon ROI的智能实践 在半导体检测、精密零件测量等工业场景中,区域兴趣(ROI)的精准定义直接影响着算法效果。传统开发模式下,工程师需要反复在Halcon脚本与C#界面代码间切换,手…...
新一代OpenWRT主题:Neobird革新路由器管理体验
新一代OpenWRT主题:Neobird革新路由器管理体验 【免费下载链接】luci-theme-neobird 一个专门针对移动端优化的OpenWRT主题,基于luci-theme-material,全新的登录界面,沉浸式Webapp体验。 项目地址: https://gitcode.com/gh_mirr…...
3种高效策略:Legacy iOS Kit 旧设备系统降级与越狱终极方案
3种高效策略:Legacy iOS Kit 旧设备系统降级与越狱终极方案 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit L…...
科研党效率翻倍:Texmaker这些隐藏功能让你的论文排版快人一步
Texmaker科研效率革命:解锁高阶玩家的12个生产力加速器 在深夜实验室的灯光下,你盯着屏幕上纠缠不清的LaTeX代码,参考文献格式突然崩溃,数学公式编号混乱不堪——这场景是否似曾相识?Texmaker作为LaTeX编辑器的隐藏冠军…...
