Уточнення алгоритму обчислення виразу
Напишемо функцію 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 тощо.