Как объединить два конечных автомата?
Предположим, что у меня есть два детерминированных автомата конечного состояния, представленных следующими диаграммами переходов:
FSA для ключевого слова IF: IF
___ ___ _
/ I / F // \
>| 0 |----->| 1 |----->||2||
___/ ___/ \_//
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
1 ответ:
Учебники обычно дают автомат
Альтернативой является построение недетерминированного конечного автомата (NFA) путем простого создания нового состояния и добавления пути Эпсилона как для start(A), так и для start(B), а также использование стандартного алгоритма для устранения недетерминизма из автомата.C
такой, чтоL(C) = L(A) U L(B)
применяя к нему де-Моргана , L (C) = (L (A) C [пересечение] L (B) C)C . Пересечение выполняется путем построения автомата декартова произведения, а отрицание-это просто переключение принимающих состояний.
построение автомата объединения также может быть выполнено непосредственно: построить автомат декартова произведения, и конечным состоянием является состояние(a,b)
такое, чтоa
является конечным состоянием в автоматA
илиb
является конечным состоянием в автоматеB
Проблема - этот автомат не будет минимальным (далеко не обязательно). Вы можете попробовать использовать этот алгоритм на результирующем автомате в для того, чтобы свести его к минимуму.