语义分析(输出四元式)
《编译原理》课程实验报告
实验名称:语义分析
姓名:
学号:
地点:四教302
教师:
院系:
专业: 计算机科学与技术15-1
一. 实验目的
通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。
二. 实验内容
采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。
输入:begin a:=2+3*4;x:=(a+b)/c end #
输出:(1)t1=3*4 (2)t2=2+t1 (3)a=t2
(4)t3=a+b (5)t4=t3/c (6) x=t4
三.实验步骤
|
代码如下:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
char prog[100],token[8],ch;
char*rwtab[6]={"begin","if","then","while","do","end"};
int syn,p,m,n,sum,q;
int kk;
struct { char result1[8];
char ag11[8];
char op1[8];
char ag21[8];
} quad[20];
char *factor();
char *expression();
int yucu();
char *term();
int statement();
int lrparser();
char *newtemp();
scaner();
emit(char *result,char *ag1,char *op,char *ag2);
main()
{ int j;
q=p=kk=0;
printf("院系:计算机与通信工程学院\n");
printf("班级:计算机科学与技术15-01\n");
printf("姓名:汪笛\n");
printf("学号:541507010139\n");
printf("\nplease input a string (end with '#'): ");
do
{scanf("%c",&ch);
prog[p++]=ch;
}while(ch!='#');
p=0;
scaner();
lrparser();
if(q>19)printf(" to long sentense!\n");
else for (j=0;j<q;j++)printf(" %s = %s %s %s\n\n",quad[j].result1,quad[j].ag11,quad[j].op1,quad[j].ag21);
//getch();
}
int lrparser()
{ int schain=0;
kk=0;
if (syn==1)
{ scaner();
schain=yucu();/*调用语句串分析函数进行分析*/
if(syn==6)
{ scaner();
if((syn==0)&&(kk==0)) printf("Success!\n");
}
else { if(kk!=1)printf("short of 'end' !\n");
kk=1;
// getch();
exit(0);
}
}
else { printf("shortof 'begin' !\n");
kk=1;
// getch();
exit(0);
}
return (schain);
}
int yucu()
{ int schain=0;
schain=statement();/*调用语句分析函数进行分析*/
while(syn==26)
{ scaner();
schain=statement();/*调用语句分析函数进行分析*/
}
return (schain);
}
int statement()
{ char tt[8],eplace[8];
int schain=0;
if (syn==10)
{ strcpy(tt,token);
scaner();
if(syn==18)
{ scaner();
strcpy(eplace,expression());
emit(tt,eplace,"","");
schain=0;
}
else { printf("shortof sign ':=' !\n");
kk=1;
// getch();
exit(0);
}
return (schain);
}
}
char *expression()
{ char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);/*分配空间*/
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt=(char *)malloc(12);
strcpy(eplace,term());/*调用term分析产生表达式计算的第一项eplace*/
while((syn==13)||(syn==14))
{ if(syn==13)strcpy(tt,"+");
elsestrcpy(tt,"-");
scaner();
strcpy(ep2,term());/*调用term分析产生表达式计算的第二项ep2*/
strcpy(tp,newtemp());/*调用newtemp产生临时变量tp存储计算结果*/
emit(tp,eplace,tt,ep2);/*生成四元式送入四元式表*/
strcpy(eplace,tp);
}
return (eplace);
}
char *term()/*仿照函数expression编写*/
{ 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==15)||(syn==16))
{ if(syn==15)strcpy(tt,"*");
elsestrcpy(tt,"/");
scaner();
strcpy(ep2,factor());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
}
return (eplace);
}
char *factor()
{ char *fplace;
fplace=(char *)malloc(12);
strcpy(fplace,"");
if(syn==10)
{ strcpy(fplace,token);/*将标识符token的值赋给fplace*/
scaner();
}
else if(syn==11)
{ itoa(sum,fplace,10);
scaner();
}
else if(syn==27)
{ scaner();
fplace=expression();/*调用expression分析返回表达式的值*/
if(syn==28) scaner();
else { printf("erroron ')' !\n");
kk=1;
// getch();
exit(0);
}
}
else { printf("error on '(' !\n");
kk=1;
// getch();
exit(0);
}
return (fplace);
}
char *newtemp()
{ char *p;
char m[8];
p=(char *)malloc(8);
kk++;
itoa(kk,m,10);
strcpy(p+1,m);
p[0]='t';
return(p);
}
scaner()
{ sum=0;
for(m=0;m<8;m++)token[m++]=NULL;
m=0;
ch=prog[p++];
while(ch=='')ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
token[m++]='\0';
for(n=0;n<6;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';
ch=prog[p++];
}
p--;
syn=11;
}
else switch(ch)
{ case '<':m=0;
ch=prog[p++];
if(ch=='>')
{ syn=21;
}
else if(ch=='=')
{ syn=22;
}
else
{ syn=20;
p--;
}
break;
case '>':m=0;
ch=prog[p++];
if(ch=='=')
{ syn=24;
}
else
{ syn=23;
p--;
}
break;
case ':':m=0;
ch=prog[p++];
if(ch=='=')
{ syn=18; }
else
{ syn=17;
p--;
}
break;
case '+': syn=13; break;
case '-': syn=14; break;
case '*': syn=15;break;
case '/': syn=16;break;
case '(': syn=27;break;
case ')': syn=28;break;
case '=': syn=25;break;
case ';': syn=26;break;
case '#': syn=0;break;
default: syn=-1;break;
}
}
emit(char *result,char *ag1,char *op,char *ag2)
{
strcpy(quad[q].result1,result);
strcpy(quad[q].ag11,ag1);
strcpy(quad[q].op1,op);
strcpy(quad[q].ag21,ag2);
q++;
}
输出结果为:
四.总结与回顾
本次实验做的是语法分析子程序,采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。实现的过程也是不断的在网上查找资料,并将合适的下载下来进行参考。实现的过程也是理解的过程,不断完善才可以不断加强理解。
实验报告成绩评定表
评定项目 |
内 容 |
满 分 |
评 分 |
总 分 |
实验态度 |
态度端正、遵守纪律、出勤情况 |
20 |
||
实验过程 |
按要求完成算法设计、代码书写、注释清晰、运行结果正确 |
40 |
||
报告撰写 |
报告书写规范、内容条理清楚、表达准确规范、上交及时。 |
40 |
||
评语:
指导老师签字: 年 月 日 |
语义分析(输出四元式)相关推荐
- 【编译原理】WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)(赋值语句的词法分析、语义分析)
注:本文记录 WHUT-计算机学院-编译原理 课程 课内实践 >>点击查看武汉理工大学计算机专业课程资料汇总 项目下载地址:https://download.csdn.net/downlo ...
- [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现
题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...
- C++实现的利用LR(1)分析表对赋值表达式进行语法制导翻译生成四元式及汇编代码
赋值语句的语法制导翻译 后续已完善算术运算文法.赋值文法.布尔运算文法.if.while.do-while和复合语句文法,编译器项目已上传GitHub,https://github.com/sleep ...
- LR(1)分析表-语法树-四元式
这学期的编译原理终于学完了,不愧是号称最难的科目.要用C++从头到尾实现一下小型编译器,还真不容易啊.不过总算是做完了. 首先上文法,这个文法是根据上一篇博客简化的,但还是有一点问题的,暂时发现有一个 ...
- java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 【视频联动】编译原理:写出布尔表达式A or (B and not(C or D)) 的四元式序列。说明:按照控制语句中的布尔表达式翻译
编译原理:写出布尔表达式A or (B and not(C or D)) 的四元式序列.说明:按照控制语句中的布尔表达式翻译 这里是总结的知识点.如果有问题可以下方留言提问,视频已经放到Bilibi ...
- 编译原理 赋值语句翻译成四元式
赋值语句及算数表达式的翻译 将赋值语句翻译成四元式的语义描述: (1) S-> id:=A (2) A->id (3) A->int (4) A->real (5) A-> ...
- 【编译原理】:如何将控制语句翻译成四元式
如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1 arg2 存储变量 知道这个思路之后,我们就能够很快的做出这道题了
- 【编译原理】 如何将控制语句翻译成四元式
如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1 arg2 存储变量 知道这个思路之后,我们就能够很快的做出这道题了
- 期末考试:编译原理——如何将控制语句翻译成四元式.
一 例题 二 总结 1. 将原式翻译成三元式(逻辑就能翻译) 2. 三元式转换为四元式(Op arg1 arg2 存储变量) 3. 常见的变化规则 1. 判断语句 2. 赋值语句
最新文章
- [特征工程系列一] 论特征的重要性
- 装配图中齿轮的画法_装配图的规定画法 和特殊画法
- different color in Chrome Development Tool
- [vue] 你有写过自定义组件吗?
- android xml 画下划线,android – strings.xml:如何从标记前面的空格中删除下划线?...
- [EOJ]2019 ECNU XCPC March Selection #1 F
- c语言std变量,10-C ++中的变量
- 315 后,等待失业的程序员
- 为 iOS 6 量身打造 Apps
- 从 JavaScript 到 TypeScript 6 - Vue 引入 TypeScript
- 数据库周刊45丨易鲸捷4.2亿订单创记录;10月Oracle补丁发布;巨杉SequoiaDB v5.0发布;MySQL卡死案例……
- 无需脑图 无需思维导图 看Word大纲视图
- 联合开发网被罚50万元,站长直接关站!
- 24个足以改变事业的商业妙想
- 程序、进程、作业的联系
- DXF04-02 时间:2021.12.03-2012.12.03 关键词:DXF样条曲线信息
- 破解STM32F103芯片的方法
- 化合物分子 ogb、dgl生成图网络及GNN模型训练;pgl图框架
- php编写蜘蛛池站群教程,快车蜘蛛池站群程序 v2.0
- python求平均值的怎么编写,python 怎么求平均值
热门文章
- Ubuntu下快速安装jdk、tomcat、mysql和Redis
- 云服务器内存占用多少,腾讯云云服务器CPU或内存占用过高怎么办?
- 腾讯云云服务器部署Davinci可视化
- lisp princ详解_autolisp princ 变量
- matlab模糊控制侧方位泊车
- 计算机打开后任务栏有但桌面不显示不出来,任务栏不显示打开的窗口,教您打开的窗口在任务栏上显示不出来...
- OSChina 周二乱弹 —— 基于现代生物化学的长生不老药炼制教程
- 王慧文清华产品课(四)
- 【转】地址线和数据线的计算
- Java人脸识别考勤系统_GitHub - magician1128/WorkAttendanceSystem: 一个基于opencv、dilb的员工人脸识别考勤系统...