Case end_com:switch(current)

{

case'*':;

case'/':where=out;

default:where=in_com;

}

}

}

fclose(f_in);

fclose(f_out);

}

Розглянемо ще кілька прикладів.

1. Нехай необхідно зі вхідного файла виділити ідентифікатори, що містять цифри. Припустимо для простоти, що синтаксично ідентифікатори записані правильно.

Для класифікації послідовностей символів визначимо такі множини:

L – 'A'..'Z', 'a'..'z', '_';

D – '0'..'9';

R роздільники ' ', '.', ',', ':', ';', '-', '+', EOL;

Визначимо стани, у яких знаходитиметься СА:

I – очікування появи ідентифікатора;

L – обробка ідентифікатора. Очікування появи цифри;

LD – обробка ідентифікатора з цифрою. Очікування кінця ідентифікатора.

Автомат має виконувати такі дії:

M – пропустити символ;

А – записати символ у буфер;

W – вивести буфер у вихідний файл і очистити;

С – очистити буфер.

Складемо діаграму станів СА (рис. 9.6).

Рис. 9.6

2. Нехай маємо послідовність символів x1...xn. Визначити, чи є в ній символи "abcd", що йдуть один за одним. Іншими словами, вимагається з'ясувати, чи міститься в слові Х підслово "abcd".

Проглядатимемо слово Х зліва направо в очікуванні появи символу 'a'. Як тільки він з'явиться, чекаємо появи за ним символу 'b', потім 'c' і, нарешті, 'd'.

Таким чином, ми в кожен момент знаходимося в одному з таких станів: початковий (0), очікування b після а (A), очікування с після ab (B), очікування d після abc (C) і вихід після abcd (D).

Складемо діаграму станів (рис. 9.7).

Рис. 9.7

Стан Exit означає закінчення роботи. Напишемо відповідну програму:

enum states{A,B,C,D};

enum boolean{false,true};

char current;

boolean stop;

states where;

FILE*f_in;

main(){

where=A;

stop=false;

f_in=fopen("c:\\text_in.txt");

while(!feof(f)||stop)

{

current=getc(f_in);

Switch (where)

{


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: