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