编译原理 —— FOLLOW集

时间:2024-03-28 19:59:44

FOLLOW集

  • FOLLOW(A):紧跟在非终结符A后边的终结符α的集合
  • 如果A是某个句型的的最右符号,则将结束符 添加到 FOLLOW(A)中

计算非终结符A的 FOLLOW集合

(1)将放入 FOLLOW(S)中,其中S是开始符号,是输入右端的结束标记

(2)如果存在一个产生式 AαBβA→αBβ ,那么FIRST(B)中除 εε 之外的所有符号都在FOLLOW(B)中

(3)如果存在一个产生式 AαBA→αB,或存在产生式 AαBβA→αBβFIRST(β)包含 εε ,那么FOLLOW(A)中的所有符号都在FOLLOW(B)中

(4)重复上述过程,直到没有新的终结符可以加入

举例:
编译原理 —— FOLLOW集

  1. EE 本身就是一个句型,它是该句型的最右符号,故将结束符 添加到FOLLOW(A)(A)
  2. 由式子①
    1. EE' 紧跟在 TT 后面,故 FOLLOW(T)(T) 中包含 FIRST(E)(E')中的终结符 +
    2. FIRST(E)(E')中包含 εεTT可能是产生式①右部的最后一个符号,TT 依赖于 EEFOLLOW(E)(E)FOLLOW(T)(T)
    3. EE' 可能是产生式①右部的最后一个符号,EE' 依赖于 EEFOLLOW(E)(E)FOLLOW(E)(E')
  3. 式子②中,TTEE' 所处位置与式子①相同,分析结果也将相同
  4. 由式子③
    1. TT' 紧跟在 FF 后面,故 FOLLOW(F)(F) 中包含 FIRST(T)(T')中的终结符 *
    2. FIRST(T)(T')中包含 εεFF 可能是产生式③右部的最后一个符号,FF 依赖于 TTFOLLOW(T)(T)FOLLOW(F)(F)
    3. TT' 可能是产生式③右部的最后一个符号,TT' 依赖于 TTFOLLOW(T)(T)FOLLOW(T)(T')
  5. 式子④中,FFTT' 所处位置与式子③相同,分析结果也将相同
  6. 式子⑤中,EE 的后面跟着终结符 ,故将 添加到FOLLOW(E)(E)
  7. 验证是否满足所有的依赖关系

参考地址:

https://www.icourse163.org/learn/HIT-1002123007?tid=1003246005#/learn/announce