理解epsilon闭包算法伪代码

时间:2015-11-25 17:03:50

标签: algorithm pseudocode finite-automata dfa nfa

以下伪代码来自 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()是机器的转换功能。

1 个答案:

答案 0 :(得分:-2)

它只是将转换函数应用于S中的每个状态。该应用程序产生的状态在C中收集。一旦你查看了P中的每个状态,C就包含了epsilon闭包。

请注意,输入S不一定是NFA中的完整状态集,因此S和m(s,epsilon)的交集可能不为空。