07语义分析和中间代码的产生

07语义分析和中间代码的产生

ID:5892546

大小:443.50 KB

页数:98页

时间:2017-11-16

07语义分析和中间代码的产生_第1页
07语义分析和中间代码的产生_第2页
07语义分析和中间代码的产生_第3页
07语义分析和中间代码的产生_第4页
07语义分析和中间代码的产生_第5页
资源描述:

《07语义分析和中间代码的产生》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、语义分析和中间代码的产生编译技术之七主讲鲁斌在词法分析和语法分析之后,编译程序要进行静态语义检查和翻译静态语义检查通常包括:类型检查控制流检查一致性检查相关名字检查翻译为中间语言的好处:便于进行与机器无关的代码优化使编译程序改变目标机更容易使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰21中间语言掌握几种中间语言的基本结构逆波兰表示图表示法(DAG和抽象语法树)三地址代码(四元式、三元式、间接三元式)31.1后缀式后缀式表示法又称逆波兰表示法,把运算量(操作数)写在前面,把算符写在后面(后缀)一个表达式的后缀式可以如下定义:如果E是一个变量或常量,则E的后缀

2、式是E自身如果E是E1opE2形式的表达式,这里op是任何二元操作符,则E的后缀式为E1’E2’op,这里E1’和E2’分别为E1和E2的后缀式如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式4例如:a+b可以写成(a+b)*c可以写成abc+*代表ab+cd+*代表把表达式翻译成后缀式的语义规则描述:产生式语义规则EE1opE2E(E1)EidE.code:=E1.code

3、

4、E1.code

5、

6、opE.code:=E1.codeE.code:=idab+ab+c*a*(b+c)(a+b)*(c+d)51.2图表示法图表示法包括DAG与抽象语法树无循环有向图(DirectedA

7、cyclicGraph,简称DAG)与抽象语法树一样,对于表达式中的每个子表达式,DAG图中都有一个结点。一个内部结点代表一个操作符,它的孩子代表操作数两者不同的是,在DAG图中代表公共子表达式的结点具有多个父结点,而在一棵抽象语法树中公共子表达式被表示为重复的子树6例如:赋值语句a:=b*-c+b*-c的抽象语法树和DAG图如下:assign+a*uminusbc*uminusbc抽象语法树assign+a*uminusbcDAG7产生赋值语句抽象语法树的属性文法产生式语义规则S→id:=ES.nptr:=mknode('assign',mkleaf(id,id.place),E.nptr)

8、E→E1+E2E.nptr:=mknode('+',E1.nptr,E2.nptr)E→E1*E2E.nptr:=mknode('*',E1.nptr,E2.nptr)E→-E1E.nptr:=mknode('uminus',E1.nptr)E→(E1)E.nptr:=E1.nptrE→idE.nptr:=mkleaf(id,id.place)8赋值语句:a:=b*-c+b*-c后缀式:abcuminus*bcuminus*+assignassign+*uminusidaidcidb*uminusidcidbidbidcunimus1*02idbidcunimus5*46+37idaassig

9、n98...01234567891091.3三地址代码三地址代码是由下面一般形式的语句构成的序列:X:=yopz其中,x、y、z为名字、常数或编译时产生的临时变量;op代表运算符号如定点运算符、浮点运算符、逻辑运算符等。每个语句的右边只能有一个运算符10例如:赋值语句a:=b*-c+b*-c的抽象语法树如下:assign+a*uminusbc*uminusbc抽象语法树三地址代码t1:=-ct2:=b*t1t3:=-ct4:=b*t3t5:=t2+t4a:=t511例如:赋值语句a:=b*-c+b*-c的DAG图如下:assign+a*uminusbcDAG三地址代码t1:=-ct2:=b*t

10、1t5:=t2+t2a:=t512三地址语句的种类(1)赋值语句x:=yopz,op为二目算术算符或逻辑算符;(2)赋值语句x:=opy,op为一目算符,如一目减uminus、逻辑非not、移位算符及转换算符;(3)复制语句x:=y;(4)无条件转移语句gotoL;(5)条件转移语句ifxrelopygotoL,关系运算符号relop(<,=,>=等等);13(6)过程调用语句paramx和callp,n;过程返回语句returny;(7)索引赋值x:=y[i]及x[i]:=y;(8)地址和指针赋值x:=&y,x:=*y和*x:=y。14产生赋值语句三地址代码的属性文法产生式语义规则S→id:

11、=ES.code:=E.code‖gen(id.place':='E.place)E→E1+E2E.place:=newtemp;E.code:=E1.code‖E2.code‖gen(E.place':='E1.place'+'E2.place)E→E1*E2E.place:=newtemp;E.code:=E1.code‖E2.code‖gen(E.place':='E1.place'*'E2

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。