属性文法与语法制导翻译
- 格式:ppt
- 大小:199.50 KB
- 文档页数:59


for循环语句翻译 递归下降法 输出三地址码 /////////////
#define MAX 100
#include
#include
#include
char str[MAX];
char ch;
int turn;
char strToken[MAX];
int kind;
int n=0;//存放strtoken[]元素的个数
struct Word//结构体 存放单词
{
int sort;
char word[MAX];//存放strtoken[]的内容
};
//record[x]=new Word;
Word *record[12];//放所有识别出来的单词,分别存放他们的编号以及字符串,x是其下标
////////////////////词法分析///////////////////////
int buffer()//载入
{
int i=0;
cout<<"输入程序,以“#”作为结束标志。"<
for(int n=0;n<=MAX;n++)
{
for(;i<=MAX;i++)
{
scanf("%c",&str[i]);
/////////////cin>>str[i]不可用,用C语言读入字符。
if(str[i]=='#')
break;///////如果尾数为识别码#,则表示程序读完,跳出循环.
}
break;
}
return(i); }
bool IsLetter(char ch)///////////判断是否是字母
{
if(ch>=65&&ch<=90||ch>=97&&ch<=122)
return(true);
else
return(false);
}
bool IsDigit(char ch)//////////判断是否是数字
{
if(ch>=48&&ch<=57)
《编译系统设计实践》
实验项目三:语法制导翻译与生成中间代码
学号:
姓名:
年级:
学院: 数计学院
专业: 计算机
本组其它成员:学号 姓名
学号 姓名
实验时间:2016-2017学年第一学期
任课教师:
一、实验目的
通过语法制导或翻译模式生成中间代码。
二、实验内容
在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。
三、设计思路
1. 分析过程
主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的语义规则(这里只有if和while和赋值语句),赋值语句调用表达式处理,if语句调用条件表达式处理,while也是调用表达式处理,然后是一个递归过程,不断的递归调用,按序输出三地址语句。在本例程序中选用expr及num作为运算数。
2. 主要函数
string link() //字符串和数字的连接
string element() //获取表达式中的元素对象
string expression() //处理表达式
string expression_1() //处理表达式
string biaodashi() //处理表达式,转为三地址输出
string biaodashi_1() //递归---处理表达式,转为三地址输出
string getOperator() //判断并获取运算符
void condition(int L1,int L2) //输出if语句的条件的三地址代码
实验报告成绩: 指导教师审核(签名): 年 月 日
预习报告□ 实验报告□
语法制导把表达式翻译成逆波兰式
(一)实验目的
进一步掌握语法制导翻译的概念,理解中间语言,设计出错处理程序方法,掌握把表达式翻译成中间语言的算法。
(二)实验内容
1.从左到右扫描中缀表达式,经语法分析找出中缀表达式出现的错误并给出错误的具体位置和类型。一个运算符栈存放暂时不能出现的运算符,逆波兰区存放逆波兰表达式。
2.测试所编程序,给出正确和错误的结果。
(三)实验要求
1.学生课前要认真阅读实验指导,理解实验内容与相关理论知识的关系,并完成预习报告
2.用C语言或其它高级语言编写程序
3.写出实验报告
内蒙古工业大学信息工程学院
第 页 实验报告成绩: 指导教师审核(签名):
年 月 日
预习报告□ 实验报告□
语法制导把表达式翻译成逆波兰式
(一)实验目的
通过上机实习加深对语法指导翻译原理的理解,掌握运算符优先权的算法,将语法分析所识别的表达式变换成中间代码的翻译方法。
(二)实验内容
同预习报告
(三)实验要求
1.学生课前要认真阅读实验指导,理解实验内容与相关理论知识的关系,并完成预习报告
2.用C语言或其它高级语言编写程序
3.写出实验报告
(四)实验设计思路
1)表达式生成逆波兰式的算法
1、初始化△送到运算符栈。
2、扫描左括号“(”,把△送到运算符栈。
3、扫描到变量,把它送到逆波兰区。
4、扫描到运算符
( 1)栈内运算符比较
a.栈内运算符>=栈外运算符,把栈内运算符送到逆波兰区。
b.栈内运算符
( 2 ) 栈内是△把运算符入栈。
5、扫描右括号 “)”。
( 1 )栈内是运算符,把栈内运算符送到逆波兰区。
( 2 )栈内是△则△退栈,读入下一个字符。
2013年12月干I
语法制导翻译程序的学习与实践
陈兴宝,孙长圣
(仰恩大学计算机与信息学院,福建泉州 362014)
【摘要】 本文介绍了语法制导翻译程序的设计与实现。语法制导翻译是指在语法分析的同时,使用与产生式所对应的
语义子程序,完成源程序语义分析和翻译工作,最终获得由机器指令或者汇编语言表示的目标程序。本文工
作仅限于关键的中间代码四元式表示的翻译结果。
【关键词】语法制导翻译;属性文法;语义子程序;中间代码
【中图分类号】G642.0 【文献标识码】A 【文章编号】2095—5065(2013)12—0079-08
0概述
语法制导翻译是指在语法分析的同时,使用
与产生式所对应的语义子程序,完成源程序语义
分析和翻译工作。该语法制导翻译程序基于属性
文法,其实现过程为:先依属性文法生成LR项目
集规范族,由LR项目集规范族生成语法分析的预
测分析表,然后由预测分析表生成自底向上的语
法分析程序,再设计、实现文法后面的语义子程
序,最后形成语法制导翻译的总控程序。
语法制导翻译的关键环节和过程是运行语法
制导翻译的总控程序,对于输入的源程序进行语
法分析,在语法分析的同时,调用语义子程序,
完成源程序的语义分析和翻译工作,最终获得由
中间代码四元组或三元组表示的翻译结果。
报告设计、调试了一个语法制导翻译程序,
采用c语言编写,对由赋值语句、控制语句构成
收稿日期:2013.12-5
作者简介:陈兴宝(199o_I),女,福建泉州人,工学学
士,从事技术开发与应用工作;
孙长圣(1945__),男,湖南邵阳人,工学硕士,副教授,
主要从事计算机科学与技术专业教学与科研工作。 的源程序,实现语法制导翻译,得到由中问代码
四元组表示的翻译结果。本文详细介绍了语法制
导翻译程序的内容,包括算法描述、程序结构、
主要变量名说明、调试情况、设计技巧等。
1 程序分析与设计
为了使该语法程序具有通用性,此处将所要进