编译原理报告四逆波兰式Word下载.docx
- 文档编号:15711119
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:12
- 大小:144.08KB
编译原理报告四逆波兰式Word下载.docx
《编译原理报告四逆波兰式Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理报告四逆波兰式Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
E.Val,E.Place,E.Type…。
F:
关于属性的属性断言或一组属性的计算规则(称为语义规则)。
断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。
属性有两类:
综合属性:
归约型属性,用于“自下而上”传递信息。
继承属性:
推导型属性,用于“自上而下”传递信息。
综合属性的例子:
非终结符E、T及F都有一个综合属性val,符号digit有一个综合属性,它的值由词法分析器提供。
与产生式L→E对应的语义规则仅仅是打印由E产生的算术表达式的值的一个过程,我们可认为这条规则定义了L的一个虚属性。
某些非终结符加上标是为了区分一个产生式中同一非终结符多次出现。
设表达式为3*5+4,则语义动作打印数值19。
3*5+4的带注释的分析树
继承属性的例子:
继承属性的自上而下定值(Realid1,id2,id3):
Realid1,id2,id3的分析树
L-属性文法:
一个属性文法称为L-属性文法,如果对于每个产生式A→X1X2…Xn,满足:
1、Xj(1≤j≤n)的继承属性仅依赖于下述属性值中的一种:
A的继承属性或产生式右部位于Xj左边的符号X1,X2,…,Xj-1的属性。
2、A的综合属性,仅依赖于下述属性值中的一种:
A的继承属性或产生式右部符号Xj(除自身外)的任意属性。
L-属性文法的翻译器通常可借助于LL分析器实现。
在L-属性文法的基础上,LL分析器可以改造为一个翻译器,在对输入串进行语法分析的同时对属性进行计算。
需要对LL分析器增加语义栈,以保存与栈中文法符号有关的继承属性值。
每当进行推导时,新的属性值就由栈中正在推导的产生式左边符号的属性值来计算。
S-属性文法:
一个属性文法称为S-属性文法,当且仅当满足如下条件:
1、所有非终结符的属性是综合属性;
2、同一产生式中相同符号的各综合属性之间无相互依赖关系;
3、如果q是某个产生式中文法符号V的继承属性,则属性q的值仅仅依赖于该产生式右部位于V左边的符号的属性。
S-属性文法的翻译器通常可借助于LR分析器实现。
在S-属性文法的基础上,LR分析器可以改造为一个翻译器,在对输入串进行语法分析的同时对属性进行计算。
语法制导翻译的基本思想:
为每个产生式配上一个语义子程序,(该子程序描述了一个产生式所对应的翻译工作。
这些工作包括:
生成中间代码,查填有关的符号表,检查和报错,修改编译程序某些工作变量的值等)。
在语法分析过程中,每当一个产生或用于匹配式进行归约时,就调用该产生式所对应的语义子程序,以完成即定的翻译任务。
基础源文法和基础目标文法:
SDTS的基础源文法(输入文法)
一个CFG:
(VT,VN,P,S),其中P={Aw|Aw,y属于R)。
SDTS的基础目标文法(输出文法)
(VN,,P’,S),其中P’={Ay|Aw,y属于R)。
SDTS的形式化定义:
SDTS是一个CFG,是一个五元组
T=(VT,VN,,R,S),其中:
1、VT是有穷的输入字母表(包含源语言中的符号);
2、VN是有穷的非终结符集;
3、是有穷的输出字母表(包含出现在输出串中的符号);
4、R是形如Aw,y的规则的有穷集合;
R中规则形式:
Aw,y
A∈VN,w∈(VT∪VN)*,y∈(VN∪)*且y中那组非终结符是w中那组非终结符的置换。
W:
规则的源成分y:
规则的翻译成分。
5、S∈VN,是文法的开始符号。
主要的中间代码有:
逆波兰、四元式、三元式、间接三元式、树。
三、实验内容
1、逆波兰式定义
将运算对象写在前面,而把运算符号写在后面。
用这种表示法表示的表达式也称做后缀式。
逆波兰式的特点在于运算对象顺序不变,运算符号位置反映运算顺序。
采用逆波兰式可以很好的表示简单算术表达式,其优点在于易于计算机处理表达式。
2、产生逆波兰式的前提
中缀算术表达式
3、逆波兰式生成的实验设计思想及算法
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:
将该字符与运算符栈顶的运算符的优先关系相比较。
如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。
倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。
(5)重复上述操作
(1)-
(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
4、逆波兰式计算的实验设计思想及算法
(1)构造一个栈,存放运算对象。
(2)读入一个用逆波兰式表示的简单算术表达式。
(3)自左至右扫描该简单算术表达式并判断该字符,如果该字符是运算对象,则将该字符入栈。
若是运算符,如果此运算符是二目运算符,则将对栈顶部的两个运算对象进行该运算,将运算结果入栈,并且将执行该运算的两个运算对象从栈顶弹出。
如果该字符是一目运算符,则对栈顶部的元素实施该运算,将该栈顶部的元素弹出,将运算结果入栈。
(4)重复上述操作直至扫描完整个简单算术表达式的逆波兰式,确定所有字符都得到正确处理,我们便可以求出该简单算术表达式的值。
程序输入/输出示例:
输出的格式如下:
(1)输入一以#结束的中缀表达式(包括+—*/()数字#):
在此位置输入符号串如(28+68)*2#
(2)逆波兰式为:
28&
68+2*
(3)逆波兰式28&
68+2*计算结果为192
备注:
(1)在生成的逆波兰式中如果两个数相连则用&
分隔,如28和68,中间用&
分隔;
(2)在此位置输入符号串为用户自行输入的符号串。
四、设计思路
模块结构:
(1)定义部分:
定义常量、变量、数据结构。
(2)初始化:
设立算符优先分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);
(3)控制部分:
从键盘输入一个表达式符号串;
(4)利用算符优先分析算法进行表达式处理:
根据算符优先分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。
(5)对生成的逆波兰式进行计算。
五、注意事项
1.表达式中允许使用运算符(+-*/)、分割符(括号)、数字,结束符#;
2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);
3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。
同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照;
六、相关代码
#include<
stdio.h>
math.h>
#define
max
100
char
ex[max];
/*存储后缀表达式*/
void
trans()
{
/*将算术表达式转化为后缀表达式*/
str[max];
/*存储原算术表达式*/
stack[max];
/*作为栈使用*/
ch;
int
sum,i,j,t,top=0;
printf("
*****************************************\n"
);
*输入一个求值的表达式,以#结束。
*\n"
******************************************\n"
算数表达式:
"
i=0;
/*获取用户输入的表达式*/
do{
i++;
scanf("
%c"
&
str[i]);
}
while(str[i]!
='
#'
&
i!
=max);
sum=i;
t=1;
i=1;
ch=str[i];
while(ch!
)
switch(ch)
case
'
('
:
/*判定为左括号*/
top++;
stack[top]=ch;
break;
)'
/*判定为右括号*/
while(stack[top]!
ex[t]=stack[top];
top--;
t++;
}
+'
/*判定为加减号*/
-'
while(top!
=0&
stack[top]!
*'
/*判定为乘除号*/
/'
while(stack[top]=='
||stack[top]=='
default:
while(ch>
0'
ch<
9'
/*判定为数字*/
ex[t]=ch;
i--;
ex[t]='
;
=0)
\n\t原来表达式:
for(j=1;
j<
sum;
j++)
str[j]);
\n\t后缀表达式:
ex);
t;
ex[j]);
compval
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 报告 波兰