语法制导的翻译
- 格式:ppt
- 大小:886.50 KB
- 文档页数:64


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语句的条件的三地址代码
注释语法分析树
概念
语法制导翻译的基本思想
在语法分析基础上边分析边翻译
• 翻译的依据:语义规则或语义子程序
• 翻译的结果:相应的中间代码
• 翻译的做法:为每个产生式配置相应的语义子程序,每当使用某 个产生式进行规约或推导时,就调用语义子程序,完成一部分翻 译工作
• 语法分析完成时,翻译工作也告结束
sdd && sdt
• 语法制导定义 syntax-directed definitions(sdd)
o 将文法符号和某些属性相关联 规则与产生式相关联
o 并通过语义规则来描述如何计算属性的值 e → e 1
+ t e . v a l = e 1. v a l + t . v a l e
→e1+t e.val=e1.val + t.val
e→e1+te.val=e1.val+t.val
• 语法制导的翻译方案 syntax-directed translation
scheme(sdt)
o 在产生式体中加入语义动作,并在适当的时候执行这些语义动作
o e → e 1 + t { e . v a l = e 1. v a l + t . v
a l ; } e → e1+t \{e.val=e1.val + t.val;\}
e→e1+t{e.val=e1.val+t.val;} 语义规则
• 描述一个产生式所对应的翻译工作,如:
o 改变某些变量的值;
o 填/查各种符号表;
o 发现并报告源程序错误;
o 产 生中间代码
• 决定于翻译的目的,例如:产生什么样的中间代码
文法属性(s,l)
• 综合属性:分析树节点n上的非终结符的综合属性只能通过该节点或子节点的属性来定义。终结符可以具有综合属性,值由词法分析器提供。
• 继承属性分析树节点n上的非终结符的继承属性只能通过该节点或父节点或兄弟节点的属性来定义。终结符没有继承属性
sdd
• 只包含综合属性的sdd称为s属性的sdd
实验报告成绩: 指导教师审核(签名): 年 月 日
预习报告□ 实验报告□
语法制导把表达式翻译成逆波兰式
(一)实验目的
进一步掌握语法制导翻译的概念,理解中间语言,设计出错处理程序方法,掌握把表达式翻译成中间语言的算法。
(二)实验内容
1.从左到右扫描中缀表达式,经语法分析找出中缀表达式出现的错误并给出错误的具体位置和类型。一个运算符栈存放暂时不能出现的运算符,逆波兰区存放逆波兰表达式。
2.测试所编程序,给出正确和错误的结果。
(三)实验要求
1.学生课前要认真阅读实验指导,理解实验内容与相关理论知识的关系,并完成预习报告
2.用C语言或其它高级语言编写程序
3.写出实验报告
内蒙古工业大学信息工程学院
第 页 实验报告成绩: 指导教师审核(签名):
年 月 日
预习报告□ 实验报告□
语法制导把表达式翻译成逆波兰式
(一)实验目的
通过上机实习加深对语法指导翻译原理的理解,掌握运算符优先权的算法,将语法分析所识别的表达式变换成中间代码的翻译方法。
(二)实验内容
同预习报告
(三)实验要求
1.学生课前要认真阅读实验指导,理解实验内容与相关理论知识的关系,并完成预习报告
2.用C语言或其它高级语言编写程序
3.写出实验报告
(四)实验设计思路
1)表达式生成逆波兰式的算法
1、初始化△送到运算符栈。
2、扫描左括号“(”,把△送到运算符栈。
3、扫描到变量,把它送到逆波兰区。
4、扫描到运算符
( 1)栈内运算符比较
a.栈内运算符>=栈外运算符,把栈内运算符送到逆波兰区。
b.栈内运算符
( 2 ) 栈内是△把运算符入栈。
5、扫描右括号 “)”。
( 1 )栈内是运算符,把栈内运算符送到逆波兰区。
( 2 )栈内是△则△退栈,读入下一个字符。