自上而下分析 4.4.

Slides:



Advertisements
Similar presentations
组长:倪运超 小组成员:徐悦、曹吕卿、孙浩、徐圣尧.  上海的历史 上海的历史  上海的历史 上海的历史  上海的文化 —— 建筑 上海的文化 —— 建筑  上海的文化 —— 美食 上海的文化 —— 美食  香港的历史 香港的历史  香港的历史 香港的历史  香港的文化 —— 建筑 香港的文化.
Advertisements

一、 突出解析几何复习中的重点问题的通法通解 解析几何中的重点问题 一、 突出解析几何复习中的重点问题的通法通解 直线与圆锥曲线的位置关系 重点一.
必修2 第一单元 古代中国经济的基本结构和特点
3.2 农业区位因素与农业地域类型.
第十三章 中国的传统科学技术 中国古代的科技曾经长期处于世界领先地位,对人类文明的进步作出过重要贡献,并形成了富有特色的科技文化。在今天,源自中国古代科技文化的中医学仍然在现实生活中发挥着积极的作用。
人生格言: 天道酬勤 学院:自动化与电气工程学院 班级: 自师1201 姓名:刘 威.
105年桃連區適性入學宣導 桃園市十二年國民基本教育宣導團 宣講講師:龍岡國中 校長 郭玉承 時 間:105年 3 月 9 日 1.
第五单元 社会生活的变迁 第1课时 衡量变化的尺子 ——— 时间和纪年 新围初中 王济洪.
歷史建築清水國小宿舍群修復工程 施工說明會
2011年10月31日是一个令人警醒的日子,世界在10月31日迎来第70亿人口。当日凌晨,成为象征性的全球第70亿名成员之一的婴儿在菲律宾降生。 ?
第九课时 二元一次方程组 .
七(7)中队读书节 韩茜、蒋霁制作.
初级会计实务 第八章 产品成本核算 主讲人:杨菠.
字母可表示: 人名 字母可表示: 地方 字母可表示: 数 (1)阿Q和小D看《阿P的故事》, Q 、D、P各表示什么?
雄伟的金字塔.
中考阅读 复习备考交流 西安铁一中分校 向连吾.
交通事故處置 當事人責任與損害賠償 屏東縣政府警察局交通隊.
岳阳市教学竞赛课件 勾股定理 授课者 赵真金.
讲 义 大家好!根据局领导的指示,在局会计科和各业务科室的安排下,我给各位简要介绍支付中心的工作职能和集中支付的业务流程。这样使我们之间沟通更融洽,便于我们为预算单位提供更优质的服务。 下面我主要从三方面介绍集中支付业务,一是网上支付系统,二是集中支付业务流程及规定等,
中央广播电视大学开放教育 成本会计(补修)期末复习
中国人民公安大学经费管理办法(试行) 第一章总则 第四条:“一支笔” “一支笔”--仅指单位主要负责人。负责对本 单位的经费进行审核审批。
人教版义务教育课程标准实验教科书 小学数学四年级上册第七单元《数学广角》 合理安排时间 248.
定风波.
第三单元 发展社会主义民主政治.
致亲爱的同学们 天空的幸福是穿一身蓝 森林的幸福是披一身绿 阳光的幸福是如钻石般耀眼 老师的幸福是因为认识了你们 愿你们努力进取,永不言败.
第2章 LR分 析 法 LR分析法是一种自下而上进行规范归约的语法分析方法,LR指“自左向右扫描和自下而上进行归约”。LR分析法比递归下降分析法、LL(1)分析法和算符优先分析法对文法的限制要少得多,对大多数用无二义的上下文无关文法描述的语言都可以用LR分析器予以识别,而且速度快,并能准确、及时地指出输入串的任何语法错误及出错位置。LR分析法的一个主要缺点是,若用手工构造分析器则工作量相当大,因此必须求助于自动产生LR分析器的产生器。
3.3 资源的跨区域调配 ——以南水北调为例 铜山中学 李启强.
第五章 电流和电路 制作人 魏海军
第十二单元 第28讲 第28讲 古代中国的科技和文艺   知识诠释  思维发散.
上海交通大学 概率论第一、二章测验题 大学数学教研室 童品苗.
中考语文积累 永宁县教研室 步正军 2015.9.
课标教材下教研工作的 实践与思考 山东临沂市教育科学研究中心 郭允远.
小学数学知识讲座 应用题.
勾股定理 说课人:钱丹.
倒装句之其他句式.
开 学 第 一 课 六年级3班.
编译原理与技术 课程总结.
高点定位 精准发力 扎实推进优质均衡再上新台阶 ——全县初中教学工作会议讲话
! 温故知新 上下文无关文法 最左推导 最右推导 自上而下 自下而上 句柄 归约 移进-归约冲突 移进-归约分析 递归下降预测分析
Part5语法分析 授课:胡静.
第 22 课 孙中山的民主追求 1 .近代变法救国主张的失败教训: “师夷之长技以制 夷”“中体西用”、兴办洋务、变法维新等的失败,使孙中山
自上而下分析 4.4.
语言及其文法.
第四章 语法分析.
第三章 词法分析.
Part5语法分析 授课:胡静.
LL分析法 LL分析法的分析器由一张预测分析表(LL(1)分析表),一个控制程序(表驱动程序)及一分析栈组成 输入
人教版数学四年级(下) 乘法分配律 单击页面即可演示.
第五章 语法分析——自下而上分析 自上而下分析法(Top-down) 自下而上分析法(Bottom-up) 国防科技大学计算机系602教研室.
求曲线方程(3).
党员干部要争做社会主义 社会公德的表率 党员干部要争做 社会公德的表率 中共河南省委党校 周海涛.
第三章 文法和语言 本章目的为语言的语法描述寻求工具,以便: 对源程序给出精确无二义的语法描述。(严谨、简洁、易读)
编译原理 第四章 语法分析—自上而下分析 编译原理.
语法分析 本章内容 语法分析器:把词法分析生成的词法单元流翻译成语法分析树(parse tree)
第五章 自底向上分析方法 LR(0)分析法 1 LR(K)分析法 第一个L表示:相应的语法分析将按自左至右的顺序扫描输入符号串;
第四章 自顶向下语法分析方法 语法分析的主要工作:是识别由词法分析给出的单词 序列是否是给定的正确句子(程序)。
习题课 编译原理与技术 计算机科学与技术学院 李诚.
第六章 语法制导的翻译 本章内容 介绍一种语义描述方法:语法制导的翻译,介绍语法制导的翻译的实现方法。
自底向上的语法分析 4.5.
第一部分 数字电路 第4章 组合逻辑电路 主讲教师:喻红.
第 四 章 迴歸分析應注意之事項.
SLR(1)分析方法.
第四章 语法分析 南京大学计算机系 戴新宇
递归下降法 1 递归下降法语法分析原理 递归子程序方法/递归下降法 对每个非终极符按其产生式结构产生相应语法分析子程序。
美丽的旋转.
畢氏定理(百牛大祭)的故事 張美玲 製作 資料來源:探索數學的故事(凡異出版社).
 3.1.4 空间向量的正交分解及其坐标表示.
