我被分配了一个任务,需要用Java模拟NFA。现在我需要模拟以下正则表达式的NFA:
ab*((b|d)|c*)
我觉得我有太多的电子符号。我想知道下面的图片是否正确。
我被分配了一个任务,需要用Java模拟NFA。现在我需要模拟以下正则表达式的NFA:
ab*((b|d)|c*)
我觉得我有太多的电子符号。我想知道下面的图片是否正确。
你的NFA图是正确的。它将匹配正则表达式ab*((b|d)|c*)
,但不会匹配其他任何内容。但是,它可能会更简单,例如:
((b|d)|c*)
只有两个分支,而不是三个。它要么是(b|d),要么是c*,所以从你的b节点来看,更准确的表示方式不是将其表示为完全独立的路径,然后分成b
或d
吗? - Brandon Buck(b|d)|c*
在正则表达式代数中等同于 b|d|(c*)
,是吗?Kleene闭包比Alternation的优先级更高。 - Staffan Nöteberg
2-3
到e
似乎存在一个e
转换。我知道它可以被简化,但这是正确的做法吗?从(编译器-原理、工具和技术第二版)书中,它展示了类似于提供的链接的例子。 - unleashede
转换。1-a-2-e-3-b-4-e-5...
由于您的跳跃显然无法在一行上完成:P - Brandon Buck1-a-2-e-3-b-4-e-5
?所以我需要添加更多的e
转换吗? - unleasheda*
,它是1-e-2-a-3-e-4
(带有跳转)。我只是想指出,如果这是你的教授(或其他人)要求的正确方式,那么你应该将同样的模式应用于代表b*
的图形部分。 - Brandon Buck