计算语法的FOLLOW()集

时间:2015-06-18 18:46:08

标签: compiler-construction

我正在阅读Compilers: Principles, Techniques, and Tools (2nd Edition),我正在尝试计算以下语法的FOLLOW()套:

S  →  iEtSS' | a
S' →  eS | ε
E  →  b

其中S, S', E非终端符号,S开始符号,i, t, a, e, b终端< / em>符号,ε是空字符串。

到目前为止我做了什么

FOLLOW(S) = {$} ∪ FOLLOW(S')
FOLLOW(S') = FOLLOW(S)
FOLLOW(E) = FIRST(tSS') - {ε} = FIRST(t) - {ε} = {t} - {ε} = {t}

其中$输入右端制作者

解释

$ ∈ FOLLOW(S),因为S是起始符号。我们也知道S' → eS,因此FOLLOW(S')中的所有内容都在FOLLOW(S)中。因此,FOLLOW(S) = {$} ∪ FOLLOW(S')

我们也知道S → iEtSS',因此FOLLOW(S)中的所有内容都在FOLLOW(S')中。因此,FOLLOW(S') = FOLLOW(S)

问题在于我无法计算FOLLOW(S),因为我不知道FOLLOW(S')。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

本文中描述的简单算法是最少定点计算。你基本上循环通过非终结点,将终端放入跟随集,直到你完成整个周期而不做任何改变。

由于从任何跟随集中都没有删除任何内容,并且终端数量是有限的,因此算法必须终止。它通常只需要几个周期。