ce14cc8a1036682ed53ae8dafe7d37f1.ppt
- Количество слайдов: 43
Регулярные выражения 1 Владимир Васильевич Романенко, к. т. н. , доцент каф. АСУ ТУСУР
Способы описания языков 2 Конечные автоматы Способы описания языков Регулярные выражения Грамматики
Основные определения 3 Регулярные выражения в алфавите Σ и регулярные множества, которые они порождают, определяются рекурсивно следующим образом: 1) – регулярное выражение, обозначающее регулярное множество . 2) e – регулярное выражение, обозначающее регулярное множество {e}. 3) Если a Σ, то a – регулярное выражение, обозначающее регулярное множество {a}.
Основные определения 4 4) Если p и q – регулярные выражения, порождающие регулярные множества P и Q, то (p+q) – регулярное выражение, обозначающее P Q. pq – регулярное выражение, обозначающее PQ. p* – регулярное выражение, обозначающее P*. 5) Ничто другое не является регулярным выражением.
Основные определения 5 Расстановка приоритетов: итерация (*); конкатенация; объединение (+). Например: ab* = a(b*); a+b* = a+(b*); ab+cd = (ab)+(cd).
Основные определения 6 Как связать язык L и регулярное выражение? Любой язык L в алфавите Σ – это множество правильных цепочек (предложений), составленных из символов данного алфавита (L Σ* или L Σ+). Любое регулярное (РВ) выражение описывает некоторое множество цепочек, которое называют регулярным множеством (РМ). Следовательно, РМ, порождаемое РВ, и есть язык, который описывает данное РВ: L = РМ.
Примеры порождения РМ 7 Пример 1. Пусть p = a, q = b. Какой язык описывает РВ p + q? Согласно определению, РВ p = a порождает РМ P = {a}, а РВ q = b порождает РМ Q = {b}: p P = {a}, q Q = {b}. Тогда РВ p + q порождает РМ P Q: p + q P Q = {a} {b} = {a, b}. Т. е. язык L содержит две правильные цепочки – «a» и «b» .
Примеры порождения РМ 8 Пример 2. Пусть p = a, q = b. Какой язык описывает РВ pq? Согласно определению, p P = {a}, q Q = {b}. Тогда РВ pq порождает РМ PQ: pq PQ = {a}{b} = {ab}. Т. е. язык L содержит одну правильную цепочку – «ab» .
Примеры порождения РМ 9 Пример 3. Пусть p = a. Какой язык описывает РВ p*? Согласно определению, p P = {a}. Тогда РВ p* порождает РМ P*: p* P* = {a}* = {e, a, aaa, …}. Т. е. язык L содержит бесконечное множество правильных цепочек, в которое входит пустая цепочка e, а также цепочки, составленные из произвольного количества символов «a» .
Примеры порождения РМ 10 Пример 3. Пусть p = a. Какой язык описывает РВ p*? p* P* = {a}* = {e, a, aaa, …}. Вывод 1. Любое РВ, содержащее операцию итерации, потенциально может порождать языки с бесконечным множеством допустимых цепочек (предложений). Вывод 2. Итерация – это бесконечное объединение конкатенаций: a* = e + aaa + …
Примеры порождения РМ 11 Пример 4. Пусть p = a, q = b. Какой язык описывает РВ (p + q)? Согласно определению, p P = {a}, q Q = {b}. Тогда РВ (p + q) (P Q) = {a, b}. Чему соответствует конкатенация множеств, состоящих более чем из одного элемента?
Примеры порождения РМ 12 Пример 4. Пусть p = a, q = b. Какой язык описывает РВ (p + q)? {xy PQ | x P, y Q} Тогда (p + q) {a, b} = {aa, ab, ba, bb}. Вывод. Объединение – коммутативная операция, конкатенация – нет: a+b=b+a ab ba
Примеры порождения РМ 13 Пример 5. Пусть p = a, q = b. Какой язык описывает РВ (p + q)*? Согласно определению, p P = {a}, q Q = {b}. Тогда РВ (p + q)* (P Q)* = {a, b}*. Чему соответствует итерация множества, состоящего более чем из одного элемента?
Примеры порождения РМ 14 Пример 5. Пусть p = a, q = b. Какой язык описывает РВ (p + q)*? Вспомним: a* = e + aaa + … Следовательно, (p + q)* = e + (p + q)(p + q) + …
Примеры порождения РМ 15 Пример 5. Пусть p = a, q = b. Какой язык описывает РВ (p + q)*? (P Q)* = {e} {a, b}{a, b} … = {e} {a, b} {aa, ab, ba, bb} {aaa, aab, …, bbb} … = {e, a, b, aa, ab, ba, bb, aaa, aab, …, bbb, …} Т. е. язык L содержит бесконечное множество правильных цепочек длиной от 0 до , составленных из произвольных комбинаций символов «a» и «b» .
Примеры порождения РМ 16 Пример 6. Пусть p = Иван, q = Марья. Какой язык описывает РВ p + q? Согласно определению, p P = {Иван}, q Q = {Марья}. Тогда p + q P Q = {Иван} {Марья} = {Иван, Марья}. Т. е. язык L содержит две правильные цепочки – «Иван» и «Марья» .
Примеры порождения РМ 17 Пример 7. Пусть p = пыле, q = сос. Какой язык описывает РВ pq? Согласно определению, p P = {пыле}, q Q = {сос}. Тогда pq PQ = {пыле}{сос} = {пылесос}. Т. е. язык L содержит одну правильную цепочку – «пылесос» .
Примеры порождения РМ 18 Пример 8. Какой язык описывает РВ p = к(и+о)т? Согласно определению: к(и+о)т {к}{и, о}{т} = {ки, ко}{т} = {кит, кот}. Таким образом, язык L содержит две правильные цепочки – «кит» и «кот» .
Примеры порождения РМ 19 Пример 9. Какой язык описывает РВ p = урр*аa*? Согласно определению: урр*aa* {ур}{e, р, ррр, …}{а}{e, а, ааа, …} = {ура, ураа, урраа, …}. Таким образом, язык L содержит бесконечное множество правильных цепочек типа «ур. . ра. . а» , т. е. в которых буквы «р» и «а» могут повторяться от 1 до раз.
Базис операций РВ 20 Три рассмотренные операции составляют базис, т. е. с их помощью можно записать любое РВ. Но для упрощения записи языков, в различных реализациях РВ вводятся дополнительные операции, которые выражаются через базисные. Например: a+ = aa*, таким образом, урр*aa* = ур+а+; a? = a + e; a{n, } = aa…aa* (цепочка из n символов a, затем итерация a*); и т. д.
Плюсы и минусы РВ 21 Плюсы: Не нужно писать свой синтаксический анализатор, т. к. реализация РВ присутствует во всех современных ЯВУ (в некоторых случаях является частью языка, как, например, PHP, в других – реализуется за счет дополнительных библиотек функций или классов, например, Regex в. NET). Запись языка получается весьма компактной.
Плюсы и минусы РВ 22 Минусы: Имеющиеся реализации РВ в большей степени предназначены для обработки текста (операций поиска и замены), поэтому в них затруднены такие задачи синтаксического анализа, как поиск позиции ошибки и внедрение в синтаксис действий. РВ в целом не подходят для анализа рекурсивных языков (т. е. языков, задаваемых ДМПА).
Способы определения языка 23 Способ 1. Предположим, для некоторого языка L построен ДКА M = (Q, Σ, δ, q 0, F). Тогда РВ, соответствующее этому языку, можно получить из решения системы уравнений с регулярными коэффициентами: q 0 = δ 0 + δ 00 q 0 + δ 01 q 1 + … + δ 0 nqn q 1 = δ 1 + δ 10 q 0 + δ 11 q 1 + … + δ 1 nqn ………………………… qn = δn + δn 0 q 0 + δn 1 q 1 + … + δnnqn Алгоритм решения изложен в учебном пособии.
Способы определения языка 24 Здесь qi Q – состояния ДКА, δij – элементы функции переходов: Изначально полагаем δij = , i, j = 0, 1, …, n; Если δ(qi, a) = qj, то δij = δij + a. Наконец, δi – коэффициент, определяющий множество заключительных состояний: δi = e, если qi F или δ(qi, ) = HALT; Иначе δi = . Тогда решение полученное для начального состояния q 0, и будет искомым РВ.
Способы определения языка 25 Для упрощения решения используются следующие леммы: 1) α + β = β + α; 2) * = e; 3) α + (β + γ) = (α + β) + γ; 4) α(βγ) = (αβ)γ; 5) α(β + γ) = αβ + αγ; 6) (α + β)γ = αγ + βγ; 7) αe = eα = α;
Способы определения языка 26 Для упрощения решения используются следующие леммы: 8) α = ; 9) α* = α + α*; 10) (α*)* = α*; 11) α + α = α; 12) α + = α. Почему важно упрощать РВ? В таком случае они быстрее компилируются и обрабатываются.
Способы определения языка 27 Это лишь некоторые леммы, можно составить и другие. Как? Анализируя регулярные множества, порождаемые регулярными выражениями. Если РМ для двух РВ совпадают, то РВ эквивалентны. Например, можно показать, что a * + e = a *; (a + e)* = a*; a *a * = a *; e* = e; и т. д.
Пример определения языка 28 Пример 1. Пусть язык L описывает двоичные числа без незначащих нулей. Имеем функцию переходов: 0 q 0 1 0 q 1 1 q 2 0 1 q 0 q 1 q 2 ERROR q 1 ERROR HALT q 2 q 2 HALT
Пример определения языка 29 0 1 q 0 q 1 q 2 ERROR q 1 ERROR HALT q 2 q 2 HALT Запишем систему регулярных уравнений: q 0 = δ 0 + δ 00 q 0 + δ 01 q 1 + δ 02 q 2 q 1 = δ 1 + δ 10 q 0 + δ 11 q 1 + δ 12 q 2 = δ 2 + δ 20 q 0 + δ 21 q 1 + δ 22 q 2
Пример определения языка 30 0 1 q 0 q 1 q 2 ERROR q 1 ERROR HALT q 2 q 2 HALT Определим её коэффициенты: 1. Полагаем δij = , δi = , i, j = 0, 1, 2; 2. Т. к. δ(q 0, 0) = q 1, то δ 01 = + 0 = 0; 3. Т. к. δ(q 0, 1) = q 2, то δ 02 = + 1 = 1; 4. Т. к. δ(q 2, 0) = q 2, то δ 22 = + 0 = 0;
Пример определения языка 31 0 1 q 0 q 1 q 2 ERROR q 1 ERROR HALT q 2 q 2 HALT Определим её коэффициенты: 5. Т. к. δ(q 2, 1) = q 2, то δ 22 = 0 + 1; 6. Т. к. q 1 F, то δ 1 = e; 7. Т. к. q 2 F, то δ 2 = e.
Пример определения языка 32 Получили систему q 0 = + q 0 + 0 q 1 + 1 q 2 q 1 = e + q 0 + q 1 + q 2 = e + q 0 + q 1 + (0 + 1)q 2 Решаем. Прямой ход: q 0 = *( + 0 q 1 + 1 q 2) = 0 q 1 + 1 q 2 q 1 = e + (0 q 1 + 1 q 2) + q 1 + q 2 = e + (0 q 1 + 1 q 2) + q 1 + (0 + 1)q 2 = e + q 1 + (0 + 1)q 2
Пример определения языка 33 q 1 = *(e + q 2) = e q 2 = e + (0 + 1)q 2 = (0 + 1)* + = (0 + 1)* Обратный ход: q 1 = e q 0 = 0 q 1 + 1 q 2 = 0 e + 1(0 + 1)* = 0 + 1(0 + 1)*
Пример определения языка 34 Пример 2. Пусть язык L описывает числа с фиксированной точкой: +, – q 0 q 1 . 0 -9 q 1 q 2 q 3 q 4 q 4 q 3 HALT q 4 HALT
Пример определения языка 35 +, – q 0 q 1 . 0 -9 q 1 q 2 q 3 q 4 q 4 q 3 HALT q 4 HALT Запишем коэффициенты системы регулярных уравнений: δ 01 = + + –; δ 02 =. ; δ 03 = 0 -9; δ 12 =. ; δ 13 = 0 -9; δ 24 = 0 -9; δ 34 =. ; δ 33 = 0 -9; δ 44 = 0 -9; δ 3 = e; δ 4 = e.
Пример определения языка 36 Получили систему q 0 = + q 0 + (+ + –)q 1 + (. )q 2 + (0 -9)q 3 + q 4 q 1 = + q 0 + q 1 + (. )q 2 + (0 -9)q 3 + q 4 q 2 = + q 0 + q 1 + q 2 + q 3 + (0 -9)q 4 q 3 = e + q 0 + q 1 + q 2 + (0 -9)q 3 + (. )q 4 = e + q 0 + q 1 + q 2 + q 3 + (0 -9)q 4
Пример определения языка 37 Упростим её: q 0 = (+ + –)q 1 + (. )q 2 + (0 -9)q 3 q 1 = (. )q 2 + (0 -9)q 3 q 2 = (0 -9)q 4 q 3 = e + (0 -9)q 3 + (. )q 4 = e + (0 -9)q 4
Пример определения языка 38 Решение. Прямой ход: q 0 = (+ + –)q 1 + (. )q 2 + (0 -9)q 3 q 1 = (. )q 2 + (0 -9)q 3 q 2 = (0 -9)q 4 q 3 = e + (0 -9)q 3 + (. )q 4 = e + (0 -9)q 4
Пример определения языка 39 Решение. Прямой ход: q 1 = (. )q 2 + (0 -9)q 3 q 2 = (0 -9)q 4 q 3 = e + (0 -9)q 3 + (. )q 4 = e + (0 -9)q 4
Пример определения языка 40 Решение. Прямой ход: q 3 = (0 -9)*(e + (. )q 4) q 4 = e + (0 -9)q 4 = (0 -9)*e = (0 -9)* Обратный ход: q 3 = (0 -9)*(e + (. )q 4) = (0 -9)*(e +. (0 -9)*) q 2 = (0 -9)q 4 = (0 -9)* q 1 = (. )q 2 + (0 -9)q 3=. (0 -9)* + (0 -9)*(e +. (0 -9)*)
Пример определения языка 41 Обратный ход: q 3 = (0 -9)*(e + (. )q 4) = (0 -9)*(e +. (0 -9)*) q 2 = (0 -9)q 4 = (0 -9)* q 1 = (. )q 2 + (0 -9)q 3=. (0 -9)* + (0 -9)*(e +. (0 -9)*) q 0 = (+ + –)q 1 + (. )q 2 + (0 -9)q 3 = (+ + –)(. (0 -9)* + (0 -9)*(e +. (0 -9)*)) + +. (0 -9)* + (0 -9)*(e +. (0 -9)*)
Пример определения языка 42 Таким образом, язык L определяется РВ (+ + –)(. (0 -9)* + (0 -9)*(e +. (0 -9)*)) + +. (0 -9)* + (0 -9)*(e +. (0 -9)*) Упростим его. Во-первых, выражение имеет вид (+ + –)a + a. Согласно лемме № 7, (+ + –)a + a = (+ + –)a + ea. Согласно лемме № 5, (+ + –)a + ea = (+ + – + e)a, т. е. получим (+ + – + e)(. (0 -9)* + (0 -9)*(e +. (0 -9)*))
Пример определения языка 43 (+ + – + e)(. (0 -9)* + (0 -9)*(e +. (0 -9)*)) Если использовать операцию a+ = aa*, то получим (+ + – + e)(. (0 -9)+ + (0 -9)+(e +. (0 -9)*)) Можно использовать и другие формы записи, например, (+ + – + e)(. (0 -9)+ + (0 -9)+(e +. (0 -9)*)) = = (+ + – + e)(. (0 -9)+ + (0 -9)+. (0 -9)*)) = = (+ + – + e)((. + e)(0 -9)+ + (0 -9)+. (0 -9)*))


