Compilers - Formal Grammar
Compilers - Formal Grammar
Terminologies
- 导空: \(X\) 可导空意味着 \(X \Rightarrow^* \varepsilon\)。
- 句型: a set of symbol string that can derive from start symbol.
-
句子: a set of terminal string that can derive from start symbol.
- 最左推导: 任何一步推导都是对最左非终结符的推导。
- 最右推导: 任何一步推导都是对最右非终结符的推导。
Types of grammars
- Type-0 (recursively enumerable) grammar: $\gamma \to \alpha$ ($\gamma$ not empty)
- Type-1 (context-sensitive) grammar: $\alpha A \beta \to \alpha \gamma \beta$
- Type-2 (context-free) grammar: $A \to \alpha$
- Type-3 (regular) grammar: $A \to a \mid Aa$ (left regular) or $A \to a \mid aB$ (right regular)
Meaning of symbols:
- $a$ = terminal
- $A, B$ = non-terminal
- $\alpha, \beta, \gamma$ = string of terminals and/or non-terminals
FIRST set
FIRST set (FIRST 集) 是由给定串能推导到的所有第一个终结符的集合。
Derive the FIRST set according to its definition
- 对于推导规则 \(S \to X_0 X_1 X_2 ... X_n\),找到第一个不能导空的符号(记为 \(j\)),则令 \(\text{FIRST}(S) := \text{FIRST}(X_0) \cup \text{FIRST}(X_1) \cup \dots \cup \{X_j\} - \{\varepsilon\}\)。
- 若此串能推导为空,则集合加上 \(\varepsilon\)。
FOLLOW set
FOLLOW set (FOLLOW 集)是由给定非终结符后可能出现的所有终结符的集合。
Derive the FOLLOW set according to its definition
- 对开始符 \(S\),\(\text{FOLLOW}(S) := \{\#\}\);对于其他符号(如 \(A\)),\(\text{FOLLOW}(A) := \{\}\)。
- 要求 \(\text{FOLLOW}(E)\),需找到所有 \(E\) 在右边的推导规则,不妨记为 \(A \Rightarrow \alpha E \beta\)。 则令 \(\text{FOLLOW}(E) := \text{FOLLOW}(E) \cup \text{FIRST}(\beta)\)。 若 \(\beta \Rightarrow^* \varepsilon\),则令 \(\text{FOLLOW}(E) := \text{FOLLOW}(E) \cup \text{FOLLOW}(A)\)。
- 去掉集合中的 \(\varepsilon\)。
SELECT set
SELECT set (SELECT 集) 描述了“应当在什么输入符号下选择某条产生式”。
即:若
\[X \in \text{SELECT}(A \to \alpha),\]则当下一个符号输入为 \(X\) 时,可选择产生式 \(A \to \alpha\)。
形式化地:
\[\text{SELECT}(A \to \alpha) = \begin{cases} \text{FIRST}(\alpha), & \text{if } \varepsilon \notin \text{FIRST}(\alpha) \\[6pt] (\text{FIRST}(\alpha) - \{\varepsilon\}) \cup \text{FOLLOW}(A), & \text{if } \varepsilon \in \text{FIRST}(\alpha) \end{cases}\]
This post is licensed under
CC BY 4.0
by the author.