成本會計 在決策中的功能 第四課 1.
编译原理 第一章 编译程序概述 第二章 PL/0编译程序的实现 第三章 文法和语言 第四章 词法分析 第五章 自顶向下语法分析方法
102年人事預算編列說明 邁向頂尖大學辦公室製作.
Presentation transcript:

自上而下分析 4.4

复习

4.3 自上而下分析 4.3.2 LL(1)文法 对文法加什么样的限制可以保证没有回溯? 先定义两个和文法有关的函数 FIRST( ) = {a |  * a…, a  VT} 特别是, * 时,规定  FIRST( ) FOLLOW(A) = {a | S * …Aa…,aVT} 如果A是某个句型的最右符号,那么$属于FOLLOW(A)

任何两个产生式A  |  都满足下列条件: 4.3 自上而下分析 LL(1)文法 任何两个产生式A  |  都满足下列条件: FIRST( )  FIRST( ) =  若 *  ,那么FIRST()  FOLLOW(A) =  例如, 对于下面文法,面临a…时,第2步推导不 知用哪个产生式 S  A B A  a b |  a  FIRST(ab)  FOLLOW(A) B  a C C  …

任何两个产生式A  |  都满足下列条件: 4.3 自上而下分析 LL(1)文法 任何两个产生式A  |  都满足下列条件: FIRST( )  FIRST( ) =  若 *  ,那么FIRST()  FOLLOW(A) =  LL(1)文法有一些明显的性质 没有公共左因子 不是二义的 不含左递归

