Aad*_*hah 4 algorithm deterministic finite-automata state-machine
假设我有两个确定性有限状态自动机,由以下转换图表示:
关键字 IF 的 FSA: IF
___ ___ _
/ \ I / \ F // \\
>| 0 |----->| 1 |----->||2||
\___/ \___/ \\_//
Run Code Online (Sandbox Code Playgroud)
ID 的 FSA: [AZ][A-Z0-9]*
------------
___ | _ LET |
/ \ LET // \\<------
>| 0 |----->||1||
\___/ \\_//<------
| NUM |
------------
Run Code Online (Sandbox Code Playgroud)
我可以使用什么算法将它们组合成具有三个最终状态的单个确定性有限状态自动机,由以下转换图表示:
-----------------------
| 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
Run Code Online (Sandbox Code Playgroud)
教科书通常给出自动机C
,L(C) = L(A) U L(B)
通过在其上应用de-morgan, L(C) = (L(A) C [intersection] L(B) C ) C。
交集是通过构建笛卡尔积自动机来完成的,否定只是简单地切换接受状态。
构建联合自动机也可以直接完成:构建笛卡尔积自动机,并且最终状态是这样的状态(a,b)
,即ORa
的自动机中的最终状态是 的自动机中的最终状态A
b
B
另一种方法是通过简单地创建新状态来构建非确定性最终自动机(NFA),并为 start(A) 和 start(B) 添加 epsilon 路径,并使用标准算法从自动机中消除非确定性.
问题 - 这个自动机不会是最小的(可能远非如此)。您可以尝试在生成的自动机上使用此算法以将其最小化。