第三章 语法分析 自顶向下语法分析思想 语法分析方法的分类: 自顶向下语法分析方法(Top-Down) ,亦称面向目标的分析方法;

Slides:



Advertisements
Similar presentations
2011年会计初级职称全国统考 初级会计实务 教案 主讲:高峰 2010年12月.
Advertisements

第四章:长期股权投资 长期股权投资效果 1、控制:50%以上 有权决定对方财务和经营.
人力资源管理资格考证(四级) 总体情况说明.
财经法规与会计职业道德 Company Logo.
關於「中華民國國民健保卡」 (健保 IC 卡內容)
第一课 爱在屋檐下 第一节 我知我.
第五单元 社会生活的变迁 第1课时 衡量变化的尺子 ——— 时间和纪年 新围初中 王济洪.
服务热线: 菏泽教师招聘考试统考Q群: 菏泽教师统考教育基础模拟题解析.
2011年广西高考政治质量分析 广西师范大学附属外国语学校 蒋 楠.
知识回顾 1、通过仔细观察酒精灯的火焰,你可以发现火焰可以分为 、 、 。 外焰 内焰 焰心 外焰 2、温度最高的是 。
2016届高三期初调研 分析 徐国民
第二章 股票.
交通事故處置 當事人責任與損害賠償 屏東縣政府警察局交通隊.
洋流(大规模的海水运动).
岳阳市教学竞赛课件 勾股定理 授课者 赵真金.
会计学 第九章 财务会计报告.
编 译 原 理 指导教师:杨建国 二零一零年三月.
了解太平天国运动的主要史实,认识农民起义在民主革命时期的作用与局限性。
第2讲 从汉至元政治制度的演变 和明清君主专制的加强 基础落实 一、从汉至元政治制度的演变 1.中央集权的发展
第五章 电流和电路 制作人 魏海军
第一章 民法概述 一、民法概念 P4 二、民法的调整对象 三、民法的分类 四、民法的渊源 P10 五、民法的适用范围(效力范围)
第七章 财务报告 财务报告 第一节 财务报告概述 一、财务报告及其目标: 1、概念:财务报告是指企业对外提供的反映企业某一特定日期
第16课 抗日战争.
发展心理学 王 荣 山.
出入口Y27 往塔城街口/中興醫院 出入口Y25 往延平北路一段/中興醫院 出入口Y23往延平北路一段 出入口Y21往延平北路一段
高考第二轮复习课件 东莞中学松山湖学校 丁文韬
第十课 创新意识与社会进步 1.辩证的否定观:辩证否定、形而上学的否定观
勾股定理 说课人:钱丹.
政治第二轮专题复习专题七 辩 证 法.
编译原理与技术 --文法和分析 2018/9/17 《编译原理与技术》讲义.
Part5语法分析 授课:胡静.
狂賀!妝品系同學美容乙級通過 妝品系三甲 學號 姓名 AB 陳柔諺 AB 陳思妤 AB 張蔡婷安
第七章 财务报告 主讲老师:王琼 上周知识回顾.
经济法基础习题课 第7讲 主讲老师:赵钢.
自上而下分析 4.4.
自上而下分析 4.4.
语法分析在编译程序中的逻辑位置 语 法 分 析 表 处 理 源 程 序 词 法 分 析 语 义 分 析 中 间 代 码 生 成 中 间 代
Part5语法分析 授课:胡静.
LL(1)分析方法 LL(1)是LL(k)的特例,其中的k则表示向前看k个符号. LL(1)方法和递归下降法属于同一级别的自顶向下分析法.
LL分析法 LL分析法的分析器由一张预测分析表(LL(1)分析表),一个控制程序(表驱动程序)及一分析栈组成 输入
人教版数学四年级(下) 乘法分配律 单击页面即可演示.
李元金 计算机与信息工程学院 第9讲 语法分析—自上而下分析(1) 李元金 计算机与信息工程学院
初级职称前导课 第一章 资产 主讲老师:海伦老师(兰老师).
第六章 静电场 第3课时 电场能的性质.
第三章 文法和语言 本章目的为语言的语法描述寻求工具,以便: 对源程序给出精确无二义的语法描述。(严谨、简洁、易读)
八年级上册 第十三章 轴对称 等腰三角形及其性质 湖北省通山县教育局教研室 袁观六.
编译原理 第四章 语法分析—自上而下分析 编译原理.
第3,4次课 一个简单的语法制导翻译器 2.3~2.5.
《2015考试说明》新增考点:“江苏省地级市名称”简析
乘法公式 (1) 乘法分配律 (2) 和的平方公式 (3) 差的平方公式 (4) 平方差公式.
文法等价变换 文法的等价 对文法G1和G2,若有:L(G1)=L(G2),则称文法G1和G2等价, 记作:G1=G2. 文法等价变换
变 阻 器 常州市北郊初级中学 陆 俊.
第四章 自顶向下语法分析方法 语法分析的主要工作:是识别由词法分析给出的单词 序列是否是给定的正确句子(程序)。
经济法基础习题课 主讲:赵钢.
2.3.1 直线与平面垂直的判定 金 雪 花 数学组.
電子白板百萬小學堂 本活動建議搭配電子白板 學生最多可分成2~6組(請按組別按鈕) 老師可以視時間多少,來進行活動 每一組要回答十個問題。
会计基础 第二章 会计要素与会计等式 刘颖
1.3 运动快慢的描述----速度 育 才 中 学.
考什么 1.参考系和质点 2.位移、速度和加速度 3.匀变速直线运动公式的应用 4.匀变速直线运动图像的应用 5.匀变速直线运动的实验研究.
编译原理与技术 -- 自顶向下分析 2019/5/5 《编译原理与技术》讲义.
1.2 子集、补集、全集习题课.
苏教版五年级数学上册 用含有字母的式子表示 简单的数量关系 周冬妮 1.
9.1.2不等式的性质 周村实验中学 许伟伟.
2.2矩阵的代数运算.
分配律 ~ 觀念 15 × 15 × + 15 × 乘法公式 蘇德宙 老師 台灣數位學習科技股份有限公司
第四章 语法分析 南京大学计算机系 戴新宇
递归下降法 1 递归下降法语法分析原理 递归子程序方法/递归下降法 对每个非终极符按其产生式结构产生相应语法分析子程序。
美丽的旋转.
编译原理实践 6.程序设计语言PL/0.
编译原理 第一章 编译程序概述 第二章 PL/0编译程序的实现 第三章 文法和语言 第四章 词法分析 第五章 自顶向下语法分析方法
Presentation transcript:

