第三章 语法分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

}
第三章 语法分析
void S ( ) { if ( lookahead==′a′) { match (′a′); void T ( ) { S ( ); T′( ); }
G[S']:S→(T) | aS' S'→+S | ε T→ST' T'→,ST' | ε
void T′ ( ) { if ( lookahead==′, ′) { match (′, ′); S ( ); T′ ( ); } }
第三章 语法分析 3.6 有文法G[S]: S→aAcB|Bd A→AaB|c B→bScA|b 【解答】 (1)句型aAcbBdcc的最右推导
SaAcB
aAcbScA aAcbScc aAcbBdcc
退四步: aAcbBdcc 退三步: bBdcc 退两步: Bd,c
退一步:Bd
步。
② 对每个终结符a∈FIRST(A),把A→α 加入到 M[A,a]中,其中α 为含有首字符a的候选式或为唯一的 候选式。 ③ 若ε ∈FIRST(A),则对任何属于FOLLOW(A)的 终结符b,将A→ε 加入到M[A,b]中。把所有无定义的 M[A,a]标记上“出错”。 由此得到G[A′]的预测分析表,见表3-1。
第三章 语法分析 构造文法G[S′]的LR(0)项目集规范族如下: I0: S′→· S
S→· bASB
的语法树如图3-4的(a)、(b)所示。
S a A c B a A S c B
A a B b S c A B d b (a) c
b S c A B d (b) c
图3-4 习题3.6的语法树 (a) aAaBcbbdcc; (b) aAcbBdcc
第三章 语法分析
对树(a),直接短语有3个:AaB、b和c,而AaB为最 左直接短语(即为句柄)。对树(b),直接短语有两个: Bd和c,而Bd为最左直接短语。
( L ) L , S S ( L ) S a
第三章 语法分析 3.9 考虑文法G[S]: S→(T) | a+S | a T→T,S | S
消除文法的左递归及提取公共左因子,然后对每
个非终结符写出不带回溯的递归子程序。 【解答】 消除文法G[S]的左递归: S→(T) | a+S | a T→ST' T'→,ST' | ε 改写规则 A→Aα∣β 改写为
对B′→bB′| ε 来说,
FIRST(b B′ )∩FOLLOW(B′)={b}∩{l}=Φ , 所以文法G′[A]为所求等价的LL(1)文法。
第三章 语法分析 (2) 构造G[A′]的LL(1)分析表 ①构造FIRST集 FIRST(A)={a} FIRST(B)={d} ②构造FOLLOW集 对文法开始符号A,有FOLLOW(A)={#}。 由A′→ABl得FIRST(B)\{ε }FOLLOW(A),即FOLLOW(A)={#,d}; FIRST(A′)={a, ε } FIRST(B′)={b, ε }
a
S S b
b b
第三章 语法分析 3.3 已知文法G[S]为S→aSb|Sb|b,试证明文法G[S]为 二义文法。 【解答2】 由文法G[S]:S→aSb|Sb|b,对句子abbb存 在两种不同的最右推导:
S aSb aSbb abbb
S Sb aSbb abbb 因此,文法G[S]为二义文法。
第三章 语法分析 3.6 有文法G[S]: S→aAcB|Bd A→AaB|c B→bScA|b
【解答】 (2) 句子acabcbbdcc的最左推导如下:
SaAcB aAaBcB acaBcB
S a A c B
acabcB
acabcbScA acabcbBdcA acabcbbdcA acabcbbdcc
第三章 语法分析
G [A′]:A→aA′ A′→ABl | ε B→dB′ B′→bB′| ε
FIRST(A)={a} FRIST(A ')={a,} FIRST(B)={d} FRIST(B ')={b,}
FOLLOW(A)={#,d} FOLLOW (A ')={#,d} FOLLOW (B )={l} FOLLOW (B ')={l}
A a B b S c A c b B d c b
第三章 语法分析 3.7 对于文法G[S]: S→(L)|aS|a L→L,S|S (1) 画出句型(S,(a))的语法树; (2) 写出上述句型的所有短语、直接短语、句柄、素 短语和最左素短语。
第三章 语法分析
3.7 对于文法G[S]: S→(L)|aS|a L→L,S|S 【解答】 (1) 句型(S, (a))的语法树如图3-5所示。
③得到文法G[A ′]的预测分析表
a
A A’ A→aA′ A′→ABl A′→ε B→dB′ B′→bB′ B′→ε A′→ε
b
l
d
#
B
B’
第三章 语法分析 (3) 给出输入串aadl#的分析过程。
符号栈 #A #A′ a #A′ #lBA #lBA′ a #lBA′ #lB #lB′ d #lB′ #l # 当前输入符号 a a a a a d d d l l # 输入串 adl# adl# dl# dl# dl# l# l# l# # # 说 明 弹出栈顶符号 A 并将 A→aA′ 产生式右部反序压栈 匹配,弹出栈顶符号 a 并读出下一个输入符号 a 弹出栈顶符号 A′ A′ 并将 →ABl 产生式右部反序压栈 弹出栈顶符号 A 并将 A→aA′ 产生式右部反序压栈 匹配,弹出栈顶符号 a 并读出下一个输入符号 d 由 A′ ε 仅弹出栈顶符号 A′ → 弹出栈顶符号 B 并将 B→dB′ 产生式右部反序压栈 匹配,弹出栈顶符号 d 并读出下一个输入符号 l 由 B′ ε 仅弹出栈顶符号 B′ → 匹配,弹出栈顶符号 l 并读出下一个输入符号# 匹配,分析成功
S′( );}
else if ( lookahead==′(′) { match (′(′); T ( ); if ( lookahead==′)′) match (′)′); else error( );
void S′( ) {
}
else error( ); }
if ( lookahead==′+′) { match (′+′); S ( ); } }
第三章 语法分析 3.10 已知文法G[A]: A→aABl|a B→Bb|d
(1) 试给出与G[A]等价的LL(1)文法G[A′];
(2) 构造G[A′]的LL(1)分析表; (3) 给出输入串aadl#的分析过程。 【解答】 (1) 文法G[A]存在左递归和回溯,故其不是 LL(1)文法。要将G[A]改造为LL(1)文法,首先要消除文法
句型aAcbBdcc的短语:Bd,c, bBdcc , aAcbBdcc 句型aAcbBdcc的直接短语: Bd,c 句型aAcbBdcc的句柄: Bd
第三章 语法分析 3.6 有文法G[S]: S→aAcB|Bd A→AaB|c B→bScA|b
【解答】 (1) 分别画出对应句型aAaBcbbdcc和aAcbBdcc
SaAcB
aAcbScA aAcbScc aAcbBdcc aAcbbdcc
退六步: aAaBcbbdcc 退五步: AaB,bbdcc 退四步: AaB,bd,c
退三步: AaB,bd
退两步: AaB,b 退一步:AaB
aAaBcbbdcc
句型aAaBcbbdcc的短语:AaB,b,bd,c, bbdcc, aAaBcbbdcc 句型aAaBcbbdcc的直接短语: AaB,b,c 句型aAaBcbbdcc的句柄: AaB
由A′→ABl得FIRST(′l′)FOLLOW(B),即FOLLOW(B)={l};
由A→aA′得FOLLOW(A)FOLLOW(A′),即FOLLOW(A′)={#,d}; 由B→dB′得FOLLOW(B) FOLLOW(B′),即FOLLOW(B′)={l}。
第三章 语法分析 (2) 构造预测分析表的方法如下: ① 对文法G[A′]的每个产生式A→α 执行②、③
第三章 语法分析 3.6 有文法G[S]: S→aAcB|Bd A→AaB|c
B→bScA|b
(1) 试求句型aAaBcbbdcc和aAcbBdcc的句柄; (2) 写出句子acabcbbdcc的最左推导过程。
第三章 语法分析 3.6 有文法G[S]: S→aAcB|Bd A→AaB|c B→bScA|b 【解答】 (1)句型aAaBcbbdcc的最右推导
第三章 语法分析 3.19 试构造下述文法的SLR(1)分析表。 G[S]: S→bASB | bA A→dSa | e B→cAa | c 【解答】 首先将文法G[S]拓广为G' [S']:
G' [S']: (0) S'→S
(1) S→bASB (2) S→bA (3) A→dSa (4) A→e (5) B→cAa (6) B→c
A→βA' A'→α A' |ε
第三章 语法分析
提取公共左因子:
S→(T) | aS' S'→+S | ε
T→ST'
T'→,ST' | ε
不带回溯的递归子程序如下:
void match (token t) {
if ( lookahead==t)
lookahead=nexttoken; else error ( );
G′[A]:A→aA′
A′→ABl | ε B→dB′ B′→bB′| ε
第三章 语法分析
G′[A]:A→aA′ A′→ABl | ε B→dB′ B′→bB′| ε
LL(1)文法的判定条件: * 对A →α│β 若β , 则有FIRST(α)∩FOLLOW(A)=
对A′→ABl | ε 来说, FIRST(ABl)∩FOLLOW(A′)={a}∩{#,d}=Φ ,
S ( L ) L , S S ( L ) S a
பைடு நூலகம்
图3-5 句型(S,(a))的语法树
第三章 语法分析 3.7 对于文法G[S]: S→(L)|aS|a L→L,S|S
S
【解答】(2) 由语法树可知: 短语:S、a、(a)、S,(a)、(S,(a)); 直接短语:a、S; 句柄:S; 素短语:a
第三章 语法分析 3.4 已知文法G[S]为S→SaS|ε ,试证明文法G[S]为二义文法。
【解答1】 由文法G[S]:S→SaS|ε,句子aa的语法树如图所示。
S S a S S a S (a) S S a S S a S (b)
因此,文法G[S]为二义文法。
第三章 语法分析 3.4 已知文法G[S]为S→SaS|ε ,试证明文法G[S]为二义文法。 【解答2】 由文法G[S]:S→SaS|ε,句子aa存在两种不同的最 右推导: S SaS Sa SaSa Saa aa S SaS SaSaS SaSa Saa aa 因此,文法G[S]为二义文法。
(对句子abbb也可画出 两棵不同语法树)
第三章 语法分析 3.3 已知文法G[S]为S→aSb|Sb|b,试证明文法G[S]为 二义文法。 【解答1】 由文法G[S]:S→aSb|Sb|b,对句子abbb可 对应如图所示的两棵语法树。
S a S b
因此,文法G[S]为二义文法。
S
S
b b
第三章 语法分析 3.3 已知文法G[S]为S→aSb|Sb|b,试证明文法G[S]为二义文 法。 【解答】 由文法G[S]:S→aSb|Sb|b,对句子aabbbb可对应如 图所示的两棵语法树。 S S
a S b a S b S b b S b a S b a S b b
因此,文法G[S]为二义文法。
的左递归。
第三章 语法分析 将产生式B→Bb|d改造为 B→dB′ B′→bB′| ε
改写规则 A→Aα∣β 改写为
A→βA' A'→α A' |ε
其次,应通过提取公共左因子的方法来消除G[A]中的回 溯,即将产生式A→aABl|a改造为
A→aA′
A′→ABl | ε 最后得到改造后的文法为
相关文档
最新文档