制作正则表达式的 NFA ^[a-zA-Z0-9]{3,16}$
Making NFA of Regex ^[a-zA-Z0-9]{3,16}$
我正在尝试制作正则表达式 ^[a-zA-Z0-9]{3,16}$ 的 NFA。我知道这个正则表达式意味着该语言只接受长度为 3 到 16 的字符串,其中可能包括 a 到 z、A 到 Z 或 0 到 9。
我已经尝试做到这一点,但我面临的主要问题是如何设定条件,即如果字符串长度为 3 或 16,则它只能进入最终状态,否则将被丢弃。任何帮助,将不胜感激。
这是我的尝试,您可以在状态 5 上看到 (3,16),我认为这不是绘制 NFA 的有效方法。
有限机器状态没有任何辅助数据。它们只是一个状态,它们所能做的就是使用一套固定的转换规则转换到另一个状态。
你仍然可以数到一个已知的有限数;每个可能的值只需要一个状态。但是你不能 "count" 在这个词的任何正常意义上。例如,您无法查看两个子序列的长度是否相同。
因此,要接受最多 16 个固定长度的句子,您将需要 16 个状态,不包括开始状态,也不包括输入不匹配时的 "sink" 状态。 (通常 NFA 不需要是完整的,因此接收器状态是隐式的;它用于没有转换的任何输入。)
这意味着您的 NFA 大致如下所示:
碰巧,那里没有非确定性,所以它也是一个 DFA。
我正在尝试制作正则表达式 ^[a-zA-Z0-9]{3,16}$ 的 NFA。我知道这个正则表达式意味着该语言只接受长度为 3 到 16 的字符串,其中可能包括 a 到 z、A 到 Z 或 0 到 9。
我已经尝试做到这一点,但我面临的主要问题是如何设定条件,即如果字符串长度为 3 或 16,则它只能进入最终状态,否则将被丢弃。任何帮助,将不胜感激。
这是我的尝试,您可以在状态 5 上看到 (3,16),我认为这不是绘制 NFA 的有效方法。
有限机器状态没有任何辅助数据。它们只是一个状态,它们所能做的就是使用一套固定的转换规则转换到另一个状态。
你仍然可以数到一个已知的有限数;每个可能的值只需要一个状态。但是你不能 "count" 在这个词的任何正常意义上。例如,您无法查看两个子序列的长度是否相同。
因此,要接受最多 16 个固定长度的句子,您将需要 16 个状态,不包括开始状态,也不包括输入不匹配时的 "sink" 状态。 (通常 NFA 不需要是完整的,因此接收器状态是隐式的;它用于没有转换的任何输入。)
这意味着您的 NFA 大致如下所示:
碰巧,那里没有非确定性,所以它也是一个 DFA。