Информационные технологии

Меню

Реклама

Уточнение алгоритма вычисления выражения

Напишем функцию llxval вычисления значения выражения за его ЗПЗ, что подается последовательностью лексем. В этой функции используются средства из модуля SLlx :

- функция проверки исчерпания последовательности лексем с заглавием

Function isemllx Llx : Sqlx: boolean;

-процедура добывание и исключение первого элемента последовательности лексем с заглавием

Procedure get Var Llx: Sqlx; Var lx: Tlx.

Кроме того, используются подпрограммы обработки магазина лексем, о которых сказано в предыдущем подразделении.

Function llxval Var Llx: Sqlx: real;

Var Slx: Stlx; lx, lx1, lx2: Tlx; ok: boolean;

Begin

Inits Slx; ok:= True;

While Not isemllx Llx And ok Do

Begin

Get Llx, lx;

Case lx. stl Of

Con: push Slx, lx;

Ops: Begin

Pop Slx, lx2; pop Slx, lx1;

Case lx. sig Of

'+': lx1.numb:= lx1.numb + lx2.numb;

'-': lx1.numb:= lx1.numb - lx2.numb;

'': lx1.numb:= lx1.numb lx2.numb;

'/': If lx2.numb 0 Then

Lx1.numb:= lx1.numb / lx2.numb

Else Ok:= False

End;

If ok Then push Slx, lx1

End;

Nam: Begin

Pop Slx, lx1;

If lx. name = 'sin' Then

Lx1.numb:= sin lx1.numb Else

If lx. name = 'cos' Then

Lx1.numb:= cos lx1.numb;

Push Slx, lx1

End

End { Case Lx. stl }

End; { While }

If ok 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 задает перечисляемый тип, то выражение Set Of T означает Множественный тип. Элементами его носителя являются подмножества носителя типа T. Например, носитель типа Set Of Boolean состоит из 4-х множеств бульових значений : [], [False], [True], [False, True]; носитель типа Set Of 'a'.'z' - из 226 подмножеств малых латинских букв. Тип T называется Базовым для типу Set Of T.

В истории развития языка Паскаль сложилось так, что носитель базового типа не может иметь больше 256 элементов. Например, выражение Set Of 1.512 недопустимый. Во внутреннем изображении множества каждому элементу носителя базового типа отвечает 1 бит и данные множественных типов занимают не больше 256/8 = 32 байтов.

Самыми простыми Выражениями типа множество Есть стали, то есть списки выражений и диапазонов базового типа в квадратных скобках []. Другие выражения строятся из однотипных множественных постоянных и переменных и знаков бинарных операций '+', '''-', что помечают соответственно объединение, пересечение и разницу множеств.

Пример 1. Пусть за действия определения Var v: Set Of 0.9 выполнено оператор присвоения v :=[1.3]. Тогда выражение v+[2.4] имеет значение [1.4], v[2.4] - значение [2.3], v -[2.4] - значение [1].

Бульови выражения вида S1 = S2 S1 S2 задают проверку на равенство неравенство значений однотипных множественных выражений S1 и S2. Аналогично выражения S1 = S2 S1 = S2 задают проверку включения S1 в S2 S2 в S1. Например, значениями выражений [1.3]=[1, 2, 3] но [1, 2]=[1.3] есть True, а выражений [1]=[1.2] но [1, 2][2, 1] - False.

Булей выражение вида E In S, где тип выражения E является базовым для множественного типа выражения S, задает проверку принадлежности значения E множеству S.

Выражения типа множество можно присваивать переменным того же типу.

Пример 2. Пусть действует определение типов строк Str и множеств символов SS = Set Of char. Тогда:

1 процедура Symset задает построение множества SS символов строки A :

Procedure Symset A : Str; Var S: SS;

Var i: integer;

Begin

S:= [];

For i:= 1 To lengthA Do S:= S + [ A[i] ]

End;

2 функция EqSS задает проверку равенства множеств символов двух строк :

Function EqSS A, B: Str: boolean;

Var S1, S2: SS;

Begin

Symset A, S1;

Symset B, S2;

EqSS:= S1 = S2

End;

3 функция SettoStr задает построение строки из символов-элементов множества в порядке их кодировки:

Function SettoStr S : SS: Str;

Var A: Str; c: char;

Begin

A:= '';

For c:= chr0 To chr255 Do

If c in S Then A:= A + c;

SettoStr:= A

End.

Атни 2, потом кратные 3 и тому подобное.