Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по тяпу.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
807.52 Кб
Скачать

1. Операции над языками. Регулярные выражения.

На этапе лексического анализа необходимо распознавать, к какому классу принадлежит данная лексема. Задача состоит в построении лексических символов. Для каждого слова определяется формальный язык – множество последовательностей символов. Эти множества можно определять по индукции, т. е. берем базовое множество символов (элементов языка), а затем из них строим слова. В качестве базовых элементов могут выступать буквы или цифры.

Над множеством строк можно выполнять следующие операции:

1) Объединение (альтернатива). Если заданы два языка L и M, то объединением этих языков будет множество строк, каждое из которых принадлежит L или M:

L M = {s | s L s M}

2) Конкатенация (сцепление строк). Если заданы языки L и M, то их конкатенацией будет язык, элементы которого получены путем приписывания элементу из L элемента из M:

LM = { append(s1, s2) | s1 L s2 M}

Если L – это цифра, а M – буква, то LM = {“a1”, “a2”, …}

3) Замыкание Клини (итерация): обозначается как L* и получается объединением всех языков Li, где 0 ≤ i ≤ ∞ .

L0 L1 L2L* = i=0 Li

где L1 = L, L2 = LL (кусочки по два элемента), L3 = LL2, L0 =  - пустая строка.

4) Положительное замыкание Клини (без пустой строки):

L+ = i=1 Li

Такими операциями определяется язык, на основе которого строятся лексические единицы.

Формальные языки можно определить, пользуясь регулярными выражениями. С их помощью можно показать, как строятся элементы языка. Регулярные выражения над алфавитом  определяются индуктивно.

Операции, используемые в регулярных выражениях:

1)  (пустая строка) – это регулярное выражение, обозначающее множество, состоящее из одной пустой строки {}.

2) если a  , то a является регулярным выражением, обозначающим язык, содержащий один символ a - {a}.

3) если r и s – регулярные выражения, обозначающие языки, то L(r) и L(s), то можно построить следующие варианты выражений:

- (r) – регулярное выражение

- r|s – объединение (альтернатива) L(r) L(s)

- rs – конкатенация L(r)L(s)

- r* - регулярное выражение, обозначающее замыкание Клини L(r)*

Приоритет операций: замыкание Клини, конкатенация, альтернатива.

Цифра: (0|1|2|3…9)

Идентификатор: буква (буква | цифра)*.

Для каждого регулярного выражения можно построить НКА, для любого НКА можно построить ДКА, ДКА можно минимизировать, т.е. находить автомат с минимальным числом состояний.

2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.

Если язык задан регулярными выражениями, то для него можно построить конечный автомат.

КА представляется диаграммой переходов. Узлы - состояния, дуги – переходы, финальное состояние - двойной кружок (рис. конечный автомат для (a+b)*). Цепочка принимается автоматом, если существует путь из начального состояния в конечное, метки дуг которого формируют эту цепочку.

Автомат называется недетерминированным, если у него есть переходы из одного и того же состояния, помеченные одним и тем же символом, и если в нем присутствуют  - переходы.

Формально КА определяется пятеркой <S, , , s0, F>,

S – конечное множество состояний;

 – конечное множество входных символов (алфавит);

d – отношение переходов, это подмножество S на Σ, к которому добавлена пустая строка; s ×( {})×s

s0начальное состояние; s0 S

F S – множество финальных состояний.

Для каждой пары (начальное состояние и входной символ) можно определить множество конечных состояний.

Считая  функцией, через  (s,а) будем обозначать множество состояний, в которые конечный автомат может перейти из состояния s по входному сигналу а. Пользуясь функцией , можно описать поведение конечного автомата.

Функция переходов -  определяет для заданного состояния s и входной последовательности w множество состояний, в которых может оказаться автомат, обработав входную строку w. Определяется:

1) s’ (S,) если s’ (s, )

2) s (S,) если есть путь по  переходам, т.е. если есть состояние s’’ (S,) и одновременно s (s’’,)

3) когда строка не пустая: s (S,aw), если есть состояние s’’ (s, а) и s (s’’,w).

Язык распознается конечным автоматом, если он является множеством последовательностей:

Например, автомат A = <S, Σ, δ, so, F> распознаёт последовательности (язык):

L(A) { w | Δ(s0,w) ∩ F ≠ ∅ }, если автомат детерминированный: L(A) { w | Δ(s0,w) ∅ }.