Опубликован: 08.04.2009 | Доступ: свободный | Студентов: 485 / 0 | Длительность: 17:26:00
Специальности: Программист
Лекция 5:

Конечные автоматы и обработка текстов

< Лекция 4 || Лекция 5: 12 || Лекция 6 >

5.1. Составные символы, комментарии и т.п.

5.1.1. В тексте возведение в степень обозначалось двумя идущими подряд звездочками. Решено заменить это обозначение на \verb|^| (так что, к примеру, x**y заменится на {x}\verb|^|{y} ). Как это проще всего сделать? Исходный текст читается символ за символом, получающийся текст требуется печатать символ за символом.

Решение. В каждый момент программа находится в одном из двух состояний: "основное" и "после" (звездочки):

Состояние Очередной входной символ Новое состояние Действие
основное * после нет
основное \ne * основное печатать x
после * основное печатать ^
после \ne * основное печатать *, x

Если в конце текста программа оказывается в состоянии "после", то следует напечатать звездочку (и кончить работу).

Замечание. Наша программа заменяет *** на \verb|^*| (но не на \verb|*^| ). В условии задачи мы не оговаривали деталей, как это часто делается - предполагается, что программа "должна действовать разумно". В данном случае, пожалуй, самый простой способ объяснить, как программа действует - это описать ее состояния и действия в них.

5.1.2. Написать программу, удаляющую из текста все подслова вида abc.

5.1.3. В паскале комментарии заключаются в фигурные скобки:

begin {начало цикла}
i:=i+1; {увеличиваем i на 1}

Написать программу, которая удаляла бы комментарии и вставляла бы вместо исключенного комментария пробел (чтобы \verb|1{один}2| превратилось не в \verb|12|, а в \verb|1 2| ).

Решение. Программа имеет два состояния: "основное" и "внутри" (комментария).

Состояние Очередной входной символ Новое состояние Действие
основное Y внутри нет
основное x \ne основное печатать x
внутри } основное печатать пробел
после x \ne внутри нет

Замечание. Эта программа не воспринимает вложенные комментарии: строка вроде

{{комментарий внутри} комментария}

превратится в

комментария}

(в начале стоят два пробела). Обработка вложенных комментариев конечным автоматом невозможна (нужно "помнить число скобок" - а произвольное натуральное число не помещается в конечную память).

5.1.4. В паскалевских программах бывают также строки, заключенные в кавычки. Если фигурная скобка встречается внутри строки, то она не означает начала или конца комментария. В свою очередь, кавычка в комментарии не означает начала или конца строки. Как изменить программу, чтобы это учесть?

Указание. Состояний будет три: основное, внутри комментария, внутри строки.

5.1.5. Еще одна возможность многих реализаций паскаля - это комментарии вида

i:=i+1;     (*   here i is increased by 1  *)

при этом закрывающая скобка должна соответствовать открывающей (то есть {\{}\ldots{*)} не разрешается). Как удалять такие комментарии?

< Лекция 4 || Лекция 5: 12 || Лекция 6 >