Формулировка задачи: Программа читает текстовый файл, выделяет слова и распознает идентификаторы. Имя текстового файла запрашивается. На экран выдается список слов по одному слову в строку, идентификаторы помечаются символом *. Разделителем не является признак конца строки.
Спецификации (типы данных и структуры данных):
Определяются три состояния чтения текста:
· ident – подозрение на идентификатор,
· news – начало чтения нового слова,
· ordin – читаемое слово не идентификатор.
Состояния объединены в перечислимый тип status.
chars – множество всех символов, letter, digit и separ - подмножества букв, цифр и разделителей слов, соответственно.
Процедуры и функции - нет.
Алгоритм:Чтение (из файла) посимвольно. Определяется изменение состояния в зависимости от состояния s и вновь прочитанного символа c. Начальное состояние - news.
Входной алфавит V – буква, цифра, разделитель, символ.
Алфавит состояний Q – News, Ident, Ordin.
Функция переходов f:Q´V®Q:
| буква
| цифра
| разделитель
| символ
|
News
| Ident
| Ordin
| News
| Ordin
|
Ident
| Ident
| Ident
| News
| Ordin
|
Ordin
| Ordin
| Ordin
| News
| Ordin
|
Начальное состояние – News
Множество заключительных состояний – {}
{Symplest scaner}
program Symplest_Scanner;
{Программа читает текстовый файл,
выделяет слова и распознает идентификаторы}
type
status=(ordin,ident,news);
chars=set of char;
var
letter,digit,separ:chars;
anytxt:string;
s:status;
i:integer;
c:char;
F:text;
begin
letter:=['A'..'Z','a'..'z'];
digit :=['0'..'9'];
separ :=[' '];
repeat
writeln(' Введите имя обрабатываемого файла');
readln(anytxt);
assign(F,anytxt);
{$I-} reset(F); {$I+}
i:=IOResult;
if i<>0 then
writeln(' Ошибочка ',i:3,' , попробуйте еще раз');
until i=0;
s:=news;
while not eof(F) do
begin
while not eoln(F) do
begin
read(F,c);
write( c);
case s of
news : if c in letter then s:=ident
else if not(c in separ) then s:=ordin;
ident: if c in separ then
begin s:=news; writeln('*') end
else
if not((c in letter) or (c in digit))
then s:=ordin;
ordin: if c in separ
then begin s:=news; writeln end;
end;
end;
if s=ordin then begin s:=news; writeln end;
if s=ident then begin s:=news; writeln(' *') end;
readln(F);
end;
end.