2012-06-05 7 views
1

Я осуществить следующие операции над автоматами в Java:Моделирование DFA и NFA с помощью осуществления HashMap

  • Concatenation
  • Клини Звезда
  • Союз
  • Пересечения

Эти операции проще, если автомат является NFA. Мне понравилась реализация, приведенная в следующей ссылке Modelling a Finite Deterministic Automaton via this data, но я думаю, что это не очень хорошо подходит при моделировании NFA из-за ограничения единственности ключа. Не могли бы вы порекомендовать мне какое-либо решение для моделирования NFA?

ответ

2

Как кто-то, кто на самом деле реализованы эти операции один раз (при создании генератора сканера), я рекомендую создать автомат как NFA, а затем использовать алгоритм, подобный построению подмножества, или алгоритм Томпсона, чтобы преобразовать его в DFA. Это позволяет логично комбинировать автоматы вместе просто и элегантно, не жертвуя скоростью получаемого автомата соответствия.

Надеюсь, это поможет!

+0

Спасибо. Как вы думаете о моделировании NFA? какая структура данных лучше всего подходит для моей цели? есть ли возможность использовать HashMap или я должен искать другие варианты? – haroldmoma

+0

Я рекомендую иметь класс, представляющий каждое состояние. Каждое состояние затем сохраняет набор всех состояний, достижимых посредством переходов epsilon, плюс карту от символов к множеству состояний, для которых происходит переход, входящий в это состояние на символ. – templatetypedef

+0

http://java.dzone.com/articles/design-patterns-state для удивительного обсуждения с использованием Java и реализации шаблона государственного шаблона templatetypedef, только что предложенного. – avgvstvs

0

Я бы рекомендовал использовать DFA. Хотя формирование NFA может быть проще на бумаге, проверка правильной строки на NFA будет сложнее, чем проверка на DFA из-за учета эпсилон-прыжков.

Что касается моделирования их, вы должны иметь возможность писать свои собственные только с несколькими классами. Просто подумайте о том, что ДКА/НФ состоит из:
- начальное состояние
- множество состояний (некоторые из которых являются «принятие» состояния)
- Набор переходов

+0

Спасибо за ваш ответ. Причина, по которой я делаю это с NFA, заключается в том, что мне нужно получить выражение от пользователя, которое является расширенным регулярным выражением (то есть с перекрестком и дополнением) и дает в качестве результата регулярное выражение с тремя основными операциями (объединение, пересечение и Kleene Star). – haroldmoma