Реферат на тему:
Уточнення алгоритму обчислення виразу
Напишемо функцію llxval обчислення значення виразу за його ЗПЗ, що подається послідовністю лексем. У цій функції використовуються засоби з модуля SLlx:
— функція перевірки вичерпання послідовності лексем із заголовком
functionisemllx ( Llx: Sqlx ): boolean;
-процедура добування й вилучення першого елемента послідовності лексем із заголовком
procedureget ( varLlx: Sqlx; varlx: Tlx ).
Крім того, використовуються підпрограми обробки магазина лексем, про які сказано в попередньому підрозділі.
functionllxval ( varLlx: Sqlx ): real;
varSlx: Stlx; lx, lx1, lx2: Tlx; ok: boolean;
begin
inits( Slx ); ok := true;
whilenotisemllx( Llx ) andok do
begin
get( Llx, lx);
caselx.stl of
con: push( Slx, lx );
ops: begin
pop( Slx, lx2 ); pop( Slx, lx1 );
caselx.sig of
'+': lx1.numb := lx1.numb + lx2.numb;
'-': lx1.numb := lx1.numb — lx2.numb;
'*': lx1.numb := lx1.numb * lx2.numb;
'/': iflx2.numb 0 then
lx1.numb := lx1.numb / lx2.numb
else ok := false
end;
ifok thenpush( Slx, lx1 )
end;
nam: begin
pop( Slx, lx1 );
iflx.name = 'sin' then
lx1.numb := sin( lx1.numb ) else
iflx.name = 'cos' then
lx1.numb := cos( lx1.numb );
push( Slx, lx1 )
end
end{ case lx.stl }
end; { while }
ifok then
begin pop( Slx, lx1); llxval := lx1.numb end
else
begin
writeln( '***zerodivide***' ); llxval := 0
end
end;
Множини в мові Паскаль
У підпрограмах розроблюваного модуля читання лексем доведеться мати справу з множинами символів. Подання та обробку множин символів та значень інших перелічуваних типів у мові Паскаль зручно задавати з використанням спеціальних типів множин.
Стала-множина задається в дужках [] переліком елементів або діапазонів. Наприклад, множина чисел {1, 2, 3, 5} подається як [1, 2, 3, 5] або [1..3, 5], порожня множина – як [], множина символів {'a', 'i', 'j', 'k', 'l', 'm', 'n'} – як ['a', 'i'..'n'].
Якщо Tзадає перелічуваний тип, то вираз setofT означає множинний тип. Елементами його носія є підмножини носія типу T. Наприклад, носій типу setofBoolean складається з 4-х множин бульових значень: [], [false], [true], [false, true]; носій типу setof'a'..'z' – з 226підмножин малих латинських літер. Тип Tназивається базовимдля типу setofT.
В історії розвитку мови Паскаль склалося так, що носій базового типу не може мати більше 256 елементів. Наприклад, вираз setof1..512 недопустимий. У внутрішньому зображенні множини кожному елементу носія базового типу відповідає 1 біт і дані множинних типів займають не більше 256/8 = 32 байтів.
Найпростішими виразами типу множинає сталі, тобто списки виразів і діапазонів базового типу в квадратних дужках []. Інші вирази будуються з однотипних множинних сталих і змінних та знаків бінарних операцій '+', '*', '-', що позначають відповідно об'єднання, перетин і різницю множин.
Приклад 1.Нехай за дії означення varv: setof0..9 виконано оператор присвоювання v:=[1..3]. Тоді вираз v+[2..4] має значення [1..4], v*[2..4] – значення [2..3], v-[2..4] – значення [1].
Бульові вирази вигляду S1= S2(S1 S2) задають перевірку на рівність (нерівність) значень однотипних множинних виразів S1і S2. Аналогічно вирази S1S2(S1>= S2) задають перевірку включення S1у S2(S2в S1). Наприклад, значеннями виразів [1..3]=[1, 2, 3] та [1, 2]true, а виразів [1]>=[1..2] та [1, 2][2, 1] – false.--PAGE_BREAK--
Булів вираз вигляду einS, де тип виразу eє базовим для множинного типу виразу S, задає перевірку належності значення eмножині S.
Вирази типу множина можна присвоювати змінним того ж самого типу.
Приклад 2.Нехай діє означення типів рядків Str і множин символів SS = setofchar. Тоді:
1) процедура Symset задає побудову множини SS символів рядка A:
procedureSymset ( A: Str; varS: SS );
vari: integer;
begin
S := [];
fori:= 1 tolength(A) do S := S + [ A[i] ]
end;
2) функція EqSS задає перевірку рівності множин символів двох рядків:
functionEqSS ( A, B: Str ): boolean;
varS1, S2: SS;
begin
Symset (A, S1);
Symset (B, S2);
EqSS := (S1 = S2)
end;
3) функція SettoStr задає побудову рядка з символів-елементів множини в порядку їхнього кодування:
functionSettoStr ( S: SS): Str;
varA: Str; c: char;
begin
A := '';
forc := chr(0) tochr(255) do
ifc in S thenA := A + c;
SettoStr := A
end.
атні 2, потім кратні 3 тощо.