Common Operation
===
---
###### tags: `Compiler`
本篇記載了在
- [SLR Parser](/4_i5WNEZRWuYKDuFI3a5fQ)
- [LR(1)](/sECVHL1FTuOuqN_GjSdX1w)
共同會使用到的一些 Operation
---
# First
1. Description
:::info
The set of terminals that begins the strings derived from α
:::
2. Pseudo Code
```c=
If X is a terminal
FIRST(X) = {X}
If X → є is a production
add є to FIRST(X)
If X → Y1 Y2 … Yk is a production
if ∃i (1 ≤ i ≤ k) ∋ a ∈ FIRST(Yi) and
є ∈ FIRST(Yj) ∀j (1 ≤ i ≤ j)
// 若從 Y1 ~ Yj 每個 Yi 的 FIRST 都有空字串є
// 則將每個 Yi 的 FIRST 都加進 FIRST(X)
Place a in FIRST(X)
if ∀i (1 ≤ i ≤ k) є ∈ FIRST(Yi)
Place є in FIRST(X)
// 若 Y1 ~ Yk 的 FIRST 全都有є
// 則還需要再加 є 進 FIRST(X)
```
# Follow
1. Description
:::info
The set of terminals a that can appear immediately to the right of A in some sentential form
a ∈ FOLLOW(A) if there exists a derivation S ⇒ αAaβ
:::
2. Pseudo Code
```c=
Place $ in FOLLOW(S)
If there is production A → αBβ
add FIRST(β) − {є} to FOLLOW(B)
If there is production A → αB
add FOLLOW(A) to FOLLOW(B)
If there is production A → αBβ and є ∈ FIRST(β)
add FOLLOW(A) to FOLLOW(B)
```
3. Example
```=
E → TE’
E’ → +TE’ | є
T → FT’
T’ → *FT’ | є
F → (E ) | id
FIRST(E) = FIRST(T) = FIRST(F) = {(, id}
FIRST(E’) = {+, є}
FIRST(T’) = {*, є}
FOLLOW(E) = FOLLOW(E’) = {), $}
FOLLOW(T) = FOLLOW(T’) = {+, ), $}
FOLLOW(F) = = {+, *, ), $}
```