假设我有两个由以下转换图表示的确定性有限状态自动机:
关键字 IF 的 FSA: IF
___ ___ _
/ \ I / \ F // \\
>| 0 |----->| 1 |----->||2||
\___/ \___/ \\_//
ID 的 FSA: [A-Z][A-Z0-9]*
------------
___ | _ LET |
/ \ LET // \\<------
>| 0 |----->||1||
\___/ \\_//<------
| NUM |
------------
我可以使用什么算法将它们组合成具有三个最终状态的单个确定性有限状态自动机,由以下转换图表示:
-----------------------
| LETTER BUT F OR NUM | --------
___ | _ _ LET v _ | LET |
/ \ I // \\ F // \\----->// \\<------
>| 0 |----->||1||----->||2|| ||3||<--------
\___/ \\_// \\_//----->\\_//<------ |
| NUM | NUM | |
| ANY LETTER OTHER THAN I ------------ |
---------------------------------------------
1: ID
2: IF (IT'S ALSO AN ID, BUT THE KEYWORD IF HAS A HIGHER PRECEDENCE)
3: ID
最佳答案
教科书通常通过应用 de-morgan 给出自动机 C
使得 L(C) = L(A) U L(B)
在上面,L(C) = (L(A)C [intersection] L(B)C)C。
求交是通过构建笛卡尔乘积自动机完成的,求反只是简单地切换接受状态。
构建联合自动机也可以直接完成:构建笛卡尔积自动机,最终状态是状态(a,b)
使得a
是A
的自动机中的最终状态或 b
是 B
另一种方法是构建一个 Non-Deterministic Final Automaton (NFA) 通过简单地创建一个新状态,并为 start(A) 和 start(B) 添加一个 epsilon 路径,并使用标准算法从自动机中消除非确定性。
问题 - 这个自动机不会是最小的(可能远非如此)。您可以尝试使用 this algorithm在生成的自动机上以最小化它。
关于algorithm - 如何合并两个有限状态自动机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11201643/