语法符号 X 的 FIRST(X) 是从 X 导出的字符串开始的终结符集。
计算第一组的规则:
- 如果 x 是终端,则 FIRST(x) = { ‘x’ }
- 如果 x-> Є, 是产生式规则,则将 Є 添加到 FIRST(x)。
- 如果 X->Y1 Y2 Y3….Yn 是一个产生式,
- 第一(X)=第一(Y1)
- 如果 FIRST(Y1) 包含 Є 那么 FIRST(X) = { FIRST(Y1) – Є } U { FIRST(Y2) }
- 如果 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 , Є }
笔记:
- 上面使用的语法是上下文无关语法(CFG)。大多数编程语言的语法都可以使用 CFG 指定。
- CFG 的形式为 A -> B ,其中 A 是单个非终端,而 B 可以是一组语法符号(即终端和非终端)
在下一篇文章“编译器设计中的 FOLLOW 集”中,我们将看到如何计算 Follow 集。