Лекции по дискретке (1021001), страница 21
Текст из файла (страница 21)
В связи с тем, что нули не влияют на состояние автомата, каждая единица изменяет его состояние с А на В и с В на А, и начальное состояние является тем же, что и последнее состояние. Язык, принимаемый автоматом, состоит из тех строк, которые содержат четное число единиц.
Переходы можно представить также с помощью таблицы и схематически:
Определение.
Автомат называется детерминированным, если в каждом элементе таблицы переходов содержится одно состояние. В недетерминированном конечном автомате это положение не выдерживается.
Следовательно, автомат — детерминированный.
65.Последовательность выполнения.
Для выполнения лабораторной работы требуется умение писать программы на алгоритмическом языке, а также начальные знания по порождающим грамматикам.
Таким образом, последовательность выполнения лабораторной работы следующая:
-
Ознакомится с теорией регулярных грамматик.
-
В соответствии с заданным регулярным выражением написать регулярную грамматику.
-
Записать соответствующий детерминированный конечный автомат с указанием таблицы переходов.
-
Написать и отладить на компьютере синтаксический анализатор, распознающий выражения регулярного языка.
-
Привести контрольную распечатку.
-
Оформить отчет.
Работа считается выполненной только после оформления отчета, защиты и подписи преподавателя.
66.Методический пример.
Программа "grammatika", представляющая синтаксический анализатор, соответствующий детерминированному конечному автомату М, имеет следующий вид:
program grammatika;
uses crt;
type perehod = record
old, term, new: char;
end;
var sost:array [1 .. 13] of perehod;
stroka: string [255];
sim, neterm: string [1];
dlina, n, i: integer;
ok: boolean;
begin { блок определения таблицы переходов }
sost[1].old :='S'; sost[1].term :='2'; sost[1].new := 'A';
sost[2].old :='A'; sost[2].term :='2'; sost[2].new := 'B';
sost[3].old :='B'; sost[3].term :='1’; sost[3].new := 'C';
sost[4].old := 'C'; sost[4].term := 'b'; sost[4].new := 'S';
sost[5].old := 'S'; sost[5].term := 'b'; sost[5].new := 'D';
sost[6].old :='D'; sost[6].term :='2'; sost[6].new :='E';
sost[7].old :='E'; sost[7] .term := '1'; sost[7].new :='F';
sost[8].old := 'F'; sost[8].term := 'b'; sost[8].new := 'D';
sost[9].old := 'F'; sost[9].term := '2'; sost[9].new := 'K';
sost[10].old:='B'; sost[10].term :='2'; sost[10].new := 'K';
sost[11].old := 'K'; sost[11].term := '2'; sost[11].new := 'L';
sost[12].old := 'L'; sost[12].term := '2'; sost[12].new := 'M';
sost[13].old := 'M'; sost[13].term := '2'; sost[13].new := 'L';
clrscr;
{ блок основной программы }
while TRUE do begin
writeln ('Введите строку символов’);
readln (stroka);
dlina := length (stroka);
n:=0;
ok :=' TRUE;
neterm := 'S';
while ok and (n < dlina) do
begin i := 0;
n:=n+ 1
sim := copy (stroka, n, 1);
ok := FALSE;
repeat i:=i+l;
if ((sost [i].old = neterm) and
(sost [i].term = sim)) then
begin
ok := TRUE;
neterm := sost[i].new;
end;
until ( ok or (i = 13));
end;
if ((neterm = 'S') or (neterm = 'B') or (neterm = 'F') or (neterm = 'L') and ok then writeln ('Данная строка принадлежит языку')
else writeln ('Данная строка не принадлежит языку'); readkey; end; end.
67.Контрольная распечатка.
Введите строку символов 221b2
Данная строка не принадлежит языку
Введите строку символов 221b221b221b
Данная строка принадлежит языку
Введите строку символов b21
Данная строка принадлежит языку
Введите строку символов b21b21
Данная строка принадлежит языку
Введите строку символов 22222222
Данная строка принадлежит языку
Ведите строку символов 221b221bb21b21b212222
Данная строка принадлежит языку
Введите строку символов 211b
Данная строка не принадлежит языку
Введите строку символов
Данная строка принадлежит языку
68.Замечания.
1. Синтаксический анализатор "grammatika" реализован исходя из вида детерминированного конечного автомата. Этот же самый анализатор может иметь множество других программных реализаций, как-то:
a) в качестве основы может быть взята грамматика;
b) могут использоваться различные программные конструкции языков программирования и другие причины.
2. Синтаксический анализатор может быть реализован на любом, доступном студенту, алгоритмическом языке: PL, Си, TURBO Pascal, ассемблер, BASIC и других. Нельзя на PHP, PERL.
В качестве иллюстрации приведем синтаксический анализатор, реализованный на языке ассемблера.
Пусть задано регулярное выражение (cc) (ba10)* (0а)*, т. е. имеется язык:
L75 = {(cc)m (balO)n (Oa)p : m, n, p > 0}.
Один из вариантов синтаксического анализатора на языке ассемблера имеет следующий вид.
TITLE (cc)* (bа10)*(0а)* code segment
assume cs:code, ds:code
org l00h begin: JMP MAIN
;------------------------------------------------------
clf egu OAh, ODh
OKMSG db clf, 'O-K TESTED ! $'
ERMSG db clf, 07h, 'Invalid simvol !', '$'
WMSG db clf, 'Press the ENTER for exit!', '$'
;————————————————
MAIN proc
S: call GCHR
cmp al, Odh
jeOK
cmp al,'c'
jeT
cmp al, 'b'
jeV
cmp al, '0'
jeY
jmpNO T:
T: call GCHR
cmp al, 'c'
jeS jmpNO
V: call GCHR cmp al, 'a' jeW jmpNO
W:call GCHR cmp al, ' 1' jeX jmpNO
X: call GCHR
cmp al, '0'
je U
jmp NO
U: call GCHR
cmp al, 'b'
je V
cmp al, '0'
je Y
cmp al, Odh
je OK
jmp NO
Y: call GCHR
cmp al, 'a'
je Z
jmp NO
Z: call GCHR
cmp al,'0'
je Y
cmp al, Odh
je OK
NO: lea dx, ERMSG
mov ah, 09h
Int 21h
call WAI
ret
OK: lea dx, OKMSG
mov ah, 09h
Int 21h
call WAI
ret
MAIN endp
;------------------------------------------------------
GCHR proc
mov ah, Olh
Int21h
Ret
GCHR endp
;--------------------------------------------------------------------
WAI proc
lea dx, WMSG
mov ah, 09h
Int 21h
call GCHR
cmp al, Odh
jne WT
ret WAI endp
;------------------------------------------------------
code ends
end begin ; IT WORKS !
синтаксического анализатора (на любом из реализованных на компьютерной технике.
69.Отчет по практической работе.
Отчет оформляется в соответствии с требованиями, предъявляемыми к оформлению лабораторных работ в вузе, и должен содержать:
-
Титульный лист.
-
Наименование и цель работы.
-
Исходные данные варианта задания.
-
Алгоритм решения задачи (граф, таблица переходов).
-
Листинг программы с исходными и выходными данными (листинг программы).
-
Анализ результатов (контрольная распечатка).
-
Выводы.
Замечание: листы отчета должны быть скреплены.
70.Контрольные вопросы
-
Какие грамматики называются регулярными?
-
Чем отличается детерминированный конечный автомат от недетерминированного?
-
Связь регулярных грамматик и конечных автоматов.
-
Что такое регулярное выражение?
-
Алгоритм получения детерминированного конечного автомата из недетерминированного.
-
Какие программные особенности отмечены при написании синтаксического анализатора.
-
Что такое состояние отказа в автомате, соответствующем анализатору?
-
Что такое грамматика?
71.Варианты заданий.
Вариант задания определяется по последним двум цифрам зачётной книжки.
-
(0110)* (1101)* (0111)*
-
(abaa)* (baba)* (abbb)*
-
(a120)* (a001)* (baa0)*
-
(a1b1)* (11a1)* (b1aa)*
-
(21b)* (112b)* (b122)*
-
(baba)* (abab)* (aaba)*
-
(1011)* (1100)* (0001)*
-
(a1b1)* (b12a)* (bb1)*
-
(bba1)* (11aa)* (1ba1)*
-
(b211)* (1abb)* (b11a)*
-
(ab11)* (a11b)* (1aa1)*
-
(bb12)* (2bb1)* (1b21)*
-
(1000)* (1001)* (0001)*
-
(1ab1)* (2b22)* (ab1b)*
-
(ba21)* (1bba)* (2a11)*
-
(ba22)* (11bb)* (2baa)*
-
(0001)* (1011)* (1000)*
-
(bb2a)* (a2bb)* (12ba)*
-
(1b0a)* (1ab2)* (120a)*
-
(1ab0)* (11ab)* (11a0)*
-
(bba2)* (bb01)* (bb0a)*
-
(bb00)* (a12b)* (baab)*
-
(1100)* (1000)* (1011)*
-
(1abb)* (1aa0)* (1bbb)*
-
(2110)* (1210)* (1101)*
-
(baba)* (cbab)* (abbb)*
-
(1010)* (c010)* (1110)*
-
(01ab)* (ba10)* (a10a)*
-
(a010)* (0010)* (0110)*
-
(ab11)* (11ab)* (a1a1)*
-
(ccaa)* (0caa)* (a0ca)*
-
(a010)* (0011)* (1001)*
-
(1001)* (1aa0)* (0a11)*
-
(10a1)* (0011)* (1100)*
-
(a100)* (01a0)* (11aa)*
-
(a010)* (01a0)* (aa11)*
-
(01a0)* (a011)* (010a)*
-
(10a0)* (1a01)* (110a)*
-
(1b01)* (01b1)* (b1b1)*
-
(1101)* (c010)* (00cc)*
-
(0c10)* (0101)* (1101)*
-
(abca)* (caca)* (baba)*
-
(0001)* (0101)* (0a10)*
-
(00a1)* (a110)* (a10a)*
-
(11a0)* (a01a)* (01a0)*
-
(10a1)* (0a10)* (01a0)*
-
(ca0a)* (caca)* (c0c0)*
-
(01cc)* (cc10)* (c01c)*
-
(01aa)* (1010)* (a00a)*
-
(a00a)* (01a0)* (0a01)*
-
(0aa1)* (a001)* (a0a1)*
-
(0a01)* (10a1)* (0a10)*
-
(10a1)* (0a10)* (a1a1)*
-
(a0a0)* (a001)* (0a1a)*
-
(aa01)* (01aa)* (000a)*
-
(a01a)* (a001)* (00a0)*
-
(0a10)* (a101)* (a001)*
-
(0a10)* (00a1)* (a100)*
-
(1a01)* (a101)* (001a)*
-
(1a01)* (0a10)* (a01a)*
-
(1021)* (2021)* (2010)*
-
(2010)* (2100)* (2220)*
-
(2102)* (2201)* (2202)*
-
(2010)* (0012)* (2001)*
-
(1010)* (2001)* (2220)*
-
(1210)* (0201)* (2202)*
-
(01a0)* (01a1)* (1a01)*
-
(a101)* (a110)* (a10a)*
-
(1202)* (2102)* (2001)*
-
(0012)* (2011)* (1021)*
-
(abab)* (baba)* (bbaa)*
-
(baab)* (abab)* (bbaa)*
-
(a101)* (1a01)* (0a11)*
-
(1a01)* (a10a)* (a101)*
-
(0a10)* (a111)* (aa10)*
-
(a10a)* (a101)* (a1aa)*
-
(aaa0)* (a010)* (011a)*
-
(a010)* (a1a0)* (a100)*
-
(aa11)* (100a)* (0a10)*
-
(10aa)* (a0a1)* (1a10)*
-
(a10a)* (a1a0)* (01a1)*
-
(a10a)* (a1a0)* (00a1)*
-
(a1a0)* (0a01)* (a101)*
-
(1a01)* (a1a0)* (a0a1)*
-
(abac)* (caba)* (baca)*
-
(1010)* (1c01)* (cc10)*
-
(01c0)* (0110)* (c0c0)*
-
(0c01)* (c01c)* (c110)*
-
(1012)* (2100)* (0120)*
-
(1021)* (1210)* (2210)*
-
(1101)* (2010)* (2012)*
-
(2010)* (1021)* (2121)*
-
(caba)* (cabb)* (abac)*
-
(abab)* (abcc)* (ccab)*
-
(caca)* (baba)* (bacc)*
-
(abca)* (abca)* (cbaa)*
-
(0120)* (0012)* (2100)*
-
(abab)* (cbcc)* (baca)*
-
(baca)* (babc)* (cbba)*
-
(babb)* (aacb)* (ccab)*
-
Практическое занятие №2. Работа с регулярными выражениями на основе PERL .
72.Общие указания к выполнению практической работы.
Практические работы выполняются с использованием персональных компьютеров. Указания по технике безопасности совпадают с требованиями, предъявляемыми к пользователю ЭВМ. Другие опасные факторы отсутствуют.
73.Цель работы
Ознакомиться и научиться составлять регулярные выражения в синтаксисе языка PERL. Научиться применить полученные знания к задаче поиска текста по шаблону в файлах.
74.Теоретические сведения.
8.03.1. Регулярные выражения (шаблоны).
Определение.
Регулярные выражения (англ. regular expressions, сокр. RegExp, RegEx) — это формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (терминалов). По сути это строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов (не терминалов), метасимволов (терминалов) и задающего правило поиска (продукций).
Регулярные выражения или шаблоны (pattern) то же самое, что и regexp процедуры в Unix. Выражения и синтаксис заимствованы из свободно распространяемых процедур V8 Генри Спенсера (Henry Spencer).
В шаблонах используются следующие метасимволы (символы обозначающие группы других символов) часто называемые egrep‑стандартом:
¦ \ — считать следующий метасимвол как обычный символ.
¦ ^ — начало строки
¦ . — один произвольный символ. Кроме “\ n” — конец строки.
¦ $ — конец строки
¦ | — альтернатива (или)