📜  语法分析中的第一个集合

📅  最后修改于: 2021-09-27 22:39:23             🧑  作者: Mango

语法符号 X 的 FIRST(X) 是从 X 导出的字符串开始的终结符集。

计算第一组的规则:

  1. 如果 x 是终端,则 FIRST(x) = { ‘x’ }
  2. 如果 x-> Є, 是产生式规则,则将 Є 添加到 FIRST(x)。
  3. 如果 X->Y1 Y2 Y3….Yn 是一个产生式,
    1. 第一(X)=第一(Y1)
    2. 如果 FIRST(Y1) 包含 Є 那么 FIRST(X) = { FIRST(Y1) – Є } U { FIRST(Y2) }
    3. 如果 FIRST (Yi) 包含所有 i = 1 到 n 的 Є,则将 Є 添加到 FIRST(X)。

示例 1:

Production Rules of Grammar
E  -> TE’
E’ -> +T E’|Є
T  -> F T’
T’ -> *F T’ | Є
F  -> (E) | id

FIRST sets
FIRST(E) = FIRST(T) = { ( , id }
FIRST(E’) = { +, Є }
FIRST(T) = FIRST(F) = { ( , id }
FIRST(T’) = { *, Є }
FIRST(F) = { ( , id }

示例 2:

Production Rules of Grammar
S -> ACB | Cbb | Ba
A -> da | BC
B -> g | Є
C -> h | Є

FIRST sets
FIRST(S) = FIRST(ACB) U FIRST(Cbb) U FIRST(Ba)
         = { d, g, h, b, a, Є}
FIRST(A) = { d } U FIRST(BC) 
         = { d, g, h, Є }
FIRST(B) = { g , Є }
FIRST(C) = { h , Є }

笔记:

  1. 上面使用的语法是上下文无关语法(CFG)。大多数编程语言的语法都可以使用 CFG 指定。
  2. CFG 的形式为 A -> B ,其中 A 是单个非终端,而 B 可以是一组语法符号(即终端和非终端)

在下一篇文章“编译器设计中的 FOLLOW 集”中,我们将看到如何计算 Follow 集。