Set Accepted NFA State to ⊥
Set Accepted Position to Tell(Input Stream)
Set State to Starting State
Repeat:
If State ∈ Accepting:
Set Accepted NFA State to Accepting NFA State for State [Note 1]
Set Accepted Position to Tell(Input Stream)
Read one symbol from Input Stream into Next Symbol
If there is a transition from {State, Next Symbol} to New State:
Set State to New State
Continue the loop
Otherwise:
Rewind Input Stream to Accepted Position
Return Accepted NFA State
1条答案
按热度按时间8e2ybdfx1#
最大munch算法是通过向DFA执行器添加少量可变状态,并添加DFA执行器“倒带”输入的能力来实现的:实际上,为它提供了像
tell()
和seek()
这样的函数。值得注意的是,DFA是不完整的,因为转换函数是不完整的。一些
{state, input}
对没有定义的结果。[注2]考虑到这一点,算法如下:
如果算法返回,则没有识别出令牌,并且输入流将被倒回初始位置。
备注:
1.通过添加一个额外的(且唯一的)
sink
状态来完成DFA是很容易的,该状态是不可接受的,并且只具有到自身的转换。然后我们可以添加sink
状态作为任何其他未指定转换的转换。如果我们调用sink
状态,那么将清楚如何修改提供的算法;在实践中,这是完全没有必要的,因为在实践中,我们不关心DFA是不完整的,但它确实对状态最小化算法有一些影响。