这是一个不错的项目。正如您所说,您首先需要仔细定义一种输入语言来描述任何 FA。除了你已经拥有的,你还需要状态转换。这通常通过以下两种方式之一完成:
- 完整的转换表。
- 过渡图的描述,其中缺失的边被解释为过渡到“崩溃”。即过渡到“黑洞”状态,即语言所有字符都有自循环的不接受状态。
表格 1 更易于阅读,但不太方便,因为您必须明确指定所有转换。表格 2 更方便。我推荐表格 2。带有此表格的 DFA 描述可能如下所示:
4 # There are 4 explicit states (plus a 5th for the "black hole")
# Assume they have state numbers 0 (the start state), 1, 2, 3.
ab # A string of characters in the FSM alphabet
1 3 # Numbers of accepting states.
5 # Number of explicit state transitions
0 1 a # From 0 to 1 on input a
1 1 a # From 1 to 1 on input a
1 2 b # From 1 to 2 on input b
2 3 a # From 2 to 3 on input a
3 3 a # From 3 to 3 on input a
您当然可以想出更高级的语言,但这个语言已经足够且易于解析。
请注意,具有 4 个状态和 2 个输入字符的完全指定的 DFA 有 2(4)(4-1) = 24 个转换,而我们在这台机器中只给出了其中的 5 个。要填充其余的,添加一个“黑洞”状态 4。这对所有字符都有一个自循环。对于缺少某个字符c 的传出转换的每个节点i,添加转换i 4 c 以完成DFA。
要在 Java 中表示 DFA,一个不错的选择是 Map<Integer, Map<Character, Integer>>。第一个映射键是状态编号。第二个是输入字符。最终值是另一个状态编号。因此,如果您当前处于状态 s 并且输入字符是 c,您将获得类似于
的下一个状态
nextState = transitionMap.get(s).get(c)
请注意,无需显式添加状态 4 或所有转换。相反,在评估上面的表达式时,只要让机器拒绝任何时候 nextState 变成 null。