以下伪代码来自 Java World中的编译器构建简介一书。该算法应该输出非确定性有限机器的一组状态的epsilon闭包(最终将其转换为确定性的)。
# Input: a set of states, S
# Output: epsilon_closure(S)
Stack P.addAll(S) #a stack containing all states in S
Set C.addAll(S) #the closure initially contains the states in S
while ! P.empty() do
s = P.pop()
for r in m(s, epsilon) do
# m(s, epsilon) is a set of states
if r not in C then
P.push(r)
C.add(r)
end if
end for
end while
return C
我知道epsilon闭包是什么,但不幸的是我很难理解这段代码的工作原理。
注意:代码中的m()
是机器的转换功能。
答案 0 :(得分:-2)
它只是将转换函数应用于S中的每个状态。该应用程序产生的状态在C中收集。一旦你查看了P中的每个状态,C就包含了epsilon闭包。
请注意,输入S不一定是NFA中的完整状态集,因此S和m(s,epsilon)的交集可能不为空。