第三章 语法分析3精品PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
–在分析到某一步时,既可以移进,又可以归约。 上例第9)步可以移进*,也可以按产生式E→E+T 进行归约。
②归约-归约冲突
–存在两个可选的句柄可对栈顶符号进行归约。 例如上述第12)步,可以用T→F进行归约,又可 以按T→T*F进行归约。
各种分析方法中处理冲突的技术不同!
3.5 LR分析法
• 本节重点:
为了识别非终结符A,就要识别符号 串aBc。为此,构造一个DFA如图3-27所 示。
栈 输入 #S #
【例】文法G[S]: SaAcBe 待分析的句子为:abbcde
分析栈 # #a #ab #aA
输入串 abbcde#
bbcde# bcde# bcde#
A bAb B d
动作 移进 移进 归约 A b 移进
分析栈 #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
关键:如何识别可归约的符号串? 通过不同的自下而上的分析算法来解释,不同 的算法对可归约串的定义是不同的,但分析过 程都有一个共同的特点:边移进边归约。
规范归约:使用句柄来定义可归约串
算符优先:使用最左素短语来定义可归约串
自下而上语法分析主要有以下三种方法 ①简单优先分析法(规范归约)——文法按 一定原则规定文法符号的优先关系。 ②算符优先分析法(非规范归约)——规定 算符之间的优先关系。 ③ LR分析法(规范归约)—— LR(0)、 LR(1)、SLR(1)和LALR(1)。
• 句型→ 短语→ 直接短语 →句柄
注: 采用规范归约的算法,每次归约的部分就是分析为句柄 的字符串。 因此,在规范归约中,关键问题就转化为如何识别句柄?
练习பைடு நூலகம்
有文法如下: (1)E→E+T|T (2)T→T*F|F (3)F→(E)|id
分析输入串 id+id*id,给出对该句子进行“移 进-归约”语法分析的过程。
栈 # #id #F #T #E #E+ #E+id #E+F #E+T #E+T* #E+T*id #E+T*F #E+T #E
输入缓冲区 id+id*id#
+id*id# +id*id# +id*id# +id*id#
id*id# *id# *id# *id# id# # # # #
动作 移进 归约 F→id 归约 T→F 归约 E→T 移进 移进 归约F→id 归约 T→F 移进 移进 归约 F→id 归约 T→T*F 归约 E→E+T 接受
–从语法树的角度看:从语法树的树叶开始,逐 步向上归约构造分析树,直到形成根结点。是 推导的逆过程。
“移进-归约”分析法
移进-归约分析器使用了一个分析栈和一个输入缓冲区。
1、句型表示
一般形式 分析栈的内容 剩余输入串
初态: #
输入串#
终态: #S
#
… 栈(存放句型前缀)
即:分析栈内容 + 输入缓冲区内容 = # 当前句型 #
(1) E→E+T|T (2) T→T*F|F (3) F→(E)|id
E=>E+T =>E+T*F =>E+T*id =>E+F*id =>E+id*id =>T+id*id =>F+id*id =>id+id*id
E
T E
TT
F
F
F
id + id * id
移进归约分析过程中存在的问题
①移进-归约冲突
2、分析器结构
输入串 a1 a2 a3 …… #
X1
输出
X2
“移进-归约”
X3
分析程序
#
3、 “移进- 归约”分析法的栈实现
“移进–归约”分析器使用一个栈和一个存放输
入符号串w的缓冲器。分析器的初始状态为:
栈 输入 # w#
工作过程:自左至右把串w 的符号一一移进栈里, 一旦栈顶形成可归约的串(如句柄)时,就进行归 约。这种归约可能持续多次,直至栈顶不再呈现句 柄为止。然后,继续向栈里移进符号,重复这个过 程,直至最终形成如下格局:
– LR分析方法与分析过程 – LR(0)项目、项目集规范族及其构造 – closure 和 goto函数的定义 – LR(0)文法及LR(0)分析表的构造 – SLR(1)文法及SLR(1)分析表的构造
3.5.1 LR分析器的工作原理
通过两个产生式来阐述LR分析器的基本原 理。
A→aBc B→d∣ef
3.4 自下而上语法分析
本节要求 1. 掌握自下而上语法分析的基本思想和基
本概念 2. 掌握句柄的定义与判定 3. 理解规范归约的过程和LR分析过程中的
实现 4. 掌握LR语法分析的实现过程
【例】回顾:一个简单的归约过程
设文法为:
S
S→aAcBe
A→Ab|b
B→d
A
句子分析:
自下而上
abbcde aAbcde
输入串 cde# cde# de# e# e# # #
动作 归约 A Ab
移进 移进
归约 B d 移进
归约 S aAcBe 接受
小结 分析器的四种动作
1) 移进:读入下一个输入符号并把它下推进栈。 2) 归约:当栈顶符号串形成一个可归约的串(如:句柄)
时,直接进行归约,即用产生式左侧的非终结符替换栈 顶的句柄。 3) 接受:当栈底只有“#”和开始符号,而输入也已经到 达右端标志符号“#”时,识别出符号串是句子,执行 该动作,表示分析成功,是归约的一种特殊情况。 4) 出错:栈顶的内容与输入符号相悖,即当识别程序发 现输入符号串不是句子时,进行出错处理。 注意:决定移进和归约的依据是什么? 栈顶是否出现了可归约的符号串。
规范归约相关概念复习
• 有文法G,开始符号为S, 如果有S*=>xβy,则xβy是
文法G的句型,x,y是任意的符号串。
• 如果有S=*>xAy, 且有A+=>β,则β是句型xβy相对于
非终结符A的短语。
• 如果有S*=>xAy, 且有A→β,则β是句型xβy相对于
A→β的直接短语。 • 位于一个句型最左边的直接短语称为句柄。
构造语法
树的过程 A
B
aAcde
aAcBe S 对应的是最右推导
abbcde
注意:每次归约的是句柄
3.4.1 自下而上语法分析的原理
• 实现思想
–从输入符号串开始,从左到右进行扫描,将输 入符号逐个移入一个栈中,边移入边分析,一 旦栈顶符号串形成某个产生式的右部时,就用 该产生式的左部非终结符代替,称为归约。重 复这一过程,直到归约到栈中只剩下文法的开 始符号时,则分析成功,称为“移进-归约”方 法。
②归约-归约冲突
–存在两个可选的句柄可对栈顶符号进行归约。 例如上述第12)步,可以用T→F进行归约,又可 以按T→T*F进行归约。
各种分析方法中处理冲突的技术不同!
3.5 LR分析法
• 本节重点:
为了识别非终结符A,就要识别符号 串aBc。为此,构造一个DFA如图3-27所 示。
栈 输入 #S #
【例】文法G[S]: SaAcBe 待分析的句子为:abbcde
分析栈 # #a #ab #aA
输入串 abbcde#
bbcde# bcde# bcde#
A bAb B d
动作 移进 移进 归约 A b 移进
分析栈 #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
关键:如何识别可归约的符号串? 通过不同的自下而上的分析算法来解释,不同 的算法对可归约串的定义是不同的,但分析过 程都有一个共同的特点:边移进边归约。
规范归约:使用句柄来定义可归约串
算符优先:使用最左素短语来定义可归约串
自下而上语法分析主要有以下三种方法 ①简单优先分析法(规范归约)——文法按 一定原则规定文法符号的优先关系。 ②算符优先分析法(非规范归约)——规定 算符之间的优先关系。 ③ LR分析法(规范归约)—— LR(0)、 LR(1)、SLR(1)和LALR(1)。
• 句型→ 短语→ 直接短语 →句柄
注: 采用规范归约的算法,每次归约的部分就是分析为句柄 的字符串。 因此,在规范归约中,关键问题就转化为如何识别句柄?
练习பைடு நூலகம்
有文法如下: (1)E→E+T|T (2)T→T*F|F (3)F→(E)|id
分析输入串 id+id*id,给出对该句子进行“移 进-归约”语法分析的过程。
栈 # #id #F #T #E #E+ #E+id #E+F #E+T #E+T* #E+T*id #E+T*F #E+T #E
输入缓冲区 id+id*id#
+id*id# +id*id# +id*id# +id*id#
id*id# *id# *id# *id# id# # # # #
动作 移进 归约 F→id 归约 T→F 归约 E→T 移进 移进 归约F→id 归约 T→F 移进 移进 归约 F→id 归约 T→T*F 归约 E→E+T 接受
–从语法树的角度看:从语法树的树叶开始,逐 步向上归约构造分析树,直到形成根结点。是 推导的逆过程。
“移进-归约”分析法
移进-归约分析器使用了一个分析栈和一个输入缓冲区。
1、句型表示
一般形式 分析栈的内容 剩余输入串
初态: #
输入串#
终态: #S
#
… 栈(存放句型前缀)
即:分析栈内容 + 输入缓冲区内容 = # 当前句型 #
(1) E→E+T|T (2) T→T*F|F (3) F→(E)|id
E=>E+T =>E+T*F =>E+T*id =>E+F*id =>E+id*id =>T+id*id =>F+id*id =>id+id*id
E
T E
TT
F
F
F
id + id * id
移进归约分析过程中存在的问题
①移进-归约冲突
2、分析器结构
输入串 a1 a2 a3 …… #
X1
输出
X2
“移进-归约”
X3
分析程序
#
3、 “移进- 归约”分析法的栈实现
“移进–归约”分析器使用一个栈和一个存放输
入符号串w的缓冲器。分析器的初始状态为:
栈 输入 # w#
工作过程:自左至右把串w 的符号一一移进栈里, 一旦栈顶形成可归约的串(如句柄)时,就进行归 约。这种归约可能持续多次,直至栈顶不再呈现句 柄为止。然后,继续向栈里移进符号,重复这个过 程,直至最终形成如下格局:
– LR分析方法与分析过程 – LR(0)项目、项目集规范族及其构造 – closure 和 goto函数的定义 – LR(0)文法及LR(0)分析表的构造 – SLR(1)文法及SLR(1)分析表的构造
3.5.1 LR分析器的工作原理
通过两个产生式来阐述LR分析器的基本原 理。
A→aBc B→d∣ef
3.4 自下而上语法分析
本节要求 1. 掌握自下而上语法分析的基本思想和基
本概念 2. 掌握句柄的定义与判定 3. 理解规范归约的过程和LR分析过程中的
实现 4. 掌握LR语法分析的实现过程
【例】回顾:一个简单的归约过程
设文法为:
S
S→aAcBe
A→Ab|b
B→d
A
句子分析:
自下而上
abbcde aAbcde
输入串 cde# cde# de# e# e# # #
动作 归约 A Ab
移进 移进
归约 B d 移进
归约 S aAcBe 接受
小结 分析器的四种动作
1) 移进:读入下一个输入符号并把它下推进栈。 2) 归约:当栈顶符号串形成一个可归约的串(如:句柄)
时,直接进行归约,即用产生式左侧的非终结符替换栈 顶的句柄。 3) 接受:当栈底只有“#”和开始符号,而输入也已经到 达右端标志符号“#”时,识别出符号串是句子,执行 该动作,表示分析成功,是归约的一种特殊情况。 4) 出错:栈顶的内容与输入符号相悖,即当识别程序发 现输入符号串不是句子时,进行出错处理。 注意:决定移进和归约的依据是什么? 栈顶是否出现了可归约的符号串。
规范归约相关概念复习
• 有文法G,开始符号为S, 如果有S*=>xβy,则xβy是
文法G的句型,x,y是任意的符号串。
• 如果有S=*>xAy, 且有A+=>β,则β是句型xβy相对于
非终结符A的短语。
• 如果有S*=>xAy, 且有A→β,则β是句型xβy相对于
A→β的直接短语。 • 位于一个句型最左边的直接短语称为句柄。
构造语法
树的过程 A
B
aAcde
aAcBe S 对应的是最右推导
abbcde
注意:每次归约的是句柄
3.4.1 自下而上语法分析的原理
• 实现思想
–从输入符号串开始,从左到右进行扫描,将输 入符号逐个移入一个栈中,边移入边分析,一 旦栈顶符号串形成某个产生式的右部时,就用 该产生式的左部非终结符代替,称为归约。重 复这一过程,直到归约到栈中只剩下文法的开 始符号时,则分析成功,称为“移进-归约”方 法。