- 1、本文档共83页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
属性文法 属性文法的形式定义: AG: AG=(G,V,E) G:上下文无关文法; V:属性的有穷集合;每一个属性与某一个文法符号相关联;用文法符号·属性表示 E:表示属性的断言或谓词的有穷集合(语义规则);每一个断言与文法的某个产生式相关联) 属性:综合属性(自下而上传递信息)、继承属性(自上而下传递信息) 计算表达式2+3*5 表达式2+3*5的归约过程 注意 句柄归约在先,语义动作调用在后 归约时,栈内句柄各符号的语义信息与句柄及同时出栈,整个句柄所表示的语义信息则赋给相应产生式左部非终结符号的语义变量,并让该非终结符号及语义信息同时入栈 逆波兰表示法(后缀式) 特点:运算符直接写在其运算对象之后。 不再有括号 运算对象出现的次序未变 求值过程简单,宜于用栈实现 图形表示法 无循环有向图(Directed Acyclic Graph,简称DAG) 对表达式中的每个子表达式,DAG中都有一个结点 一个内部结点代表一个操作符,它的孩子代表操作数 在一个DAG中代表公共子表达式的结点具有多个父结点 表达式a+(-b)*c的三元式 (1) (@,b,_);单目运算,运算对象2为空 (2) (*,(1),c) (3) (+,a,(2)) 三元式 X=a+b*c Y=d-b*c 三元式表 (1)(*,b,c) (2)(+,a,(1)) (3)(=,x,(2)) (4)(_,d,(1)) (5)(=,y,(4)) 四元式 (三地址代码) X=a*b+c*d的四元式序列 三地址代码 (1)(* ,a,b,T1) (1)T1=a*b (2)(*, c,d,T2) (2)T2=c*d (3)(+,T1,T2,T3) (3)T3=T1+T2 (4)(=,T3,_,X) (4)X=T3 a:=b*(-c)+b*(-c)的图表示法 抽象语法树对应的代码: T1:=-c T2:=b*T1 T3:=-c T4:=b*T3 T5:=T2+T4 a:=T5 DAG对应的代码: T1:=-c T2:=b*T1 T5:=T2+T2 a:=T5 属性翻译文法的应用 综合属性与自下而上定值 每个非终结符的属性值都是根据位于其下面那些符号的属性值来确定的,即按一种自下而上的方式来确定的。 继承属性和自上而下定值 非终结符的属性值或者根据其上层非终结符的属性来确定或者根据产生式右部其它符号的属性来确定。这种属性值是根据自上而下方式确定的。 自底向上的语法制导翻译 自底向上的语法制导翻译方法是在自底向上的语法分析过程中逐步实现语义规则的翻译方法。在实现时注意以下几点: (1)自底向上的翻译的特点,栈的操作,对产生式的要求等 (2)各种程序语句的目标结构 (3)从源结构到目标结构的变换方法(包括对产生式的改造等) 算术表达式和赋值语句的翻译 翻译步骤: (1)分析文法的特点; (2)设计一系列的语义变量、定义语义过程、语义函数; (3)设计每一条规则的语义子程序; (4)增加一个语义信息栈,构造LR分析表; (5)语法分析同时语义处理. 例: 有文法G[A]: 1.A→i:=E 2.E →E+T∣T 3.T →T*F∣F 4.F →-P 5.P →i ∣(E) 简单算术表达式的计值顺序与四元式出现的顺序相同,因此目标代码的顺序(结构)为: (1)先生成E的代码(一系列顺序执行的四元式) (2)把E的值赋给变量i(表达式的结果赋给赋值语句的左变量) 引入语义变量,语义过程和语义函数 (1)语义变量E.place:表示存放E值的变量名在符号表中的入口地址或临时变量的整数码. (2)语义函数newtemp():申请一个临时单元,存放中间结果; (3)语义过程emit(T=arg1 op arg2):产生一条四元式,并添入四元式表中; (4)语义过程lookup(i.name):审查i.name是否出现在符号表中,在:返回地址,不在:返回NULL; (5)语义函数entry(i):回送标识符i在符号表中的入口地址. 表达式的语义动作设计 1. A→i:=E{emit(entry(i)=E.place} 2. E →E1+T{E.place=newtemp(), emit(E.place)=E1.place+T.place} 3.E →T {E.place=newtemp(), emit(E.place=T.place)} 4. T →T1*F{T.place=newtemp(), emit(T.place)=T1.place*F.place} 5.
文档评论(0)