语法制导翻译
- 格式:ppt
- 大小:689.04 KB
- 文档页数:25


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 )栈内是△则△退栈,读入下一个字符。
作业5 – 语法制导翻译
1. 已知程序的文法G[P]如下:
P D
D D; D| id: T | proc id; D; S
(1) 请写一个语法制导定义,输出程序中一共声明了多少个id。
产生式 语义规则
P D Print(D.c)
D D1; D2 D.c= D1.c+ D2.c
D id: T D.c=1
D proc id; D1; S D.c= D1.c+ 1
(2) 请写一个翻译模式,输出程序中每变量id的嵌套深度。
P{D.d=1} D
D { D1.d=D.d} D1; { D2.d=D.d}D2
D id: T {print(D.d)}
D proc id; { D1.d=D.d+1} D1; S
2.有表示二进制无符号数的文法G[S]:
S → L . L | L
L →L B | B
B →0 | 1
请构造一个翻译模式,将二进制表示的数转换为十进制数。
S’→S {print(S.val)}
S → L1. L2 {S.val = L1.val + L2.val / L2.w}
S→ L {S.val=L.val}
L →L1 B {L.val = L1.val * 2 + B.val; L.w=L1.w * 2}
L→B {L.val = B.val; L.w=2}
B →0 {B.val =0}
B→1 {B.val =1}