Как объединить два конечных автомата?
Скажем, у меня есть два детерминированных автомата конечного состояния, представленных следующими диаграммами перехода:
FSA for keyword IF: ЕСЛИ
___ ___ _
/ \ I / \ F // \\
>| 0 |----->| 1 |----->||2||
\___/ \___/ \\_//
FSA for an ID: [A-Z] [А-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