计算X的FIRST(X)时,不断运用以下规则,直到没有新的终结符或ε可以被加入到FIRST(X) 4.3 自上而下分析 计算X的FIRST(X)时,不断运用以下规则,直到没有新的终结符或ε可以被加入到FIRST(X) 如果X是终结符,FIRST(X)= X

计算X的FIRST(X)时,不断运用以下规则,直到没有新的终结符或ε可以被加入到FIRST(X) 4.3 自上而下分析 计算X的FIRST(X)时,不断运用以下规则,直到没有新的终结符或ε可以被加入到FIRST(X) 如果X是终结符,FIRST(X)= X 如果XY1Y2…Yk, 且a在FIRST(Yi)集合中,并且Y1 * ε, Y2 * ε, …, Yi-1 * ε,则将a插入到FIRST(X)中。

计算X的FIRST(X)时,不断运用以下规则,直到没有新的终结符或ε可以被加入到FIRST(X) 4.3 自上而下分析 计算X的FIRST(X)时,不断运用以下规则,直到没有新的终结符或ε可以被加入到FIRST(X) 如果X是终结符,FIRST(X)= X 如果XY1Y2…Yk, 且a在FIRST(Yi)集合中,并且Y1 * ε, Y2 * ε, …, Yi-1 * ε,则将a插入到FIRST(X)中。 如果X ε是一个产生式,则将ε插入到FIRST(X)中。

计算非终结符A的FOLLOW(A)时,不断运用以下规则,直到没有新的终结符可以被加入到FOLLOW(A) 4.3 自上而下分析 计算非终结符A的FOLLOW(A)时,不断运用以下规则,直到没有新的终结符可以被加入到FOLLOW(A) 将$放到FOLLOW(S)中,S是开始符,$是输入右端的结束标记

计算非终结符A的FOLLOW(A)时,不断运用以下规则,直到没有新的终结符可以被加入到FOLLOW(A) 4.3 自上而下分析 计算非终结符A的FOLLOW(A)时,不断运用以下规则,直到没有新的终结符可以被加入到FOLLOW(A) 将$放到FOLLOW(S)中,S是开始符,$是输入右端的结束标记 如果存在AαBβ,那么FIRST(β)中非ε的所有符号都在FOLLOW(B)中

计算非终结符A的FOLLOW(A)时,不断运用以下规则,直到没有新的终结符可以被加入到FOLLOW(A) 4.3 自上而下分析 计算非终结符A的FOLLOW(A)时,不断运用以下规则,直到没有新的终结符可以被加入到FOLLOW(A) 将$放到FOLLOW(S)中,S是开始符,$是输入右端的结束标记 如果存在AαBβ,那么FIRST(β)中非ε的所有符号都在FOLLOW(B)中 如果存在AαB或AαBβ,且FIRST(β)包含ε,则FOLLOW(A)中的所有符号都在FOLLOW(B)中。

4.3 自上而下分析 例 E  TE  E   + TE  |  T  FT  T    FT  |  F  (E) | id FIRST(E) = FIRST(T) = FIRST(F) = { ( , id } FIRST(E ) = {+, } FRIST(T ) = {, } FOLLOW(E) = FOLLOW(E ) = { ), $} FOLLOW(T) = FOLLOW (T ) = {+, ), $} FOLLOW(F) = {+, , ), $} * 在FRIST(T)中,+, )和$在FOLLOW (T) 中。

| array [simple] of type simple  integer | char | num dotdot num 4.3 自上而下分析 4.3.3 递归下降的预测分析 为每一个非终结符写一个分析过程 这些过程可能是递归的 例 type  simple |  id | array [simple] of type simple  integer | char | num dotdot num

4.3 自上而下分析 一个辅助过程 void match (terminal t) { if (lookahead == t) lookahead = nextToken( ); else error( ); }

