Следующий псевдокод от Введение в построение компилятора в мире Java книга. Предполагается, что этот алгоритм выводит epsilon-замыкание множества состояний недетерминированной конечной машины (в конечном итоге преобразует ее в детерминированную).Понимание алгоритма закрытия epsilon pseudocode
# 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()
в коде является функцией перехода на станцию.
является 'C' массив? Разве это уже не заполнено всеми состояниями от начала ('C.addAll (S)')? Если да, то как «r не в C» никогда не будет правдой? – Algo
'S' является подмножеством состояний NFA, не обязательно множеством всех состояний. – chepner
не может повышать. слишком кратким. –