Я хочу преобразовать введенное пользователем регулярное выражение в NFA, чтобы потом можно было запускать NFA для строки для сопоставления. Какой минимальный компьютер можно использовать для разбора регулярных выражений?
Я предполагаю, что это должен быть автомат с принудительной передачей, потому что наличие скобок означает необходимость подсчета, а DFA / NFA не может выполнить произвольный подсчет. Это предположение верно? Например, для выражения a (bc *) d потребуется PDA, чтобы подвыражение в скобках обрабатывалось правильно.
Ответы:
Ты прав. Легко показать, что синтаксис регулярных выражений не является регулярным с использованием стандартных методов .
Одна возможность - использовать гомоморфизм ( против которого закрыт) избавиться от всех символов, кроме скобок, что оставляет вас с языком Дика, который, как известно, нерегулярен. Если сомневаетесь, используйте лемму прокачки на .( p ) pREG (p)p
Тем не менее, вы, вероятно, не хотите кодировать КПК вручную. Подумайте об использовании генератора синтаксического анализатора, такого как ANTLR или byacc . С другой стороны, если вы хотите исследовать синтаксический анализ языков, программируя синтаксические анализаторы самостоятельно, вам следует продолжить работу с другими базовыми алгоритмами синтаксического анализа, такими как CYK , Earley , рекурсивное снижение и LR .
источник
Я предлагаю вам прочитать хороший ответ Юкки на вопрос " Сопоставление регулярных выражений с использованием регулярных выражений " также на cstheory. Выдержка:
Это всего лишь ссылка на интересный (по моему мнению) «другой взгляд» на язык регулярных выражений; как подчеркнуто в комментариях ниже, это не полезно для построения синтаксического дерева. Если вы хотите написать код вашего парсера, я предложу вам эту простую статью о проекте кода « Writing-own-регулярное-выражение-парсер ».
источник