Зміст:
Польський інверсний запис для регулярних виразів
Польський інверсний запис (ПОЛІЗ) для регулярних виразів будується на основі початкового регулярного виразу на основі наступних правил:
-
Порядок операндів в початковому виразі і в перетвореному виразі співпадають.
-
Операції в перетвореному виразу йдуть з урахуванням пріоритету безпосередньо за операндами.
Наприклад, ПОЛІЗ для виразу має такий вигляд: .
В цьому прикладі в стандартному записі регулярного виразу бінарна операція конкатенація природньо опущена, але в ПОЛІЗ потрібно завжди цю операцію явно вказувати.
Важливою характеристикою ПОЛІЗ є відсутність дужок в запису виразу, тобто його можна опрацьовувати лінійно.
Алгоритм
Для перетворення виразу в ПОЛІЗ необхідно з кожною операцією зв’язати деяке число, яке будемо називати “пріоритет” (0 — найвищий пріоритет присвоїмо дужці '('
). Наведемо псевдокод алгоритму:
while lexem <- прочитати поточну лексему:
if lexem is операнд:
занести її в поле результату
if lexem = '(':
занести її в стек
if lexem is код операції:
while пріоритет операції на вершині стека >= пріоритет поточної операції:
елемент з вершини стека перенести в поле результату
поточну лексему занести в стек
if lexem = ')':
while код операції на вершині стеку != '(':
елемент з вершини стека перенести в поле результату
дужку '(' зняти з вершини стека
всі елементи із стека перенести в поле результату
Інтерпретація ПОЛІЗ регулярного виразу
Результат інтерпретації ПОЗІЗ — це скінченний автомат , який розпізнає (сприймає) множину ланцюжків, котрі позначає регулярний вираз.
Алгоритм
Наведемо псевдокод алгоритму:
while lexem <- прочитати поточну лексему:
if lexem is операнд ai:
M: L(M) = {ai}
if lexem = '+':
M1, M2 <- автомати з вершини стеку
M: L(M) = L(M1) ∪ L(M2)
if lexem = '×':
M1, M2 <- автомати з вершини стеку
M: L(M) = L(M2) × L(M1)
if lexem = '★':
M1 <- автомат з вершини стеку
M: L(M)= L(M1)★
M занести в стек
вершину стека перенести в поле результату
Якщо досягли кінця регулярного виразу, то на вершині стека знаходиться автомат , який розпізнає множину слів (ланцюжків), які позначає регулярний вираз.
Контрольні запитання
-
Що таке ПОЛІЗ?
-
Чи можна в ПОЛІЗ опускати операції які природнім чином опускаються у класичному записі?
-
Яка основна характеристика ПОЛІЗ і яку обчислювальну перевагу вона пропонує?
-
Сформулюйте алгоритм перетворення регулярного виразу у ПОЛІЗ та оцініть його складність.
-
Що є результатом інтерпретації ПОЛІЗ регулярного виразу?
-
Сформулюйте алгоритм інтерпретації ПОЛІЗ регулярного виразу.
-
Оцініть складність попереднього алгоритму через складності операцій побудови автоматів.
-
Для регулярного виразу побудуйте скінчений автомат, який розпізнає множину ланцюжків, що позначаються цим виразом.
(традиційні відповіді можна переглянути у коментарях у вихідному коді цієї сторінки)