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

Составные символы, комментарии и т.п. 0^ 1x^y


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

 

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

\begin{displaymath}
\begin{tabular}
{\vert l\vert l\vert l\vert l\vert}
\hline
С...
 ...& основное & печатать {\hbox{\tt *}}, $x$\\ \hline\end{tabular}\end{displaymath}

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

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


$\scriptstyle{\blacktriangleright}$ 5.1.2. Написать программу, удаляющую из текста все подслова вида abc.$\scriptstyle\blacktriangleleft$


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

 
                begin {начало цикла}
                i:=i+1; {увеличиваем i на 1}
Написать программу, которая удаляла бы комментарии и вставляла бы вместо исключенного комментария пробел (чтобы 1{один}2 превратилось не в 12, а в 1 2).

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

0{ 1} \begin{displaymath}
\begin{tabular}
{\vert l\vert l\vert l\vert l\vert}
\hline
С...
 ...утри & $x\ne \box1$\space & внутри & нет \\ \hline\end{tabular}\end{displaymath}$\scriptstyle\blacktriangleleft$

Замечание. Эта программа не воспринимает вложенные  комментарии: строка вроде
       {{комментарий внутри} комментария}
превратится в
         комментария}
(в начале стоят два пробела). Обработка вложенных комментариев конечным автоматом невозможна (нужно << помнить число скобок>> -- а произвольное натуральное число не помещается в конечную память).


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

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


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

      i:=i+1;     (*   here i is increased by 1  *)
при этом закрывающая скобка должна соответствовать открывающей (то есть {$\ldots{\hbox{\tt *)}}$ не разрешается). Как удалять такие комментарии?$\scriptstyle\blacktriangleleft$



pvv
1/8/1999