我正在阅读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')
。有什么想法吗?
答案 0 :(得分:0)
本文中描述的简单算法是最少定点计算。你基本上循环通过非终结点,将终端放入跟随集,直到你完成整个周期而不做任何改变。
由于从任何跟随集中都没有删除任何内容,并且终端数量是有限的,因此算法必须终止。它通常只需要几个周期。