Это хороший проект. Как вы говорите, вы должны сначала тщательно определить язык ввода для описания любой 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
Вы, конечно, можете придумать более причудливые языки, но этого достаточно и просто для анализа.
Обратите внимание, что полностью указанный DFA с 4 состояниями и 2 входными символами имеет 2 (4) (4-1) = 24 перехода, и мы дали только 5 из них на этой машине. Чтобы заполнить оставшиеся, добавьте состояние «черная дыра» 4. Это имеет самоконтроль для всех символов. Для каждого узла i
, где отсутствует исходящий переход для некоторого символа c
, добавьте переход i 4 c
для завершения DFA.
Для представления DFA в Java хорошим выбором будет Map<Integer, Map<Character, Integer>>
. Первый ключ карты - это номер штата. Вторым является входной символ. Конечным значением является другой номер состояния. Так что если вы в данный момент находитесь в состоянии s
и входной символ c
, вы получите следующее состояние с чем-то вроде
nextState = transitionMap.get(s).get(c)
Обратите внимание, что нет необходимости явно добавлять состояние 4 или все переходы к нему. Скорее, при оценке вышеприведенного выражения просто заставьте машину отказаться в любое время, когда nextState
окажется null
.