1、1,第四章 语法分析,2,本章内容,上下文无关文法 自顶向下分析和自底向上分析 LL文法和LR文法 Yacc,4.1 语法分析器的作用,4,4.2 上下文无关文法,RE的局限性 正规式用于定义一些简单的语言,能表示给定结构的固定次数的重复或者没有指定次数的重复。 例:a(ba)5, a(ba)* 正规式不能用于描述配对或嵌套的结构,例: 配对括号串的集合 wcw | w是a和b符号串,5,例如,包含递归结构的条件语句不能用正规表达式说明,可以用产生式表示:stmt if expr then stmt else stmt,6,4.2.1上下文无关文法的定义,上下文无关文法是四元组(VT , VN
2、 , S, P) VT : 终结符集合 VN : 非终结符集合 S : 开始符号 P :产生式集合,产生式形式为:A ,AVN, (VNVT )*,7,例4.2 定义算术表达式的文法,expr expr op expr expr (expr) expr expr expr id op + | - | * | / | ,8,4.2.2 符号的使用约定,我们一般用大写字母表示非终结符,小写字母表示终结符, Terminals: a, b, c, +, -, punc, 0, 1, 9, Black strings: id, if Non Terminals: A, B, C, S, italic
3、strings 文法符号: X, Y, Z 终结符号串: u, v, z in VT* 文法符号串: , in (VT VN)*,9,符号的使用约定,Alternatives of production rules: A 1; A 2; ; A k; A 1 | 2 | | k First NT on LHS of 1st production rule is designated as start symbol !,10,E E A E | ( E ) | -E | id A + | - | * | / | ,例4.2的文法改写为:,11,4.2.3 推导,把产生式看成重写规则,用产生式右部
4、的串来代替左部的非终结符。 例: E E + E | E * E | (E ) | E | id E E (E) (E + E) (id + E) (id + id)(id + id)是文法的句子。,12,推导的定义,定义:设有文法G = ( VT, VN, S, P),称串A直接推导出,如果A P,且, (VTVN)*,并记作A 。 直接归约到A。 如果存在一个直接推导序列:0 1 . n (n0), 则称0推导出n,记作0n(推导长度为n)。,13,推导,表示一步推导(直接推导)表示零步或多步推导对任意串如果表示一步或多步推导,14,句型、句子、语言,对开始符号为S的文法G,wL(G),当
5、且仅当 称w为G的句子。 对开始符号为S的文法G,如果 ,则称为G的句型。 句子是不含非终结符的句型。 仅含终结符号的句型是一个句子。 语言L(G)是由文法G产生的所有句子的集合:若文法G1和文法G2所产生的语言相同,即L(G1) = L(G2),则称文法G1和文法G2等价。,15,S aSb aaSbb a3Sb3 an-1Sbn-1 anbn 显然,L(G) = anbn n1 。,例:已知文法G = ( a, b, S, S, P ), 其中 P:S aSb ab,16,最左推导,最左推导:推导过程中任何一步推导都是对中的最左非终结符进行替换。如果是最左推导,可以记为如果 ,则称是文法的
6、左句型。,17,最右推导,类似的,可以定义最右推导:推导过程中任何一步推导 都是对中的最右非终结符进行替换。 最右推导也称作规范推导。,18,归约(reduce),定义:设和均为句型,若*,则称可以归约为。 规范(最右)推导的逆过程,称为规范归约。 语法分析的核心问题就是,对于一个终结符号串x,设法从S推导出x,或者反过来,设法将x归约为S。,19,4.2.4 分析树和推导,分析树是推导的图形表示。,20,-(id+id)的分析树,21,例4.5 从最左推导构造的分析树,22,句型与分析树的关系,设串是文法G的句型,则至少存在一棵分析树,它的叶子从左至右排列恰好就是。 注意,分析树的形状与推导
7、顺序无关,而与在推导时,所选择的对句型中的非终结符号进行替换的产生式有关。 每棵分析树都有与之对应的唯一的最左推导和最右推导。 但是,每个句子不一定只有唯一的分析树。,23,4.2.5 二义性,二义性的一些例子 I saw a man in the hill with a telescope. 球拍卖完了。 父在子先亡。,24,文法句子id * id + id有两个不同的最左推导:,E E * E E 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,25,
8、二义性用分析树表示比较直观,E E * E E 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,26,文法的二义性,如果一个文法的句子存在两棵分析树,那么,该句子是二义性的。 如果一个文法包含二义性的句子,则说这个文法是二义性文法;否则说该文法是无二义性文法。 文法的二义性源于这样的事实,在一个句型中,存在一个非终结符号A,对于它有两条产生式可用于替换,但A的这些推导最终都产生相同的句型。,27,文法的二义性,二义性是文法的性质。程序设计语言是无二义的。(
9、自然语言本质是二义的,在一定语境下没有二义)文法的二义性的消除:改写文法,28,4.2.6 验证文法产生的语言,例4.7 G : S (S) S | L(G) = 配对的括号串的集合 按推导步数进行归纳:推出的是配对括号串 归纳基础: S 归纳假设:少于n步的推导都产生配对的括号串 归纳步骤:n步的最左推导如下:S (S )S * (x) S * (x) y,29,按串长进行归纳:配对括号串可由S推出 归纳基础: S 归纳假设:长度小于2n的都可以从S推导出来 归纳步骤:考虑长度为2n(n 1)的w = (x) yS (S )S * (x) S * (x) y,30,4.2.7 正规式和上下文
10、无关文法,正规语言(RL)是上下文无关语言(CFL)的真子集,正规表达式所描述的语言可以用上下文无关文法描述。 将NFA转换为等价的CFG。,31,将正规表达式(a|b)*ab用CFG表示,正规式 (a|b)*ab 文法 A0 a A0 | b A0 | a A1 A1 b A2 A2 ,32,a,构造规则,Each State i has non-terminal Ai If then Ai a Aj If then Ai Aj If i is an accepting state, Ai If i is a starting state, Ai is the start symbol,33
11、,正规文法,若文法G = (VT, VN, S, P)中的每一个产生式形如: A aB 或 A a其中A, BVN, aVT ,则称G为右线性文法。 若文法G=(VT, VN, S, P)中的每一个产生式形如: A Ba 或 A a则称G为左线性文法。 右线性文法和左线性文法都称为3型文法(正规文法)。,34,4.3 文法的编写,文法的优点 文法给出了精确的,易于理解的语法说明 自动产生高效的分析器 可以给语言定义出层次结构 以文法为基础的语言的实现便于语言的修改 文法的问题 文法只能描述编程语言的大部分语法,35,4.3.1 为什么要用正规式定义词法?,为什么不用CFG定义词法 词法规则非常
12、简单,不必用上下文无关文法。 对于词法记号,正规表达式描述简洁且易于理解。 从正规表达式构造出的词法分析器效率高。 把词法分析从语法分析中分离出来的理由 简化设计 编译器的效率会改进 编译器的可移植性加强 便于编译器前端的模块划分,36,4.3.2 消除二义性,stmt if expr then stmt| if expr then stmt else stmt| other,37,Form 1:,Form 2:,句型if E1 then if E2 then S1 else S2的分析树,38,改写为无二义的文法 (else与最近的then匹配),stmt matched _stmt | u
13、nmatched_stmtmatched_stmtif expr then matched_stmt else matched_stmt | otherunmatched_stmt if expr then stmt| if expr then matched_stmt else unmatched_stmt,39,4.3.3 消除左递归,文法左递归 A+Aa 直接左递归 AAa |b 串的特点 ba . . . a 消除直接左递归A b A A a A | ,40,例: 算术表达文法 E E + T | T ( T + T . . . + T )T T * F | F ( F * F . .
14、 . * F )F ( E ) | id消除左递归后文法E TEE +TE | T FT T *FT | F ( E ) | id,41,非直接左递归S Aa | bA Sd | 先变换成直接左递归S Aa | bA Aad | bd | 再消除左递归S Aa | bA bd A | A A adA | ,42,间接左递归的消除,S Acc A BbbB Saa 将 B 代入,得到:A Sababb 将 A 代入,得到:S Sabcabcbcc 再消除直接左递归:S abcSbcScSS abcS,43,Algorithm4.1 消除左递归,Input: Grammar G with no c
15、ycles or -productions Output: An equivalent grammar with no left recursion Arrange the non-terminals in some order A1,A2,An for i := 1 to n do beginfor j := 1 to i 1 do beginreplace each production of the form Ai Ajby the productions Ai 1 | 2 | | k where Aj 1|2|k are all current Aj productions;endel
16、iminate the immediate left recursion among Ai productionsend,44,例4.9 Apply the algorithm to: S Aa | b A Ac | Sd | ,i = 1: For A1 there is no left recursion,i = 2: A2 A1d becomes A2 A2ad | bd,Now, whats left: A1 A2a | b A2 A2 c | A2 ad | bd | ,remove A2 left recursion :,A1 A2a | b A2 bdA3 | A3 A3 cA3
17、 | adA3,45,4.3.4 提左因子,不确定选择哪个规则来替换非终结符,例如: stmt if expr then stmt else stmt| if expr then stmt 改写产生式。,46,改写有左因子的文法,对于所有形如 A 1 | 2| | n | 提左因子改写为A A| A 1 | 2 | n,47,悬空else的文法,stmt if expr then stmt else stmt | if expr then stmt| other 提取左因子,得到:stmt if expr then stmt optional_else_part| otheroptional_
18、else_part else stmt| ,48,4.3.5 非上下文无关的语言结构,L1 = wcw | w属于(a | b)* 检查标识符的声明应先于其引用的抽象 L2 = anbmcndm | n 0, m 0 检查形参个数和实参个数应该相同的抽象 L3 = anbncn | n 0 打字机打印下划线字符的抽象,49,注意:一些类似的语言却是CFG。,L1= wcwR | w(a|b)* S aSa | bSb | c L2 = anbmcmdn | n 1, m 1 S aSd | aAdA bAc | bc L2 = anbncmdm | n 1,m 1 S ABA aAb | ab
19、B cBd | cd,50,L3 =anbn | n 1 S aSb | ab L3是不能用正规式描述的语言的一个范例 若存在接受L3的DFA D,状态数为k个。设D读完, a, aa, , ak 分别到达状态s0, s1, , sk 至少有两个状态相同,例如是si和sj,则ajbi属于L3,51,L3anbncn| n 1是上下文有关文法,S aSBC S aBC CB BCaB ab bB bb bC bccC cc,anbncn的推导过程如下: S * a n-1S (BC) n1+ an(BC)n + anBnCn+ a nbB n1C n+ a nbnC n + anbncC n-1
20、+ a nbncn,52,形式语言鸟瞰,Chomsky在1956创立了形式语言学,并将形式语言的文法分为四类:文法 G = (VT, VN, S, P) 0型文法(短语结构文法, PSG) , , (VN VT)*, | 1 1型文法(上下文有关文法, CSG) | |,但S 可以例外 2型文法(上下文无关文法, CFG) A ,AVN , (VN VT)* 3型文法(正规文法, RG) A aB或A a,A, BVN , a VT,53,形式语言鸟瞰,上述文法产生的语言分别称为 递归可枚举语言 上下文有关语言 上下文无关语言 正规语言,54,文法的类型,55,习题,P120 4.2.1 4.2.2 3) 4.2.3 (尽可能完成各小题) P125 4.3.1,