1 / 294

第三章 语法分析

记 号. 词 法 分析器. 分析器. 前端的 其余部分. 中间表示. 分析树. 源程序. 取下一个记号. 符号表. 第三章 语法分析. 本章内容 上下文无关文法 自上而下 分析和自下而上分析 围绕分析器的自动生成展开. 3.1 上下文无关文法. 3.1.1 上下文无关文法的定义 正规式能定义一些简单的语言 , 能表示给定结构的固定次数的重复或者没有指定次数的重复 例: a ( ba ) 5 , a ( ba )* 正规式不能用于描述配对或嵌套的结构 例 1 : 配对括号串的集合

toki
Download Presentation

第三章 语法分析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 记 号 词 法 分析器 分析器 前端的 其余部分 中间表示 分析树 源程序 取下一个记号 符号表 第三章 语法分析 • 本章内容 • 上下文无关文法 • 自上而下分析和自下而上分析 • 围绕分析器的自动生成展开

  2. 3.1 上下文无关文法 3.1.1 上下文无关文法的定义 • 正规式能定义一些简单的语言,能表示给定结构的固定次数的重复或者没有指定次数的重复 例:a (ba)5, a (ba)* • 正规式不能用于描述配对或嵌套的结构 例1:配对括号串的集合 例2:{wcw | w是a和b的串}

  3. 3.1 上下文无关文法 • 上下文无关文法是四元组(VT , VN , S, P) VT: 终结符集合 VN: 非终结符集合 S : 开始符号,非终结符中的一个 P: 产生式集合, 产生式形式 : A  • 例 ( {id, +, , , (, )}, {expr, op}, expr, P ) exprexpropexpr expr  (expr) expr expr expr id op  + op 

  4. 3.1 上下文无关文法 • 简化表示 exprexpropexpr |(expr) | expr | id op  + |  • 简化表示 E E A E | (E ) | E | id A  + | 

  5. 3.1 上下文无关文法 3.1.2推导 • 把产生式看成重写规则,把符号串中的非终结符用其产生式右部的串来代替 • 例 E E + E | EE | (E ) | E | id E E (E) (E + E) (id + E)  (id + id) • 概念 • 上下文无关语言、等价的文法、句型 • 记号 S *、 S + w

  6. 3.1 上下文无关文法 • 例 E E + E | EE | (E ) | E | id • 最左推导 E  lmE  lm(E)  lm(E+ E)  lm(id + E) lm (id + id) • 最右推导(规范推导) E  rmE  rm(E)  rm(E + E)  rm(E + id) rm (id + id)

  7. 3.1 上下文无关文法 3.1.3 分析树 • 例 E E + E | EE | (E ) | E | id E E  ( ) E E E + id id

  8. 3.1 上下文无关文法 3.1.4 二义性 E E EEE + E  id  E EE +E  id E + E  id E + E  id  id + E  id  id + E  id  id + id  id  id + id 两个不同的最左推导

  9. E E E E E E * + E E E E + * id id id id id id 3.1 上下文无关文法 3.1.4 二义性 E E EEE + E  id  E EE +E  id E + E  id E + E  id  id + E  id  id + E  id  id + id  id  id + id 两棵不同的语法树

  10. 3.2语言和文法 • 文法的优点 • 文法给出了精确的,易于理解的语法说明 • 自动产生高效的分析器 • 可以给语言定义出层次结构 • 以文法为基础的语言的实现便于语言的修改 • 文法的问题 • 文法只能描述编程语言的大部分语法,不能描述语言中上下文有关的语法特征

  11. a b 开始 a 1 0 b 2 3.2语言和文法 3.2.1正规式和上下文无关文法的比较 • 正规式 (a|b)*ab • 文法 A0aA0 | b A0 | aA1 A1bA2 A2

  12. 3.2语言和文法 3.2.2 分离词法分析器理由 • 为什么要用正规式定义词法 • 词法规则非常简单,不必用上下文无关文法 • 对于词法记号,正规式描述简洁且易于理解 • 从正规式构造出的词法分析器效率高

  13. 3.2语言和文法 • 从软件工程角度看,词法分析和语法分析的分离有如下好处 • 简化设计 • 编译器的效率会改进 • 编译器的可移植性加强 • 便于编译器前端的模块划分

  14. 3.2语言和文法 • 能否把词法分析并入到语法分析中,直接从字符流进行语法分析 • 若把词法分析和语法分析合在一起,则必须将语言的注解和空白的规则反映在文法中,文法将大大复杂 • 注解和空白由自己来处理的分析器,比注解和空格已由词法分析器删除的分析器要复杂得多

  15. 3.2语言和文法 3.2.3验证文法产生的语言 G : S (S) S |  L(G) = 配对的括号串的集合

  16. 3.2语言和文法 3.2.3验证文法产生的语言 G : S (S) S |  L(G) = 配对的括号串的集合 • 按推导步数进行归纳:推出的是配对括号串 • 归纳基础: S  • 归纳假设:少于n步的推导都产生配对的括号串 • 归纳步骤:n步的最左推导如下: S  (S)S * (x) S * (x) y

  17. 3.2语言和文法 3.2.3验证文法产生的语言 G : S (S) S |  L(G) = 配对的括号串的集合 • 按串长进行归纳:配对括号串可由S推出 • 归纳基础: S  • 归纳假设:长度小于2n的都可以从S推导出来 • 归纳步骤:考虑长度为2n(n 1)的w = (x) y S  (S)S * (x) S * (x) y

  18. 3.2语言和文法 3.2.4 适当的表达式文法 • 用一种层次观点看待表达式 id  id  (id+id) + id  id + id

  19. 3.2语言和文法 3.2.4 适当的表达式文法 • 用一种层次观点看待表达式 id  id  (id+id) + id  id + id idid(id+id) • 文法 exprexpr + term | term termtermfactor | factor factor id | (expr)

  20. expr expr expr term term + term factor term factor term * * term factor factor id * id factor factor id id id id 3.2语言和文法 exprexpr + term | term termtermfactor | factor factor id | (expr) id  id  id 分析树 id + id  id 分析树

  21. 3.2语言和文法 3.2.5 消除二义性 stmt if expr then stmt | if expr then stmt else stmt | other • 句型:if expr then if expr then stmtelse stmt • 两个最左推导: stmt  if expr then stmt  if expr then if expr then stmt else stmt stmt  if expr then stmt else stmt  if expr then if expr then stmt else stmt

  22. 3.2语言和文法 • 无二义的文法 stmtmatched _stmt | unmatched_stmt matched_stmt if expr then matched_stmt else matched_stmt | other unmatched_stmt if expr then stmt | if expr then matched_stmt else unmatched_stmt

  23. 3.2语言和文法 3.2.6 消除左递归 • 文法左递归 A+Aa • 直接左递归 AAa |b • 串的特点 ba . . . a • 消除直接左递归 A b A Aa A | 

  24. 3.2语言和文法 • 例算术表达文法 EE + T | T ( T + T . . . + T ) TTF | F ( FF . . . F ) F ( E ) | id 消除左递归后文法 ETE  E + TE|  TFT  T F T |  F ( E ) | id

  25. 3.2语言和文法 • 非直接左递归 SAa | b ASd |  • 先变换成直接左递归 S Aa | b AAad | bd |  • 再消除左递归 S  Aa | b A bd A| A A adA| 

  26. 3.2语言和文法 3.2.7提左因子 • 有左因子的文法 A1 | 2 • 提左因子 A  A A1 | 2

  27. 3.2语言和文法 • 例悬空else的文法 stmt if expr then stmt else stmt | if expr then stmt | other 提左因子 stmt if expr then stmtoptional_else_part | other optional_else_part  else stmt | 

  28. 3.2语言和文法 3.2.8非上下文无关的语言构造 • L1 = {wcw | w属于(a | b)*} • 标识符的声明应先于其引用的抽象 • L2 = {anbmcndm | n 0, m 0} • 形参个数和实参个数应该相同的抽象 • L3 = {anbncn | n 0} • 早先排版描述的一个现象的抽象 begin:5个字母键,5个回退键,5个下划线键

  29. 3.2语言和文法 • L1= {wcwR | w(a|b)*} S  aSa | bSb | c • L2 = {anbmcmdn | n 1, m 1} S  aSd | aAd A  bAc | bc • L2 = {anbncmdm | n  1,m  1} S  AB A  aAb | ab B  cBd | cd

  30. 标记为aj i的路径 … 标记为ai的路径 标记为bi的路径 s0 … … si f 3.2语言和文法 • L3={anbn | n 1} S  aSb | ab • L3是不能用正规式描述的语言的一个范例 • 若存在接受L3 的DFA D,状态数为k个 • 设D读完,a, aa,…, ak分别到达状态s0, s1,…, sk • 至少有两个状态相同,例如是si和sj,则ajbi属于L3

  31. 3.2语言和文法 3.2.9形式语言鸟瞰 • 文法 G = (VT, VN, S, P) • 0型文法:  , ,   (VN VT)*, | |  1

  32. 3.2语言和文法 3.2.9形式语言鸟瞰 • 文法 G = (VT, VN, S, P) • 0型文法:  , ,   (VN VT)*, | |  1 • 短语文法

  33. 3.2语言和文法 3.2.9形式语言鸟瞰 • 文法 G = (VT, VN, S, P) • 0型文法:  , ,   (VN VT)*, | |  1 • 1型文法:| |  | |,但S  可以例外 • 短语文法

  34. 3.2语言和文法 3.2.9形式语言鸟瞰 • 文法 G = (VT, VN, S, P) • 0型文法:  , ,   (VN VT)*, | |  1 • 1型文法:| |  | |,但S  可以例外 • 短语文法、上下文有关文法

  35. 3.2语言和文法 3.2.9形式语言鸟瞰 • 文法 G = (VT, VN, S, P) • 0型文法:  , ,   (VN VT)*, | |  1 • 1型文法:| |  | |,但S  可以例外 • 2型文法:A  ,AVN ,   (VN ∪VT)* • 短语文法、上下文有关文法

  36. 3.2语言和文法 3.2.9形式语言鸟瞰 • 文法 G = (VT, VN, S, P) • 0型文法:  , ,   (VN VT)*, | |  1 • 1型文法:| |  | |,但S  可以例外 • 2型文法:A  ,AVN ,   (VN ∪VT)* • 短语文法、上下文有关文法、上下文无关文法

  37. 3.2语言和文法 3.2.9形式语言鸟瞰 • 文法 G = (VT, VN, S, P) • 0型文法:  , ,   (VN VT)*, | |  1 • 1型文法:| |  | |,但S  可以例外 • 2型文法:A  ,AVN ,   (VN ∪VT)* • 3型文法:A  aB或A  a,A, BVN , a VT • 短语文法、上下文有关文法、上下文无关文法

  38. 3.2语言和文法 3.2.9形式语言鸟瞰 • 文法 G = (VT, VN, S, P) • 0型文法:  , ,   (VN VT)*, | |  1 • 1型文法:| |  | |,但S  可以例外 • 2型文法:A  ,AVN ,   (VN ∪VT)* • 3型文法:A  aB或A  a,A, BVN , a VT • 短语文法、上下文有关文法、上下文无关文法、正规文法

  39. 3.2语言和文法 • 例 L3={anbncn| n  1}的上下文有关文法 S aSBCS aBCCBBC aB abbB bb bC bc cC cc anbncn的推导过程如下: S * an-1S(BC)n1 用S aSBC n-1次 S + an(BC)n用S aBC 1次 S + anBnCn 用CBBC交换相邻的CB S + anbBn1Cn 用aBab 1次 S + anbnCn用bB bb n-1次 S + anbncCn-1 用bC bc 1次 S + anbncn 用cCcc n-1次

  40. S S S a a a b b C C C b c d c 3.3自上而下分析 3.3.1 自上而下分析的一般方法 • 例 文法 S aCb C cd | c 为输入串w = acb建立分析树 不能处理左递归

  41. E E E + + + T T T … … … 3.3自上而下分析 • 不能处理左递归的例子 算术表达文法 EE + T | T TTF | F F ( E ) | id E

  42. S S S a a a b b C C C b c d c 3.3自上而下分析 3.3.1 自上而下分析的一般方法 • 例 文法 S aCb C cd | c 为输入串w = acb建立分析树 不能处理左递归、复杂的回溯技术

  43. S S S a a a b b C C C b c d c 3.3自上而下分析 3.3.1 自上而下分析的一般方法 • 例 文法 S aCb C cd | c 为输入串w = acb建立分析树 不能处理左递归、复杂的回溯技术、回溯导致语义工作推倒重来

  44. S S S a a a b b C C C b c d c 3.3自上而下分析 3.3.1 自上而下分析的一般方法 • 例 文法 S aCb C cd | c 为输入串w = acb建立分析树 不能处理左递归、复杂的回溯技术、回溯导致语义工作推倒重来、难以报告出错的确切位置

  45. S S S a a a b b C C C b c d c 3.3自上而下分析 3.3.1 自上而下分析的一般方法 • 例 文法 S aCb C cd | c 为输入串w = acb建立分析树 不能处理左递归、复杂的回溯技术、回溯导致语义工作推倒重来、难以报告出错的确切位置、效率低

  46. 3.3自上而下分析 3.3.2 LL(1)文法 • 对文法加什么样的限制可以保证没有回溯? • 先定义两个和文法有关的函数 • FIRST() = {a | * a…, a VT} 特别是,* 时,规定FIRST() 对A的任何两个不同选择i和j,希望有 FIRST(i )  FIRST(j ) =  若FIRST(i ) 或 FIRST(j )含,还需增加条件

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

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

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

  50. 3.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) = {+, , ), $}

More Related