4.3 自上而下分析 void type( ) { if ( (lookahead == integer) || (lookahead == char) || (lookahead == num) ) simple( ); else if ( lookahead ==  ) { match(); match(id);} else if (lookahead == array) { match(array); match( [ ); simple( ); match( ] ); match(of ); type( ); } else error( ); type  simple |  id | array [simple] of type

4.3 自上而下分析 void simple( ) { if ( lookahead == integer) match(integer); else if (lookahead == char) match(char); else if (lookahead == num) { match(num); match(dotdot); match(num); } else error( ); simple  integer | char | num dotdot num

4.3 自上而下分析 4.4.4 非递归的预测分析 a + b $ X Y Z 输入 预测分析程序 输出 栈 分析表M 以自然语言例子:我上课 请开门 做例子讲解非递归的自上而下分析

4.3 自上而下分析 4.4.4 非递归的预测分析 算法 初始时分析器的格局是: S$在栈里,其中S是开始符号并且在栈顶;w$ 在输入缓冲区 主程序

4.3 自上而下分析 4.4.4 非递归的预测分析 预测分析程序根据当前的栈顶符号X和输入符号a决定分析器的动作,它有四种可能: 如果X是非终结符,程序访问分析表M

4.3 自上而下分析 4.4.5 构造预测分析表 (1)对文法的每个产生式A   ,执行(2)和(3) (2)对FIRST()的每个终结符a, 把A   加入M[A, a] (3)如果在FIRST()中,对FOLLOW(A)的每个终结符b(包括$), 把A  加入M[A, b] (4)M中其它没有定义的条目都是error

4.3 自上而下分析 4.4.5 构造预测分析表 例: E  TE  E   + TE  |  T  FT  F  (E) | id FIRST(E) = FIRST(T) = FIRST(F) = { ( , id } FIRST(E ) = {+, } FRIST(T ) = {, } FOLLOW(E) = FOLLOW(E ) = { ), $} FOLLOW(T) = FOLLOW (T ) = {+, ), $} FOLLOW(F) = {+, , ), $}

4.3 自上而下分析 4.4.5 构造预测分析表 非终 结符 输 入 符 号 id +  . . . E E  TE  E  输 入 符 号 id +  . . . E E  TE  E  E   +TE  T T  FT  T  T    T   FT  F F  id

4.3 自上而下分析 4.4.5 构造预测分析表 多重定义的条目 例: stmt  if expr then stmt e_part | other e_part  else stmt |  other  b FOLLOW(e_part) = (else, $) M[e_part, else]包括e_part  else stmt 和 e_part  

4.3 自上而下分析 非终 结符 输 入 符 号 other b else . . . stmt stmt  other e_part 多重定义的条目 非终 结符 输 入 符 号 other b else . . . stmt stmt  other e_part e_part else stmt e_part   expr expr  b

4.3 自上而下分析 非终 结符 输 入 符 号 other b else . . . stmt stmt  other e_part 多重定义的条目 非终 结符 输 入 符 号 other b else . . . stmt stmt  other e_part e_part else stmt expr expr  b

预测分析的错误恢复

4.3 自上而下分析 4.4.6 预测分析的错误恢复 1、先对编译器的错误处理做一个概述 词法错误,如标识符、关键字或算符的拼写错 语法错误,如算术表达式的括号不配对 语义错误,如算符作用于不相容的运算对象 逻辑错误,如无穷的递归调用

4.3 自上而下分析 2、分析器对错误处理的基本目标 清楚而准确地报告错误的出现,并尽量少出现伪错误 迅速地从每个错误中恢复过来,以便诊断后面的错误 它不应该使正确程序的处理速度降低太多

4.3 自上而下分析 3、非递归预测分析在什么场合下发现错误 栈顶的终结符和下一个输入符号不匹配 a + b $ X Y Z 输入 预测分析程序 分析表M 输出 X Y Z 栈

4.3 自上而下分析 3、非递归预测分析在什么场合下发现错误 栈顶是非终结符A,输入符号是a,而M[A , a]是空白 a + b $ X 预测分析程序 分析表M 输出 X Y Z 栈

