《编译原理》课程实验报告

实验名称:语义分析

姓名:

学号:

地点:四教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

评语:

 

 

 

 

 

 

 

 

 

 

 

 指导老师签字:                     年    月   日

语义分析(输出四元式)相关推荐

  1. 【编译原理】WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)(赋值语句的词法分析、语义分析)

    注:本文记录 WHUT-计算机学院-编译原理 课程 课内实践 >>点击查看武汉理工大学计算机专业课程资料汇总 项目下载地址:https://download.csdn.net/downlo ...

  2. [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现

    题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: ​ 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...

  3. C++实现的利用LR(1)分析表对赋值表达式进行语法制导翻译生成四元式及汇编代码

    赋值语句的语法制导翻译 后续已完善算术运算文法.赋值文法.布尔运算文法.if.while.do-while和复合语句文法,编译器项目已上传GitHub,https://github.com/sleep ...

  4. LR(1)分析表-语法树-四元式

    这学期的编译原理终于学完了,不愧是号称最难的科目.要用C++从头到尾实现一下小型编译器,还真不容易啊.不过总算是做完了. 首先上文法,这个文法是根据上一篇博客简化的,但还是有一点问题的,暂时发现有一个 ...

  5. java pl0 四元式,【编译原理】c++实现自下而上语法分析及中间代码(四元式)生成...

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  6. 【视频联动】编译原理:写出布尔表达式A or (B and not(C or D)) 的四元式序列。说明:按照控制语句中的布尔表达式翻译

    编译原理:写出布尔表达式A or (B and not(C or D))  的四元式序列.说明:按照控制语句中的布尔表达式翻译 这里是总结的知识点.如果有问题可以下方留言提问,视频已经放到Bilibi ...

  7. 编译原理 赋值语句翻译成四元式

    赋值语句及算数表达式的翻译 将赋值语句翻译成四元式的语义描述: (1) S-> id:=A (2) A->id (3) A->int (4) A->real (5) A-> ...

  8. 【编译原理】:如何将控制语句翻译成四元式

    如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1 arg2 存储变量 知道这个思路之后,我们就能够很快的做出这道题了

  9. 【编译原理】 如何将控制语句翻译成四元式

    如图: 解决这个问题的方法是: 翻译成三元式(逻辑就能翻译) 三元式转换为四元式 四元式结果 Op arg1  arg2  存储变量 知道这个思路之后,我们就能够很快的做出这道题了

  10. 期末考试:编译原理——如何将控制语句翻译成四元式.

    一 例题 二 总结 1. 将原式翻译成三元式(逻辑就能翻译) 2. 三元式转换为四元式(Op arg1 arg2 存储变量) 3. 常见的变化规则 1. 判断语句 2. 赋值语句

最新文章

  1. [特征工程系列一] 论特征的重要性
  2. 装配图中齿轮的画法_装配图的规定画法 和特殊画法
  3. different color in Chrome Development Tool
  4. [vue] 你有写过自定义组件吗?
  5. android xml 画下划线,android – strings.xml:如何从标记前面的空格中删除下划线?...
  6. [EOJ]2019 ECNU XCPC March Selection #1 F
  7. c语言std变量,10-C ++中的变量
  8. 315 后,等待失业的程序员
  9. 为 iOS 6 量身打造 Apps
  10. 从 JavaScript 到 TypeScript 6 - Vue 引入 TypeScript
  11. 数据库周刊45丨易鲸捷4.2亿订单创记录;10月Oracle补丁发布;巨杉SequoiaDB v5.0发布;MySQL卡死案例……
  12. 无需脑图 无需思维导图 看Word大纲视图
  13. 联合开发网被罚50万元,站长直接关站!
  14. 24个足以改变事业的商业妙想
  15. 程序、进程、作业的联系
  16. DXF04-02 时间:2021.12.03-2012.12.03 关键词:DXF样条曲线信息
  17. 破解STM32F103芯片的方法
  18. 化合物分子 ogb、dgl生成图网络及GNN模型训练;pgl图框架
  19. php编写蜘蛛池站群教程,快车蜘蛛池站群程序 v2.0
  20. python求平均值的怎么编写,python 怎么求平均值

热门文章

  1. Ubuntu下快速安装jdk、tomcat、mysql和Redis
  2. 云服务器内存占用多少,腾讯云云服务器CPU或内存占用过高怎么办?
  3. 腾讯云云服务器部署Davinci可视化
  4. lisp princ详解_autolisp princ 变量
  5. matlab模糊控制侧方位泊车
  6. 计算机打开后任务栏有但桌面不显示不出来,任务栏不显示打开的窗口,教您打开的窗口在任务栏上显示不出来...
  7. OSChina 周二乱弹 —— 基于现代生物化学的长生不老药炼制教程
  8. 王慧文清华产品课(四)
  9. 【转】地址线和数据线的计算
  10. Java人脸识别考勤系统_GitHub - magician1128/WorkAttendanceSystem: 一个基于opencv、dilb的员工人脸识别考勤系统...