基本要求:
①掌握中间代码生成的基本方法。
②掌握语法制导翻译模式。
③完成算术表达式的中间代码生成程序。
重点及难点:掌握语法制导翻译模式的核心思想和工作原理,在此基础上完成基于算数表达式的中间代码生成程序的设计和调试运行。

一、 算符优先分析法

算符优先分析法是一种简单且直观的自下而上分析方法,它特别适合于分析程序语言中的各类表达式,并且宜于手工实现。所谓算符优先分析,就是依照算术表达式的四则运算过程来进行语法分析,即这种分析方法要预先规定运算符(确切地说是终结符)之间的优先关系和结合性质,然后借助于这种关系来比较相邻运算符的优先级,以确定句型的“可归约串”来进行归约。因此,算符优先分析法不是一种规范归约,在整个归约过程中起决定性作用的是相继两个终结符的优先关系。
附加语义的方法是采用语法制导翻译的方法,语法制导翻译的方法就是为每个产生式配上一个翻译子程序(称语义动作或语义子程序),并在语法分析的同时执行这些子程序。语义动作是为产生式赋予具体意义的手段,它一方面指出了一个产生式所产生的符号串的意义,另一方面又按照这种意义规定了生成某种中间代码应做哪些基本动作。在语法分析过程中,当一个产生式获得匹配(对于自上而下分析)或用于归约(对于自下而上分析)时,此产生式相应的语义子程序就进入工作,完成既定的翻译任务。

二.算符优先分析法程序源代码

#include<string.h>
#include<stdio.h>
#include<math.h>int nxq = 100;
char a[20], optr[10], s, op;
int i, j, k, opond[10], x1, x2, x3;int operand(char c) {if ((c >= 48) && (c <= 57)) {return(1);}else {return(0);}
}int f(char c) {switch (c) {case'+':return(4);case'-':return(4);case'*':return(6);case'/':return(4);case'(':return(2);case')':return(6);case'#':return(0);default:printf("error!\n");}
}int g(char c) {switch (c) {case'+':return(3);case'-':return(3);case'*':return(5);case'/':return(5);case'(':return(7);case')':return(2);case'#':return(0);default:printf("error!\n");}
}void get() {s = a[i];i = i + 1;
}int main() {printf("please input your exoression:\n");i = 0;do {i = i + 1;scanf_s("%c", &a[i]);} while (a[i] != '#');i = 1;j = k = 1;optr[j] = '#';get();while (!((optr[j] == '#') && (s == '#'))) {if (operand(s)) {opond[k] = s - 48;k = k + 1;get();}else if (f(optr[j]) > g(s)) {op = optr[j];j = j - 1;x1 = opond[k - 2];x2 = opond[k - 1];k = k - 2;switch (op) {case'+':x3 = x1 + x2;break;case'*':x3 = x1 * x2;break;case'-':x3 = x1 - x2;break;case'/':x3 = x1 / x2;break;}          opond[k] = x3;k++;printf("%d (%c,%d,%d,%d)\n", nxq++,op, x1, x2, x3);}else if (f(optr[j]) < g(s)) {j = j + 1;optr[j] = s;get();}else if (f(optr[j]) == g(s)) {if (optr[j] == '(' ||optr[j]== ')') {j = j - 1;get();}else {printf("error!\n");}}else {printf("error!\n");}}return 0;
}

编译原理实验三【中间代码生成程序设计】相关推荐

  1. 合工大 编译原理 实验三

    合工大 编译原理 实验三 LR(1) 分析法 本项目使用c++实现,利用Windows API制作了简易的UI界面. 具体功能如下: 支持查看文法,项目族,LR(1) 分析表,句子归约过程. 可使用包 ...

  2. 编译原理实验三 语义分析程序设计与实现

    一.实验目的 在实现词法.语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法,并完成 ...

  3. java编程实现算符优先分析法,编译原理实验三-算符优先分析法

    编译原理实验3-算符优先分析法 #include #include #include #include #define SIZE 128 char priority[6][6]; //算符优先关系表数 ...

  4. 编译原理实验三:对完整程序进行词法分析并输出对应的二元组

    实验要求 [任务介绍]根据给定源语言的构词规则,从任意字符串中识别出该语言所有的合法的单词符号,并以等长的二元组形式输出. [输入]字符串形式的源程序. [输出]单词符号所构成的串(流),单词以等长的 ...

  5. 编译原理实验三 LR(1)分析法

    实验三 LR(1)分析法 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文 法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的 语法分析方法. 二.实验内 ...

  6. 编译原理 - 实验三 - 递归下降语法分析器的调试及扩展

    一. 语法分析介绍 语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备.执行语法分析任 ...

  7. 编译原理实验一:词法分析程序设计与实现

    一.实验内容 假定一种高级程序设计语言中的单词主要包括关键字begin.end.if.else.switch.case:标识符:整型常数:实型常数:六种关系运算符:一个赋值符和四个算术运算符,试构造能 ...

  8. 编译原理 实验三 LR(1)分析法 Java

    1. 实验目的 构造 LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解 LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法. 2. 实验内容 对下列文 ...

  9. 编译原理实验:代码生成作业(1)

    编译原理实验4:中间代码生成实验包-C++文档类资源-CSDN下载编译原理实验4:中间代码生成实验包更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.net/d ...

最新文章

  1. mysql分区失败_MYSQL表分区操作错误1503解决方案
  2. oracle erp 库存相关,oracle erp库存模块表(INV)
  3. mysql枫叶_mysql总结
  4. superset在云主机上的配置
  5. 数据结构——顺序栈和链式栈的简单实现和解析(C语言版)
  6. 微信小程序下拉刷新列表onPullDownRefresh;微信小程序上划加载列表onReachBottom;uni-app微信小程序下拉加载数据;uni-app微信小程序上划页面加载数据
  7. 埃及分数(信息学奥赛一本通-T1444)
  8. Android对Bitmap的内存优化
  9. 如何使用命令行 群晖_群晖Nas系统篇:拿回root账户权限,适用6.2及以上(7.0)系统...
  10. 眼动追踪技术 Eye tracking总结
  11. (转)Error launching Console Application PDFLaTeX ... 的解决方法
  12. 凯恩帝数控系统面板介绍_KND凯恩帝数控系统说明书.doc
  13. [BZOJ2906] 分块
  14. tf.app.flags
  15. 『深度概念』度量学习中损失函数的学习与深入理解
  16. MySql delete多表关联删除的使用方法
  17. EasyExcel实现excel的导入与导出
  18. 展示5G和AI的魅力,智博会这个展区为啥人气最旺?
  19. “百度杯”CTF比赛 十一月场 - 贝丝家族
  20. ubuntu下开启端口

热门文章

  1. (附源码)Springboot 点餐系统 毕业设计 100908
  2. 【AdaBoost算法】
  3. 冯诺依曼结构、哈佛结构、改进型哈佛结构
  4. 安卓前端开发!移动APP开发框架盘点,附带学习经验
  5. 一个多线程Ping 类
  6. cj20n sap 报错未知列的名称_sapps操作手册
  7. Altium Designer 如何从已有的PCB图、原理图,分别导出PCB封装库和原理图封装库
  8. Android Snackbar简单解析
  9. 衡量两个向量相似度的方法:余弦相似度
  10. 计算机凭据分配在哪里,电脑策略没有凭据分配怎么办