4、非递归预测分析:采用紧急方式的错误恢复 4.3 自上而下分析 4、非递归预测分析:采用紧急方式的错误恢复 发现错误时,分析器每次抛弃一个输入记号,直到输入记号属于某个指定的同步记号集合为止 5、同步 词法分析器当前提供的记号流能够构成的语法构造,正是语法分析器所期望的 不同步的例子 语法分析器期望剩余的前缀构成过程调用语句,而实际剩余的前缀形成赋值语句

4.3 自上而下分析 6、同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合

4.3 自上而下分析 6、同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合 if expr then stmt (then和分号等记号是expr的同步记号)

4.3 自上而下分析 6、同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合 把高层构造的开始符号加到低层构造的同步记号集合中

4.3 自上而下分析 6、同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合 把高层构造的开始符号加到低层构造的同步记号集合中 a = expr; if … (语句的开始符号作为表达式的同步记号,以免表达式出错又遗漏分号时忽略if语句等一大段程序)

4.3 自上而下分析 6、同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合 把高层构造的开始符号加到低层构造的同步记号集合中 把FIRST(A)的终结符加入A的同步记号集合 a = expr; , if … (语句的开始符号作为语句的同步符号,以免多出一个逗号时会把if语句忽略了)

4.3 自上而下分析 6、同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合 把高层构造的开始符号加到低层构造的同步记号集合中 把FIRST(A)的终结符加入A的同步记号集合 如果非终结符可以产生空串,若出错时栈顶是这样的非终结符,则可以使用推出空串的产生式

4.3 自上而下分析 非终 结符 输 入 符 号 id +  . . . E ETE E E+TE T TFT  T  例 栈顶为T ,面临id时出错 非终 结符 输 入 符 号 id +  . . . E ETE E E+TE T TFT  T  出错 T   T FT 

4.3 自上而下分析 非终 结符 输 入 符 号 id +  . . . E ETE E E+TE T TFT  T  输 入 符 号 id +  . . . E ETE E E+TE T TFT  T  出错, 用T   T   T FT 

4.3 自上而下分析 6、同步记号集合的选择 把FOLLOW(A)的所有终结符放入非终结符A的同步记号集合 把高层构造的开始符号加到低层构造的同步记号集合中 把FIRST(A)的终结符加入A的同步记号集合 如果非终结符可以产生空串,若出错时栈顶是这样的非终结符,则可以使用推出空串的产生式 如果终结符在栈顶而不能匹配,弹出此终结符

4.3 自上而下分析 错误恢复 例: E  TE  E   + TE  |  T  FT  T    FT  |  F  (E) | id FIRST(E) = FIRST(T) = FIRST(F) = { ( , id } FIRST(E ) = {+, } FRIST(T ) = {, } FOLLOW(E) = FOLLOW(E ) = { ), $} FOLLOW(T) = FOLLOW (T ) = {+, ), $} FOLLOW(F) = {+, , ), $}

4.3 自上而下分析 错误恢复 例: E  TE  E   + TE  |  T  FT  T    FT  |  F  (E) | id FIRST(E) = FIRST(T) = FIRST(F) = { ( , id } FIRST(E ) = {+, } FRIST(T ) = {, } FOLLOW(E) = FOLLOW(E ) = { ), $} FOLLOW(T) = FOLLOW (T ) = {+, ), $} FOLLOW(F) = {+, , ), $}

自底向上的分析 4.5

4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d

4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d abbcde(读入ab) a b

4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d abbcde aAbcde(归约) a A

4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d abbcde aAbcde(再读入bc)

4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d abbcde aAbcde aAde(归约) a b A c

4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d abbcde aAbcde aAde(再读入d) a b A d c

4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d abbcde aAbcde aAde

4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d abbcde aAbcde aAde aABe(再读入e) e a b A d c B

4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d abbcde aAbcde aAde

S rm aABe rm aAde rm aAbcde rm abbcde 4.4 自下而上分析 4.4.1 归约 例 S  aABe A  Abc | b B  d abbcde aAbcde aAde aABe S S rm aABe rm aAde rm aAbcde rm abbcde S e a b A d c B

句型的句柄是和某产生式右部匹配的子串,并且,把它归约成该产生式左部的非终结符代表了最右推导过程的逆过程的一步 4.4 自下而上分析 4.4.2 句柄 句型的句柄是和某产生式右部匹配的子串,并且,把它归约成该产生式左部的非终结符代表了最右推导过程的逆过程的一步 S  aABe A  Abc | b B  d S rm aABe rm aAde rm aAbcde rm abbcde 句柄的右边仅含终结符 如果文法二义,那么句柄可能不唯一

