У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


Ознакою кінця виразу є кінець файла. Суміжні лексеми відокремлюються довільними послідовностями пропусків, можливо, порожніми.

Скористаємося обмеженням на довжину рядків тексту та організуємо читання тексту не окремими символами, а рядками. Черговий рядок стає значенням змінної рядкового типу Str, яка називається образом вхідного рядка, або буфером. Саме з буфера символи по одному добуваються за викликів функції getc.

Функцію getc разом із іншими необхідними означеннями помістимо в окремий модуль Inbuf. Створюючи цей модуль, ми повністю відокремлюємо обробку символів виразу від їх конкретного джерела – файла на диску, клавіатури чи ще чогось.

Додамо указання використання модуля Inbuf до модуля Glx.

Для роботи з буфером, тобто змінною buf типу Str, додамо змінні bufl, bufp та tempc, що зберігатимуть відповідно довжину буфера (кількість символів), позицію в ньому, якою закінчується оброблена частина виразу, та її останній, або поточний символ. Означимо ще сталу finch = chr(0), яка стає значенням поточного символу при закінченні виразу. Стала finch та змінна tempc експортуватимуться з модуля, і за його межами рядок "буде видно крізь віконце tempc".

Перенесемо означення імен finch і tempc з модуля Glx до модуля Inbuf.

Ініціалізацію змінних модуля задає процедура bufinit, виклик якої записано в розділі ініціалізації. Вона також забезпечує можливість задати ім'я файла, з якого треба читати вираз. Функція newln описує заповнення буфера новим вхідним рядком та повернення його першого символу.

Модуль Inbuf має такий загальний вигляд:

Unit Inbuf ( input, output );

Interface

const finch=chr(0);

var tempc : char;

function getc : char;

Implementation

const bufml = 80;

type Str=string[bufml];

var buf : Str;

bufl, bufp : integer;

f : text; nam : Str;

procedure bufinit;

begin

buf := ''; {спочатку буфер – порожній рядок}

bufl := 0; bufp := 0;

tempc := ' '; {штучний пропуск перед початком першого рядка}

writeln('Уведіть ім''я текстового файла з виразом'); readln(nam);

assign(f, nam); reset(f)

end;

function newln : char; … end;

function getc; … end;

Begin

bufinit

End.

Наведемо, нарешті, функції getc і newln.

function getc : char;

begin

bufp := bufp + 1;

if bufp <= bufl then tempc := buf[bufp]

else { рядок вичерпано } tempc := newln;

getc := tempc

end;

При виконанні функції newln у разі наявності наступного рядка повертається пропуск. Він штучно додається перед першим символом рядка, аби той не продовжував лексему в попередньому рядку. У разі кінця файла повертається finch – ознака закінчення виразу:

function newln : char;

begin

if eof(f) then tempc := finch

else

begin

readln (f, buf );

bufp := 0; bufl := length ( buf );

tempc := ' '

end;

newln := tempc

end


Сторінки: 1 2 3 4 5 6 7