FIRST、FOLLOW集求法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
,
FIRST (T ) FIRST ( F ) ?( FIRST (T ')) 后面要不要并 FIRST (T ') ,我们还
是不知道,要看 FIRST ( F ) 有没有 ,好,我们看到 FIRST ( F ) 终于可以求 了,依照规则 FIRST (F ) {(} {id} {(, id} ,于是我们将这个递归过程向 上推导 FIRST (T ) FIRST ( F ) {(, id} ,向上推导,
FOLLOW (T ') FOLLOW (T ) {$, ,)}
(10) 求 FOLLOW ( F ) 我们在(3) 、 (4)中找到 F 于是加入 FIRST (T ') 中所有非 字符,而且我们 看到 FIRST (T ') {*, } 中有 ,于是加入 FOLLOW (T ) ,则,结束。
FIRST ( E) FIRST (T ) FIRST ( F ) {id ,(}
(2) 求 FIRST ( E ') 这个比较简单,我们可以直接得出 FIRST ( E ') {, } , 可不能丢哦。 (3) 求 FIRST (T ) 参照(1) (4) 求 FIRST (T ') 这个比较简单,我们可以直接得出 FIRST (T ') {*, } , 可不能丢哦。 (5) 求 FIRST ( F ) 参照(1) (6) 求 FOLLOW ( E ) 我们注意到 E 是我们文法的起始符号,于是加入 $ 。接着,我们找到了表达式 (5)中推导式右边包含 E 于是,加入 ) ,没了,最后结果是
FIRST、FOLLOW
copyright @ hujianfei
集求法
注:终结符:不能单独出现在推导式左边的符号。终结符不能再推导。 非终结符:不是终结符的都是非终结符。
FIRST 集:比如求 FIRST (U ) ,在推导式的左边找到它,然后在推导式的右边锁定
其所有产生式,作如下: 1、 直接收取:对形如 U a... 的产生式( a 是终结符),把 a 加入到 FIRST (U ) 中, 即 {a} FIRST (U ) 特别的,对产生式 U ,那么将 加入到 FIRST (U ) 中。即
{ } FIRST (U )
2、 反复传送:对形如 U X1 X 2 X 3 X 4 ... X n 的产生式( X1 X 2 X 3 X 4 ... 是非终结符) , 应该把 FIRST ( X1 ) 加入到 FIRST (U ) 中,若 FIRST (U ) 中没有 ,则结束此过 程;若 FIRST (U ) 中有 ,则抛弃 继续将 FIRST ( X 2 ) 加入到 FIRST (U ) 中, 若 FIRST ( X 2 ) 中有 ,则抛弃 继续将 FIRST ( X 3 ) 加入到 FIRST (U ) 中,依次 类推…若 FIRST ( X n ) 中也包含了 ,那么,最后再将 加入到 FIRST (U ) 中,其 他情况则不加。 即 FIRST ( X1 ) FIRST ( X 2 )... FIRST (U ) 或 FIRST ( X1 ) FIRST (U ) 等等(这 样表达不太准确) 。
FOLLOW ( E ) {$,)} (注:加入的意思就是放入 FOLLOW ( E ) 集合中)
(7) 求 FOLLOW ( E ') 、 (2)中找到 E ' 不是文法起始符号,不用加入 $ 。接着,我们在表达式(1) 了 E ' ,对于(1) ,加入 FOLLOW ( E ) 的所有字符,对于(2) ,加入
我们看到
FIRST ( A) { } FIRST ( B) { }
于是,根据我们的规则,要向下看,
FIRST (a) {a} FIRST (b) {b}
没有 于是结束,并且在 FIRST ( AaBb) 中不加入 。 那么我们的结果就是, FIRST (S ) FIRST ( AaBb) FIRST ( BbBa) {a, b} 。
FIRST (C) FOLLOW (S ) FOLLOW ( B) ( FIRST (C ) 包含 )
3、 反复传送:形如 S ...B 的组合(即 B 结尾) ,那么将 FOLLOW ( S ) 中的所有符 号加入到 FOLLOW ( B) 中。即 FOLLOW (S ) FOLLOW ( B)
FOLLOW ( B) 。即 {a} FOLLOW ( B)
2、 反复传送:形如 S ...B 的组合(其中 是非终结符或非终结符组合,如 X 或 者是 X1 X 2 X 3 X 4 ... X n ) ,那么将 FIRST ( ) 中除了 加入到 FOLLOW ( B) 中,若 (这里要熟练求 FIRST 集的方法)就不管了;若包含 那 FIRST ( ) 不包含 , 么,继续将 FOLLOW ( S ) 中的所有符号加入到 FOLLOW ( B) 中。即 ; FIRST (C) FOLLOW ( B) ( FIRST (C ) 不包含 )
FOLLOW ( F ) {*} FOLLOW (T ) {*,$, ,)}
再举一个例子。 有如下文法,
S AaBb | BbBa A B
这个例子是我们龙书 153 页联系 4.6.5 的文法,在这里我们主要求 FIRST 集。
FIRST (S ) FIRST ( AaBb) FIRST ( BbBa)
好我们分析完毕了,一遍看不懂就再看一遍吧。 2013.01.10
FOLLOW (E ') 的所有字符(哈哈,有点摸不着头脑了,说真的我也不知道这
怎么办,龙书中么有提到啊,于是我们只能忽略) ,于是分析完毕,我们得到
Fra Baidu bibliotek
FOLLOW ( E ') FOLLOW ( E ) {$,)} 。
(8) 求 FOLLOW (T ) 、 (2)中找到含有 T ,并且 T 不是起始符号,不用加入 $ 。接着,我们在(1) 知道 T 后边的 E ' 是非终结符,所以加入 FIRST ( E ') 的除了 的所有字符,若
FIRST ( E ') 中包含 ,还要加入 FOLLOW ( E ) 。
我们知道 FIRST (E ') {, } 中包含 ,于是
FOLLOW (T ) {} FOLLOW ( E) {$, ,)}
(9) 求 FOLLOW (T ')
我们找到(3) 、 (4)中包含 T ' ,于是加入 FOLLOW (T ) ,结束。
FOLLOW 集:比如求 FOLLOW ( B) ,在推导式的右边找到所有含 B 的产生式,锁
定: 1、 直接收取:若 B 是开始符号(什么是开始符号?一般就是文法的第一个式子的左 部) ,那么就将 $ 加入 FOLLOW ( B) 。 ( $ 是输入有段的结束标记,对我们来说没 有什么意义,有的辅导书以 # 来代替。 )即 {$} FOLLOW ( B) 注意产生式右部每一个形如 ...Ba.. 的组合,那么把终结符 a 加入到
好,光说不练假把式,我们举个例子,练一练。
(1) E TE ' (2) E ' TE ' | (3)T FT ' (4)T ' *FT ' | (5) F ( E ) | id
我们拿龙书 127 页的文法举例。 (1) 求 FIRST ( E ) 依照我们的规则, FIRST ( E ) FIRST (T ) ? ,后边要不要并 FIRST ( E ') , 我们不知道,要看 FIRST (T ) 有没有