4.4 自下而上分析 例 句柄不唯一 E  E + E | E  E | (E ) | id

4.4 自下而上分析 例 句柄不唯一 E  E + E | E  E | (E ) | id E rm E  E rm E  E + E rm E  E + id3 rm E  id2 + id3 rm id1  id2 + id3

4.4 自下而上分析 例 句柄不唯一 E  E + E | E  E | (E ) | id E rm E  E E rm E + E rm E  E + E rm E + id3 rm E  E + id3 rm E  E + id3 rm E  id2 + id3 rm E  id2 + id3 rm id1  id2 + id3 rm id1  id2 + id3 在句型E  E + id3中,句柄不唯一

4.4 自下而上分析 4.4.3 用栈实现移进归约分析 先通过 来了解移进归约分析的工作方式 移进归约分析器在分析输入串id1  id2 + id3时的动作序列 来了解移进归约分析的工作方式

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$ $EE+id3

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$ $EE+id3

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$ $EE+id3 $EE+E

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$ $EE+id3 $EE+E 按E  E+E归约

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$ $EE+id3 $EE+E 按E  E+E归约

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$ $EE+id3 $EE+E 按E  E+E归约 按E  EE归约

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$ $EE+id3 $EE+E 按E  E+E归约 按E  EE归约

4.4 自下而上分析 栈 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 输 入 动 作 $ id1  id2 + id3$ 移进 $ id1  id2 + id3$ 按E  id归约 $E $E id2 + id3$ $Eid2 + id3$ $EE $EE+ id3$ $EE+id3 $EE+E 按E  E+E归约 按E  EE归约 接受

要想很好地使用移进归约方式,尚需解决一些问题 4.4 自下而上分析 要想很好地使用移进归约方式,尚需解决一些问题 如何决策选择移进还是归约 进行归约时,确定右句型中将要归约的子串 进行归约时,如何确定选择哪一个产生式

4.4 自下而上分析 4.4.4 移进归约分析的冲突 1、移进归约冲突 例 stmt  if expr then stmt | if expr then stmt else stmt | other 如果移进归约分析器处于格局 栈 输入 … if expr then stmt else … $

4.4 自下而上分析 2、归约归约冲突 由A(I, J)开始的语句 栈 输入 … id ( id , id )… 归约成expr还 stmt  id (parameter_list) | expr = expr parameter_list  parameter_list, parameter | parameter parameter  id expr  id (expr_list) | id expr_list  expr_list, expr | expr 由A(I, J)开始的语句 栈 输入 … id ( id , id )… 归约成expr还 是parameter ?

4.4 自下而上分析 2、归约归约冲突 stmt  id (parameter_list) | expr = expr parameter_list  parameter_list, parameter | parameter parameter  id expr  id (expr_list) | id expr_list  expr_list, expr | expr 由A(I, J)开始的语句(词法分析查符号表,区分第一个id) 栈 输入 … procid ( id , id )… 需要修改上面的文法

4.4 自下而上分析 2、归约归约冲突 stmt  procid (parameter_list) | expr = expr parameter_list  parameter_list, parameter | parameter parameter  id expr  id (expr_list) | id expr_list  expr_list, expr | expr 由A(I, J)开始的语句(词法分析查符号表,区分第一个id) 栈 输入 … procid ( id , id )…

练习 下面的二义文法描述命题演算公式,为它写一个等价的非二义文法 S->S and S | S or S| not S |ture | false | (S)

为字母表{a,b}上的下列每个语言设计一个文法 练习 为字母表{a,b}上的下列每个语言设计一个文法 每个a后面至少有一个b的所有串 a和b的个数相等的所有串

练习 构造下面LL(1)文法的分析表 D->TL T->int|real L->id R R->, id R | ε

练习 构造下面文法的LL(1)分析表 S-aBS|bAS|ε A->bAA|a B->aBB|b

练习 下面文法是否是LL(1)文法?说明理由。 S->AB|PQx A->xy B->bc P->dP|ε Q->aQ|ε