Программная реализация работы простого парсера регулярок
Поддерживаются конструкции РВ: конткатенация,
{}
- итерация,()
группировка и|
конструкицияили
-
Разметка регулярного выражения
- Установка разделителей
|(|0|1|v|1|0|)|
- Установка терминальных индексов
- Помечаем справа от терминального символа
- Установка подчинений 4 правила
- Индекс места перед любыми скобками распространяется на начальные места всех дизъюнктивных членов, записанных в этих скобках.
- Индекс конечного места любого дизъюнктивного члена, заключенного в любые скобки, распространяется на место, непосредственно следующее за этими скобками.
- Индекс места перед итерационными скобками распространяется на место, непосредственно следующее за этими скобками, а индекс места за итерационными скобками – на начальные места всех дизъюнктивных членов, заключенных в итерационные скобки.
- Индекс конечного места любого дизъюнктивного члена, заключенного в итерационные скобки, распространяется на начальные места всех дизъюнктивных членов, заключенных в эти итерационные скобки.
- Установка разделителей
-
Из получившейся разметки построть NFA
- Из каких индексов по какому терминальному символу мы можем перейти в индексы
-
Построить DFA по NFA
- Установка начального состояния
query = [ [ 0 ] ]
- Установка
DFA = []
- Установка множества конечных состояний для DFA
dfaFinals = []
- Цикл по
query
:dfaState = query[i]
- Цикл по Алфавиту терминальных символов:
a = A[j]
- Установка множества
U = []
- Цикл по
dfaState
:nfaState = dfaState[k]
if nfaState ∈ nfaFinals AND nfaState ∉ dfaFinals then dfaFinals += dfaState
if NFA[nfaState][a] ∉ U then U += NFA[nfaState][a]
if U ∉ Ø
:DFA[dfaState][a] = U
if U ∉ query then query += U
- Установка начального состояния
-
Переименовать DFA
$ node main.js
Вывод здесь
- нельзя использовать как терминальные символы, символы из массива escapes
- Обьекты удобны для записи и анализа, но не для скорости выполения
- нельзя использовать отдельно алгоритм преобразования nfa в dfa