300 likes | 491 Views
文法例1. 文法 Gz:Z D Z Z D D 0 |1 | … |9 句子12的推导: Z ZD DD 1D 12 Z ZD DD D2 12. Z. Z. D. D. 2. 1. 文法例2. 文法 G=({+,*,i,( ,)},{E},E,P), 其中 P 为: E i E E + E E E * E E ( E ) 句型 i * i + i :. E. E. E. *. i. E.
E N D
文法例1 文法Gz:Z D Z Z D D 0 |1 |…|9 句子12的推导: Z ZD DD 1D 12 Z ZD DD D2 12 Z Z D D 2 1
文法例2 • 文法G=({+,*,i,( ,)},{E},E,P),其中P为: • E i • E E + E • E E * E • E ( E ) • 句型i * i + i :
E E E * i E + E E i i E E + 推导2的语法树 E E i * i i 推导1的语法树 推导1: E E + E E * E + E i * E + E i * i + E i * i + i 推导2: E E * E i * E i * E + E i * i + E i * i + i
<Stm> →if <Exp> then <Stm> else <Stm> <Stm> →if <Exp> then <Stm> <Stm> → ...... 假设有条件语句 if e1 then if e2 then s1 else s2 则可有下图所示的两棵不同的语法分析树: <Stm> <Stm> then <Exp> <Stm> else <Stm> if <Exp> then <Stm> if e1 s2 e1 <Stm> then <Exp> <Stm> else <Stm> then if <Exp> if s1 s1 s1 e2 e2 if语句的二义性
文法二义性的消除 • 二义性文法的判定是递归不可解的 • 消除二义性的方法: • 1.设置一规则,该规则可在产生二义性的情况下,指出哪一个分析树是正确的 • 2.将文法改变成一个强制正确分析树的构造格式
表达式的无二义性文法 • E T | E + T • T F | T * F • F ( E ) | i • E T • E E + T • T F • T T * F • F ( E ) • F i
If语句的无二义性文法定义 Stmt Matched_stmt | Unmatched_stmt Matched_stmt if E then Matched_stmt else Matched_stmt | other Unmatched_stmt if E then Stmt | if E then Matched_stmt else Unmatched_stmt
有关文法实用中的一些说明 • 有关文法的实用限制 •有害规则 U U •多余规则{ 不可到达的,不可终止的 } • 上下文无关文法中的规则 A
文法G[s]: • S B e • B C e • B A f • A A e • A e • C C f • C C • D f
求能推出的非终极符 • S_Lambda = {Aj | Aj PSet}; • 对pPSet:Ap X1…Xn, 如果XiS_Lambda, 0in,则 S_Lambda = S_Lambda {Ap} • 重复第二步,直至S_Lambda收敛为止
消除空产生式算法 • S_Lambda = {Aj | Aj+ }; • 删除所有的空产生式和只能导出空串的非终极符。 • 对剩余的每个产生式P:AC1C2…Cp 如果有CiS_Lambda,因为删除了所有的空 产生式,需要扩充一些产生式: AC1…Ci-1Ci+1…Cp • 重复上述过程直至不出现新的产生式为止。
语法分析方法 • 自顶向下分析方法 递归子程序法 LL分析方法 • 自底向上分析方法 优先关系法 LR分析方法
Z a B d b B c 自顶向下分析概述 • 从文法开始符出发试图推导出所给的终极符串。 • 例 G[z] : [1] Z aBd [2] B d [3] B c [4] B bB 对给定的终极符串abcd,推导过程: Z [1] aBd [4] abBd [3] abcd 自顶向下的语法分析过程【Sf,Rest,Action(D/M/S/E)】 Z # abcd # Derivation aBd # abcd # Match Bd # bcd # Derivation bBd # bcd # Match Bd # cd # Derivation cd # cd # Match d # d # Match # # Success
Z 自底向上分析概述 B B • 从终极符串出发归约(reduce)出文法的开始符。 • 例 G[z] : [1] Z aBd [2] B d [3] B c [4] B bB 对给定的终极符串abcd,归约过程: abcd[3] abBd[4] aBd[3]Z a b c d 自底向上的语法分析过程【Analysis ST,Input,Action(S/R/E/S)】 # abcd # Shift #a bcd # Shift #ab cd # Shift #abc d # Reduce[3] #abB d # Reduce[4] #aB d # Shift #aBd # Reduce[1] #Z # Success
文法G1[S]: S pA | qB A cAd | a 输入串W= pccadd。自顶向下的推导过程为: S pA pcAd pccAdd pccadd 相应的语法树为: S A p c A d c d A a
p A A c c A a 文法G2[s]: S Ap |Bq A a |cA B b |dB 输入串W=ccap。自顶向下的推导过程为: S Ap cAp ccAp ccap 相应的语法树为: S
First集的定义 • 设G=(VT,VN,S,P)是上下文无关文法, (VT VN )* First()={ aVT | *a...} (if * then {}) • 可以根据当前的输入符号是属于哪个产生式右部的首符集而决定选择相应产生式进行推导。
S a A b A S d 文法G3[S]: S aA | d A bAS | 输入串W=abd。自顶向下的推导过程为: S aA abAS abS abd 相应的语法树为:
Follow集的定义 设G=(VT,VN,S,P)是上下文无关文法,AVN,S是开始符号 • Follow(A)={ a VT | S+ ...Aa... } (if S*......A then {#} ) • 当文法中存在产生式形如:A时,如果当前的字符属于Follow(A),则用空取代A的出现。
三个集合的定义 • First() ={ a VT | * a......} ( if * then {} ) • Follow(A) = { a VT | S+ ....Aa..... } ( if S*......A then {#} ) • Predict(A→) = First() , 当First() = First()-{}Follow(A) ,当First()
计算First(X)集 对每一文法符号X计算First(X) • 若XVT,First(X)={X} • 若XVN则 First(X)={a| Xa…PSet,a VT} • 若XVN,且有产生式X,则 First(X) • 若XVN,有产生式XY1Y2…Yn,且Y1,Y2,…,Yi VN 当Y1,Y2,…,Yi-1* , 则First(Y1)-{},First(Y2)-{},… First(Yi-1)-{}, First(Yi)都包含在First(X)中。 当Yi * (i=1,2,…n), 将{}并入First(X)中。
计算First()集 若符号串=X1X2…Xn, • 当X1,X2,…Xi-1*,Xi不能* ,则 • First()=1i-1(First(Xj)-{}) First(Xi) • 若所有Xi都能*,则 • First()= 1nFirst(Xj)
计算Follow集 1:对所有AVN,令Follow(A):={ };对开始符S, 令Follow(S):={# }; 2:若有产生式A→xBy, 如果First(y) 则: Follow(B):= First(y) 否则 Follow(B):=(First(y)-{}) Follow(A) 3:重复2和3,直至对所有AVN,Follow(A)收 敛为止。
计算Predict集 • Predict(A→) = First() ,当First()不含 = First()-{ } Follow(A) , 当First()含
E T E’ • E’ + T E’ | • T F T’ • T’ * F T’ | • F id | ( E )
Predict( ETE’ ) = first(TE’) = { id , ( } Predict( E’ +TE’ ) = first(+TE’) = { + } Predict( E’ ) = follow(E’) = { ) , # } Predict( T FT’ ) = first(FT’) = { id , ( } Predict( T’ *FT’ ) = first(*FT’) = { * } Predict( T’ ) = follow(T’) = { + , ) , # } Predict( F id ) = first(id) = { id } Predict( F (E) ) = first((E)) = { ( }
3型(正则)文法与自动机 • 3型文法与产生式的形式为: A B 或 A 的文法等价。其中VT+。 • 定理:3型文法与自动机等价
3型文法到自动机的转换 • 设给定3型文法G=(VN, VT, P, Z),构造一 个自动机A=(S,,,s0,F),使得L(A)=L(G)。 • 构造过程: (1)令S = VN{K},=VT,s0= Z , F={K}. (2)对G中产生式形如: X aY 则定义 (X,a)= YP X a 则定义 (X,a)= KP 其中K是新符号。 则L(A)= L(G)
自动机到3型文法的转换 • 给定自动机A=(S,,,s0,F),构造等价的3型文法G=(VN, VT, P, Z),使得L(A)=L(G) (只有一个初始状态) • 构造过程: 设F’= {Y| YF且Y有输出边} (1) 令VN= S\F’,VT= , Z= s0 (2) 如有(X,a)=Y : 如果YF,则定义Xa 如果YF’,则定义XaY 则L(A)= L(G)
文法G[N]: N D |N D D 0 |1 | 2| …| 9 (1)写出5678和021的最左推导和最右推导,并给出 它们的语法树形式 (2)举出三个无最右推导的句型 • 文法G[S]: S uBDz B Br | w D EF E y | F x | 计算非终极符的First、Follow集,产生式的 Predict集