第三章 语法分析 自顶向下语法分析思想 语法分析方法的分类: 自顶向下语法分析方法(Top-Down) ,亦称面向目标的分析方法;   三个重要的集合:First集、Follow集、Predict集 自底向上语法分析方法(Bottom-Up) 。

1. 自顶向下语法分析概述 自顶向下语法分析方法,亦称面向目标的分析方法。 思想:从文法的开始符出发企图用最左推导推导出与输入的单词串完全相匹配的句子。若输入的单词串是给定文法的句子,则必能推出,反之必然以推导失败而终止。 自顶向下语法分析方法分为: 1、非确定的自顶向下语法分析方法; 2、确定的自顶向下语法分析方法:实现方法简单、直观,便于手工构造和自动生成,是目前常用的语法分析方法。 递归下降方法; LL(1)方法。

S a x x a a 2 非确定的自顶向下语法分析方法(带回溯过程的自顶向下语法分析方法) 已知G[S]: S→Ay | BAy A→aA│a B→xB│x 输入串为xay是否正确。 S  Ay  aAy  ay a  BAy  xBAy  xxBAy BAy  xxAy x  xAy xaAy  xaaAy x  xaay a  xay a

非确定的自顶向下语法分析方法是一种穷举的试探方法,由于回溯导致语法推导重来、不能确切报告错误位置、效率低、代价高,因此,尽管这种方法适合于更广泛的文法,但也只是一种理论上可行的方法,极少使用。 确定的自顶向下语法可以根据当前输入自动确定选择相应的产生式进行推导,其难点为: 当非终极符有多个候选式时,如何确定地选择某个候选式。 如何记录推导的进程。

3 确定的自顶向下分析思想 例 G[S] : S  Ap | Bq A  a | cA B  b | dB 3 确定的自顶向下分析思想 例 G[S] : S  Ap | Bq A  a | cA B  b | dB 对给定的终极符串ccap,推导过程: S A p 选择产生式方法:根据当前输入符号与当前非终极符的哪个候选式可以推导出的首字符相匹配,就选哪个候选式。 c A c A 从左到右扫描输入串:c c a p S  Ap  cAp  ccAp  ccap a 5

