编译原理 —— FIRST集

本文详细介绍了编译原理中的FIRST集概念,包括如何计算文法符号的FIRST集以及如何计算串的FIRST集合。通过具体示例,解释了当文法符号为终结符、非终结符或推导出空串时的处理方式,帮助读者深入理解编译器构造中的这一关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FIRST 集

  • FIRST(X):可以从符号或符号串X推导出的所有串首终结符构成的集合
  • 如果 X = > ∗ ε X=>^*ε X=>ε ,那么 ε ε ε 也在 FIRST(X)

计算文法符号 X X X 的 FIRST 集合

对于一个产生式 X → Y 1 Y 2 . … Y n X→Y_1Y_2.…Y_n XY1Y2.Yn

(1)如果 X X X是一个终结符,那么FIRST ( X ) = { X } (X)=\{X\} (X)={X}

(2)如果 X X X是一个非终结符,且 X → Y 1 Y 2 . … Y n X→Y_1Y_2.…Y_n XY1Y2.Yn

  • 如果 Y 1 Y_1 Y1 是一个终结符,那么FIRST ( X ) = { Y 1 } (X)=\{Y_1\} (X)={Y1}
  • 如果 Y 1 Y_1 Y1 是非终结符,那么
    1. FIRST ( X ) (X) (X)加入 FIRST ( Y 1 ) (Y_1) (Y1)中所有的非 ε ε ε 符号
    2. 如果 ε ε εFIRST ( Y 1 ) (Y_1) (Y1)中,再加入FIRST ( Y 2 ) (Y_2) (Y2)中的所有非 ε ε ε 符号;如果 ε ε εFIRST ( Y 1 ) (Y_1) (Y1)FIRST ( Y 2 ) (Y_2) (Y2)中,再加入 FIRST ( Y 3 ) (Y_3) (Y3)中的所有非 ε ε ε 符号,以此类推…
    3. 最后,如果对所有的 X X X ε ε ε 都在FIRST ( X ) (X) (X)中,那么将 ε ε ε 加入到 FIRST ( X 1 X 2 . … X n ) (X_1X_2.…X_n) (X1X2.Xn)

(3)如果 X → ε X→ε Xε,那么将 ε ε ε 加入FIRST ( X ) (X) (X)

(4)若存在其它 X X X 的候选式,则重复应用上述过程

示例:

  1. 式子②④⑤的候选式都是以终结符开头(即 Y 1 Y_1 Y1是终结符),故他们的FIRST集中分别包含了+、*、(
  2. 式子②④的候选式还可以推导出 ε ε ε ,故他们的FIRST集中包含了 ε ε ε
  3. 式子③的候选式以非终结符开头(即 Y 1 Y_1 Y1是非终结符),故式子③的FIRST集加入了 FIRST ( F ) (F) (F)中所有的非 ε 符号,同理可求式子①的FIRST集
  4. 若将 E → T E ′ E→TE' ETE 改写成 E → E ′ T E→E'T EET (下面简称为式子⑥)
    1. 式子⑥的FIRST集加入了 FIRST ( E ′ ) (E') (E)中所有的非 ε 符号
    2. ε 在 FIRST ( E ′ ) (E') (E)中,再加入了 FIRST ( T ) (T) (T)中所有的非 ε 符号
    3. FIRST ( T ) (T) (T)中没有 ε ,结束。
    4. 故此时 FIRST ( E ) = { + , ( , i d } (E)=\{+,(,id\} (E)={+(id}

计算串 X 1 X 2 . … X n X_1X_2.…X_n X1X2.Xn 的FIRST集合

(1)向 FIRST ( X 1 X 2 . … X n ) (X_1X_2.…X_n) (X1X2.Xn)加入 FIRST ( X 1 ) (X_1) (X1)中所有的非 ε ε ε 符号

(2)如果 ε ε εFIRST ( X 1 ) (X_1) (X1)中,再加入FIRST ( X 2 ) (X_2) (X2)中的所有非 ε ε ε 符号;如果 ε ε εFIRST ( X 1 ) (X_1) (X1)FIRST ( X 2 ) (X_2) (X2)中,再加入 FIRST ( X 3 ) (X_3) (X3)中的所有非 ε ε ε 符号,以此类推…

(3)最后,如果对所有的 X X X ε ε ε 都在FIRST(X)中,那么将 ε ε ε 加入到 FIRST ( X 1 X 2 . … X n ) (X_1X_2.…X_n) (X1X2.Xn)


参考地址:

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值