- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
川师编译原理课件6
第六章 自底向上优先分析法 6.1 概述 知识回顾 最左推导(Left-most Derive) 每次推导都施加在句型的最左边的语法变量上。——与最右归约对应 最右推导(Right-most Derive) 每次推导都施加在句型的最右边的语法变量上。——与最左归约(规范归约)对应,得规范句型 如果S αAβ且A γ,则称γ是句型αγβ的相对于变量A的短语 如果S αAβ and A ?γ,则称γ是句型αγβ的相对于A ?γ的直接(简单)短语 最左直接短语叫做句柄(Handle) 规范归约:设α为文法 G 的句子,如果: 1) α=αn?αn-1?…?α2?α1=S 2)对每个i(1≤i≤n),αi-1是将句型αi中的句柄归约后得到的句型, 则称序列 αn,...,α1为α的规范归约序列—由规范归约组成, 一个简单的归约过程 例 设文法为: S→aAcBe A→Ab|b B→d 句子abbcde的分析:abbcde ?aAbcde ? aAcde ?aAcBe ? S 语法分析树的生成再演示 a b b c d e 自底向上分析 思想 从输入串出发,反复利用产生式进行归约,如果最后能得到文法的开始符号,则输入串是句子,否则输入串有语法错误。 核心 寻找句型中的“句柄”进行归约,用不同的方法寻找句柄,就可获得不同的分析方法。 6.2 简单优先分析法 思想:按所有文法符号(包括非终结符和终结符)之间的优先关系来确定句柄。 优先关系: X≡Y:表示X和Y的优先关系相等 X≮Y:表示X比Y的优先性小 X≯Y:表示X比Y的优先性大 一、优先关系的定义 X≡Y:当且仅当G中存在规则A→...XY… 即:XY并列出现; X≮Y:当且仅当G中存在规则A→...XB...且B Y... 即:X与非终结符B并列(位于最前的Y经过至少一步归约后得到的B); X≯Y:当且仅当G中存在规则A→...BD...且B ...X和D Y…; 即:非终结符B与D并列(位于最后的X经过至少一步归约后得到B,位于最前的Y经过0步或多步归约后得到D)。 例:S→bAb A→(B|a B→Aa) 文法符号间优先关系如下: ≡: 由bA有b≡A,由Ab有A≡b,由(B有(≡B, 由Aa有A≡a,由a)有a≡); ≮: 因为 A?(B ?(Aa) ?((Ba) ?… A?(B ?(Aa) ?(aa) ?… A?a 故由bA有b≮(,b≮a ; 优先关系矩阵 二、简单优先文法的定义: (1)任意两符号间最多只有一种优先关系成立; (2)在文法中任意两产生式没有相同的右部。 三、简单优先分析法步骤: (0)、初始化:将#入栈。 (1)、将输入符号串a1a2a3...an#依次入栈,直到栈顶符号优先级高于下一个待输入符。 6.3.1 直观算符优先分析法 算符优先文法只考虑算符(广义为终结符)之间的优先关系。 例G[E]:E→E+E|E*E|i 对3+4*5#分析 3+4*5?E+4*5?E+E*5?E+E*E?E+E?E 思考:为何不将E+E归约成E? 关键:在于如何确定算符间的优先级和结合性? 直观算符优先分析法中优先级和结合性的确定方法:人为指定。 例:对文法E→E+E|E-E|E*E|E/E|E^E|(E)|i,我们可指定优先级和结合性如下: (1) 作运算对象的终结符i优先性最高; (2) ^右结合,且高于其它运算符(2^3^2), 有: ^≮^ , ^≯其它运算符, 其它运算符≮^ ; 对G[E‘]:E’→#E#E→E+E|E-E|E*E|E/E|E^E|(E)|I 有: 算符优先算法的实现 设置两个工作栈:一个是用来寄存运算符的OPTR,另一个为用来寄存操作数或结果的OPND。算法描述如下: [1]、首先置操作数栈OPND为空,将#入OPTR栈。 [2]、依次读入表达式中每个单词,若是操作数则进OPND栈,若是运算符则转[3]。 [3]、查算符优先关系表,将当前读入的运算符θ2与OPTR栈顶元素θ1进行比较, 若 θ1θ2 ,则:θ2进栈,转[2] 若 θ1=θ2 ,如θ2为#,则分析成功;否则,OPTR栈顶元素θ1出栈,并转[3]; 若θ1>θ2,则出栈OPND栈顶元素至b,又出栈其栈顶元素至a,出栈OPTR栈顶元素至t,进行运算r=a t b (t 为运算符),并将结果r存 入栈OPND后转[2]。 若θ1和θ2之间无优先关系,则报错。 例:5*(1+4
文档评论(0)