第一个重要集:First集 定义:设G=(VT,VN,S,P)是上下文无关文法, (VTVN)*,则字符串的First集: { a VT | * a ...}  (if  * then {} else  ) “首符”集——符号串经过推导能够得到的所有可能的首个终极符集合 作用:可以根据当前的输入符号是属于哪个产生式右部的首符集而决定选择相应产生式进行推导。 6

自顶向下分析思想(续)文法不包含空产生式 A First()={a1,a2,…,an} A First()={b1,b2,…,bm} A First()={c1,c2,…,cm} 只要A的所有产生式的First集不相交,即 First()  First()  First()= 对非终结符A的替换可惟一地确定候选式,就是当前字符属于哪个候选式右部的First集,就选哪个产生式的右部替代左部非终结符。 7

自顶向下分析思想(续)文法包含空产生式 例 G[S] : S  aA | d A  bAS |  对给定的终极符串abd,推导过程: 例3 文法特点:  文法含有空产生式。 选择产生式方法:是否运用某个非终结符A的空产生式,要看紧跟该非终结符右边可能出现的终结符集是否与当前输入符号相匹配。 S a A 从左到右扫描输入串:a b d b A S S  aA  abAS  abS  abd  d 8

第二个重要集合: Follow集 定义:设G=(VT,VN,S,P)是上下文无关文法, AVN,S是开始符号,则非终极符A的Follow集: Follow(A) = { a VT | S+ ...Aa...}  (if S*... A then {#} else  ) 其中:#表示输入串的结束标志。 “跟随符”集——非终极符A在推导过程中可能跟随在其后面的终极符集合 作用:当文法中存在产生式形如:A+ 时,如果当前的字符属于Follow(A),则可以用空串取代A的出现。 9

A First()={b1,b2,…,bm, } Follow(A)={c1,c2,…,ck} A First()={a1,a2,…,an} A First()={b1,b2,…,bm, } Follow(A)={c1,c2,…,ck} 只有当A的多条产生式不能同时推导出空,则当满足下式时,对非终结符A的替换仍可惟一地确定候选。 First()  ((First()- )  Follow(A))= 10

第三个重要集合:Predict集 定义:设G=(VT,VN,S,P)是上下文无关文法,AVN,AP,则规则A的Predict集: Predict(A) First() 当First() = (First()-{})Follow(A)当First() “预测符”集——产生式A能推导出的第一个终极符集合 11

4 自顶向下方法使用条件 产生式A被选择的条件是: 当前的输入符属于predict(A)。 至多一个候选式被选择的条件是: 4 自顶向下方法使用条件 产生式A被选择的条件是: 当前的输入符属于predict(A)。 至多一个候选式被选择的条件是: 若kj predict(Ak)predict(Aj)= 满足该条件的文法称为LL(1)文法,也是自顶向下分析技术的文法。 第1个L:自顶向下分析是从左向右扫描输入串 第2个L:分析过程使用最左推导 1:只需向右看输入符的一个字符便可决定选择哪个产生式进行推导。 12

First() ,当First()不含 = (First()-{})  Follow(A) ,当First()含 5 产生式Predict集的计算方法 Predict(A→ ) First() ,当First()不含 = (First()-{})  Follow(A) ,当First()含 方法关键:计算产生式A→ 的Predict集主要是计算右部串的First集和左部非终极符A的Follow集。

5.1 对每一文法符号X计算First(X)集 若X VT : First(X)={X} 若X VN : 对X的每一个产生式进行如下处理: Step1.形如: X  , 则:   First(X) Step2.形如:X a… , a VT则 : a  First(X) Step3.对形如: XY1Y2…Yi-1Yi…Yn 若:Y1,Y2, … ,Yi VN且Y1,Y2, … ,Yi-1*  则: First(Y1)- {} , First(Y2)- {}, … , First(Yi-1)- {}, First(Yi)都包含在First(X)中。 若: Yi VN且Yi *  (i=1,2,…n), 则: First(Y1) , First(Y2), … , First(Yn) 都包含在First(X)中。

计算符号串的First()集算法要点 若符号串=X1X2…Xn, 当X1,X2, … , Xi-1*,Xi 不能 * , 则: First()=1i-1(First(Xj)-{})  First(Xi) 若所有Xi 都能*, First()= 1n First(Xj)

文法符号 First集 例: E  T E’ E’  + T E’ |  T  F T’ T’  * F T’ |  F  id | ( E ) E { id, ( } E’ {  ,+ } T { id, ( } {  } T’ ,* { id, ( } F

例: E  T E’ E’  + T E’ |  T  F T’ T’  * F T’ |  F  id | ( E ) 文法符号 First集 E E’ T T’ F { id, ( } { +, } { *,  } 符号串 First集 { id, ( } T E’ F T’ { id, ( } E’ T’ T { +, *, id, ( } E’ T’ { +, *,  }

例 First集 # void <C程序>  <预处理> <函数> # ,需要考察<预处理>的Follow集 void <C程序>  <预处理> <函数> <预处理>  #include <文件名串> |  <函数>  void id (<参数表>) { <语句组> } … …

例 S  Bd B  AC A  aX |  C  cY |  A的Follow集需要考察A后部C的First集: 当First(A后部C) : Follow(A):=(First(C)-{})Follow(B)

5.2计算非终极符Follow(A)集算法要点 1: 对所有AVN 且 A非开始符 : 令Follow(A):={ }; 对开始符 S : 令Follow(S):={ # }; 2:若有产生式BxA, 如果First() 则: Follow(A):= First() 否则 Follow(A):=(First()-{})Follow(B) 3: 重复2,直至对所有AVN,Follow(A)收 敛为止。

例: E  T E’ E’  + T E’ |  T  F T’ T’  * F T’ F  id | ( E ) 文法符号 First集 E E’ T T’ F { id, ( } { +, } { *,  } Follow集 { # , ) } { # , ) } { + , # , ) } } { + , # , ) { , + , # , ) } *

确定的自顶向下语法分析 求取每个产生式A→ 的Predict集,根据当前输入字符匹配哪个候选式的Predict集来选择产生式。 Predict(A→ ) = First() ,当First()不含 (First()-{})  Follow(A) ,当First()含 至多有一个产生式被选择的条件是: predict(Aβk)predict(Aβj)=,当kj 该条件就是不带回溯的自顶向下语法分析方法(确定的自顶向下语法分析方法)的条件。 满足该条件的文法称为LL(1)文法,递归下降子程序文法。

Predict( ETE’ ) = first(TE’) = { id , ( } 文法符号 First集 Follow集 E { id, ( } { ), # } E’ { +, } T { +, ), # } T’ { *,  } F { *, +, ), # } 例: E  T E’ E’  + T E’ |  T  F T’ T’  * F T’ |  F  id | ( E ) Predict( ETE’ ) = first(TE’) = { id , ( } Predict( E’ +TE’ ) = first(+TE’) = { + } Predict( E’  ) = follow(E’) = { ) , # } Predict( T FT’ ) = first(FT’) = { id , ( } Predict(E’ +TE’ ) ∩ Predict(E’  ) = 

Predict(T’ *FT’ ) ∩ Predict(T’   ) =  文法符号 First集 Follow集 E { id, ( } { ), # } E’ { +, } T { +, ), # } T’ { *,  } F { *, +, ), # } 例: E  T E’ E’  + T E’ |  T  F T’ T’  * F T’ |  F  id | ( E ) Predict( T’ *FT’ ) = first(*FT’) = { * } Predict( T’   ) = follow(T’) = { + , ) , # } Predict( F id ) = first(id) = { id } Predict( F (E) ) = first((E)) = { ( } Predict(T’ *FT’ ) ∩ Predict(T’   ) =  Predict(F id ) ∩ Predict(F (E) ) =   所以是LL(1)文法

Predict(A  a) ∩ Predict(A  ) =  Predict(B b) ∩ Predict(B  ) =  文法符号 First集 Follow集 例: S  ABc A  a A   B b B   # S { a, b,c } { } Predict(A  a) ∩ Predict(A  ) =  Predict(B b) ∩ Predict(B  ) =   所以是LL(1)文法 A {  ,a } { b,c } B  ,b { } { c } Predict(S  ABc) = first(ABc) = { a,b,c } Predict(A  a) = first(a) = { a } Predict(A  ) = follow(A) = {b,c } Predict(B b) = first(b) = {b} Predict(B  ) = follow(B) = {c }

可能使用此产生式规则的当前token集合 对象 含义 特征 First集 长度可能不为1的符号串β 可能出现在β首字符位置的符号集合 可包括ℇ Follow集 一个非终极符B 可能出现在B后面的终极符集合 不包括ℇ可包括# Predict集 一条产生式规则 A->α 可能使用此产生式规则的当前token集合 26

6 非LL(1)文法 含有左公因子的文法为非LL(1)文法 由于文法的左递归。 例:有如下文法G[S]: S aSb S  aS

再验证所以非终结符的所有候选式是否满足LL(1)条件,即: 非LL(1)文法到LL(1)文法的等价转换 消除左公共前缀 消除直接左递归 和间接左递归 再验证所以非终结符的所有候选式是否满足LL(1)条件,即: 若kj predict(Ak)predict(Aj)= 注意1:即使文法没有公共前缀和左递归也并不意味着文法一定是LL(1)文法,有时还需要其它的转换方法。 注意2:通常程序设计语言的文法大都可以转换成LL(1)文法,但已经证明,非LL(1)文法是存在的,即有些文法是无法变换成LL(1)文法的。

例:设有如下文法: Stm  Label : UnLabeledStm Stm  id UnLabeledStm  id:=Exp Label  id Stm  id : UnLabeledStm Stm  id UnLabeledStm  id:=Exp Stm  id Stm’ Stm’  : UnLabeledStm |  UnLabeledStm  id:=Exp

1、计算每个非终极符的First集、Follow集. 2、计算每个产生式的Predict集合. 3、判断该文法是否为LL(1)文法? 练习题: 已知文法G[S]: SAB | bC A  | b B   | aD C  AD | b D  aS | c 1、计算每个非终极符的First集、Follow集. 2、计算每个产生式的Predict集合. 3、判断该文法是否为LL(1)文法?

文法 符号 First集 step1 step2 step3 S A B C D {b } {b,  } {a, } {b} SAB | bC A  | b B   | aD C  AD | b D  aS | c 文法 符号 First集 step1 step2 step3 S A B C D {b } {b,  } {a, } {b} {a, c } {b, a, } {b, } {a, } {b,a,c} {a, c } { } {}

文法符号 First集 S { a, b,  } A { b, } B { a, } C { a, b, c } D { a, c } SAB | bC A  | b B   | aD C  AD | b D  aS | c 文法符号 First集 S { a, b,  } A { b, } B { a, } C { a, b, c } D { a, c } First(AB ) = { a,b,  } First( bC ) = { b } First() = { } First( b ) = { b } First() = { } First(aD ) = {a } First(AD ) = {a,b,c } First(b) = { b }

文法符号 First集 Follow集 S { a, b,  } { # } A { b, } { a, c, # } B SAB | bC A  | b B   | aD C  AD | b D  aS | c 文法符号 First集 Follow集 S { a, b,  } { # } A { b, } { a, c, # } B { a, } {# } C { a, b, c } D { a, c }

Predict(SAB ) = (First(AB)-{})  Follow(S) )= { a,b,# } First(AB ) = { a,b,  } Predict(SAB ) = (First(AB)-{})  Follow(S) )= { a,b,# } First( bC ) = { b } Predict(S bC ) = First( bC )= { b } First( ) = { } Predict( A  ) = Follow(A) = { a, c , # } First(b ) = { b } Predict( Ab ) = First( b )= { b } First( ) = { } Predict( B  ) = Follow(B) = { # } First( aD ) = {a } Predict( B  aD ) = First( aD )= {a } First(AD ) = {a,b,c } Predict( C AD ) = First( AD )= {a,b,c } First(b) = { b } Predict( C b) = First( b )= { b } 文法符号 First集 Follow集 S { a, b,  } { # } A { b, } { a, c, # } B { a, } {# } C { a, b, c } D { a, c }

由于:Predict(SAB ) ∩Predict(S bC ) = { b } Predict(SAB ) = { a,b,# } Predict(S bC ) = { b } Predict( A  ) = { a, c , # } Predict( Ab ) = { b } Predict( B  ) = { # } Predict( B  aD ) = {a } Predict( C AD ) = {a,b,c } Predict( C b) = { b } 由于:Predict(SAB ) ∩Predict(S bC ) = { b } Predict( C AD ) ∩Predict( C b) = { b } 所以该文法不是LL(1)文法. 文法符号 First集 Follow集 S { a, b,  } { # } A { b, } { a, c, # } B { a, } {# } C { a, b, c } D { a, c }