XVYggbpFw2
.pdf{
Terminal x; Condition T; char y;
int z,PM;
if(EndOfStream()) return false; T = S;
ClearBufer(); do
{
x = GetNextSymbol(y);
if(x==n) return false; //Недопустимый символ switch(T)
{
case S: switch(x)
{
case p: break; case a: T=E;
if(!BufferIsEmpty())
{
z=GetFromBuffer(PM); if(PM) AddToMassivPlus(z); else AddToMassivMinus(z); ClearBuffer();
}
AddToBuffer(y); break;
case l: T=B; if(!BufferIsEmpty())
{
z=GetFromBuffer(PM); if(PM) AddToMassivPlus(z); else AddToMassivMinus(z); ClearBuffer();
}
break; default: return false;
}
break; case B: switch(x)
{
case a: T=C; AddToBuffer(y); break;
default: return false;
}
break; case C: switch(x)
{
case a:
AddToBuffer(y); break;
case r: T=E; break; default: return false;
}
break; case E: switch(x)
{
case a:
if(!BufferIsEmpty())
{
z=GetFromBuffer(PM); if(PM) AddToMassivPlus(z); else AddToMassivMinus(z); ClearBuffer();
}
AddToBuffer(y); break;
case l: T=B; break; case p: T=S;
break; case s: T=S;
AddToBuffer(y); break;
default: return false;
}
break;
}
} while(!EndOfStream()); switch(T)
{
case S:
case E: return true; default: return false;
}
}
Рассмотренные примеры применения конечных автоматов имеют дело только с регулярными языками. В реальной программистской практике можно, конечно, столкнуться с более сложными ситуациями. Например, если в вашей программе требуется, чтобы пользователь вводил какие-то арифметические операции с использованием скобок, то конечными автоматами уже не обойтись. Как мы видели, даже язык Дика, слова которого ничего кроме правильно расставленных скобок не содержит, не является регулярным.
В таких случаях привлекают КС-грамматики и им соответствующие МП-автоматы (автоматы с магазинной памятью). Но это уже выходит за рамки настоящего пособия.
Упражнения
17.1.Слово алфавита a,b,c назовем правильным, если в нем содержится не более двух непересекающихся подслов abca. Написать программу, распознающую правильные слова.
17.2.Слово алфавита a,b,c назовем правильным, если любая буква c в нем может встречаться только между a и b (a – слева, b – справа и не обязательно рядом с этой c). Например, abccbca – неправильное, abccbcb – правильное. Написать программу, распознающую правильные слова.
17.3.Слово алфавита a,b назовем правильным, если в нем подслово abba может встречаться только между двумя подсловами baab (не обязательно стоящими рядом с abba). Например, babbaab –
неправильное, baabaabbabaab, baabaababaab, abbba – пра-
вильные. Написать программу, распознающую правильные слова.
17.4.Написать программу разбора строки, в которой через один или несколько пробелов записаны целые числа. Любое число кроме нуля не должно начинаться с нуля.
17.5.Написать программу разбора строки, в которой через разделитель “|” записаны несколько сумм положительных целых чисел.
17.6.Написать программу разбора строки, в которой через разделитель “;” с любым количеством пробелов записаны символы азбуки Морзе.
17.7.Некоторые калькуляторы современных мобильных телефонов позволяют вводить арифметические выражения из чисел с использованием операций +,-,*,/. Скобки не используются. Числа могут быть дробными (с десятичной точкой). Написать программу разбора строки с таким выражением. Для простоты все цифры изображать одним и тем же символом (например, “a”).
Литература
1.Белоусов А.И. Дискретная математика [Текст]: учеб. для вузов / А.И. Белоусов, С.Б. Ткачев. – М.: МГТУ, 2004. – 744 с.
2.Карпов Ю.Г. Теория автоматов [Текст]: учеб. для вузов / Ю.Г. Карпов. – СПб: ПИТЕР, 2003. – 208 с.
3.Кузнецов О.П. Дискретная математика для инженера [Текст]: 2-е изд., перераб. и доп. / О.П. Кузнецов, Г.М. Адельсон-Вельский. – М.: Энергоатомиздат, 1988. – 408 с.
4.Мозговой М.В. Классика программирования: алгоритмы, языки, автоматы, компиляторы. Практический подход [Текст] / М.В. Мозговой. – СПб: Наука и техника, 2006. – 320 с.
5.Пентус А.Е. Теория формальных языков [Текст]: учеб. пособие / А.Е. Пентус, М.Р. Пентус. – М.: МГУ, 2004. – 80 с.
6.Рейуорд-Смит В.Дж. Теория формальных языков. Вводный курс [Текст]: Пер. с англ. / В.Дж. Рейуорд-Смит. – М.: Радио и связь,
1988. – 128 с.
7.Теория и реализация языков программирования [Текст]: учеб. пособие / В.А. Серебряков [и др.]. – М.: МЗ Пресс, 2006. – 352 с.
Беляев Владимир Яковлевич
ДИСКРЕТНАЯ МАТЕМАТИКА. ГРАММАТИКИ И АВТОМАТЫ
Учебное пособие
Подписано в печать 25.09.2019. Формат 60×90/16. Усл. печ. л. 6,5. Тираж 300 экз.
Отпечатано в редакционно-издательском отделе (РИО) МАГУ.
Мурманский арктический государственный университет. 183038, г. Мурманск, ул. Капитана Егорова, 15.