Programem wykonywalnym jest tylko program kompletny. Program kompletny składa się z modułu głównego, nazywanego krótko programem oraz zmiennych, zmiennych i procedur, pochodzących z modułów bibliotecznych nazywanych bibliotekami.
W ogólnym przypadku, deklaracja programu ma postać:
program name;
uses liblist;
błock.
w której name Jest nazwą programu, liblist \es\. listą identyfikatorów bibliotek, a block jest blokiem.
Poprawna jest również deklaracja, w której pominięto nagłówek programu
program name;
wyszczególnienie modułów
uses
liblist;
albo oba te napisy.
Blok składa się z części deklaracyjnej i wykonawczej. Część deklaracyjna składa się z zestawu deklaracji etykiet, z zestawu deklaracji typów, zestawu deklaracji zmiennych niezainicjowanych, zestawu deklaracji zmiennych zainicjowanych i symboli oraz z zestawu deklaracji procedury. Każdy z wymienionych zestawów deklaracji może być pominięty, albo może występować wielokrotnie i w dowolnym porządku. Należy to rozumieć w taki sposób, iż na przykład po zestawie deklaracji typów może wystąpić zestaw deklaracji procedur, po nim znowu zestaw deklaracji typów, itd. Część wykonawcza programu jest bardzo prosta . Składa się z pojedynczej instrukcji grupującej. Przykłady: struktura programu:
a) Program z nagłówkiem i wyszczególnieniem modułów
program Hello;
uses
Crt.Printer;
begin
CIrScr; {Clear Screen}
Write('Hello worid');
Writeln(Lst,'Hello, l am JdnB')
end.
Program Hello składa się z nagłówka, wyszczególnienia modelów, instrukcji grupującej i znaku . (kropka). Wykonanie programu powoduje wyprowadzenie na ekran monitora napisu Hefla worid, a na drukarkę napisu Hello. l am JanB.
b) Program bez nagłówka i wyszczególnienia modułów:
var
Dividend,Divisor: real;
begin
Write('Dividend =');
Readln(Dividend);
Write('Divisor =');
Readln(Divisor);
Writeln('Quotient = ',Dividend / Divisor :0:3)
end.
Program składa się z bloku i znaku . (kropka). Blok .składa się z deklaracji zmiennych niezainicjowanych instrukcji grupującej. Pierwszą jednostką leksykalną deklaracji zmiennych
niezainicjowanych jest .słowo kluczowe var, a ostatnią najbliższy znak (średnik). Wykonanie programu powoduje wprowadzenie dwóch liczb, a następnie wyprowadzenie ich ilorazu.
Deklaracje etykiet
Każda instrukcja programu (z wyjątkiem instrukcji grupującej stanowiącej część wykonawczą bloku) może być opatrzona etykietą. Etykieta ma postać identyfikatora albo postać liczby całkowitej dziesiętnej bez znaku o wartości mniejszej niż 10000. Każda etykieta musi być zadeklarowana. Zera wiodące nie rozróżniają etykiet.
Deklaracja etykiety ma postać
label
lab, lab, ... ,lab;
w której każde lab jest nazwa etykiety.
Przykład Deklaracje etykiet
label 25, Abort, Quit;
label
9999, Again;
Napisy 25, Abort, Qnit, 9999 ; Again są nazwami etykiet.
Deklaracje typów
Zadeklarowanie zmiennej programu polega na określeniu nazwy zmiennej i podaniu jej typu. Typ może być predeklarowanym typem standardowym, albo może zostać zadeklarowany jawnie.
Deklaracja typu ma postać:
type
id = type;
id = type;
...
id = type;
w której każde id jest identyfikatorem typu, a każde type j est opisem typu.
Przykłady Deklaracje typów
Type
whole = integer;
{opis typu standardowego}
Colour= (Red,Green,Blue,Orange);
{opis typu wyliczeniowego}
RGB= Red..Blue;
{opis typu okrojonego}
Name: string[12];
{opis typu łańcuchowego}
StringPtr = "Name;
{opis typu wskazującego nieproceduralnego} Math = function (var = First : real) :
extended;
{opis typu wskazującego procedurowego}
Table = array[1..5,1..5] of RGB;
{opis typu tablicowego}
Person = record
FirsName: string[5];
LastName: Name;
Age : byte
end;
{opis typu rekordowego}
Letters = set of 'a'..'z';
{opis typu mnogościowego}
DataBank = file of Person;
{opis typu plikowego}
Typ Whole jest synonimem .standardowego typu całkowitego integer Tylu Colour jest wyliczeniowy, RGB okrojony. Name ftańcuchowy, StringPtr i Math wskazujący, Table tablicowy. Person rekordowy. Letters mnogościowy, a DataBank plikowy.
Deklaracje zmiennych niezainicjowanych
Każda zmienna programu musi być zadeklarowana przed jej użyciem. W chwili utworzenia można przypisać zmiennej daną początkową. Zmienna, która jest tworzona bez przypisania jej danej początkowej jest nazywana zmienna niezainicjowaną.
Deklaracje zmiennych niezainicjowanych mają postać
Var
id, id, . . ., id : type ;
id, id, . .. , id : type ;
id, id,., id: type
w której każde id jest identyfikatorem zmiennej, a każde (type jest opisem typu. Szczególnym rodzajem
deklaracji zmiennej niezainicjowanej jest deklaracja zmiennej nałożonej. Ma ona postać:
id : type absolute base;
w której id jest identyfikatorem zmiennej, type jest opisem typu, a base jest nazwą uprzednio zadeklarowanej zmiennej bazowej albo adresem pomięci o postaci segment; offset w której segment i offset są liczbami całkowitymi bez znaku. Przyjmuje się że początek obszaru pamięci przydzielonego zmiennej nałożonej pokrywa się, z początkiem obszaru pamięci przydzielonego zmiennej bazowej albo znajduje się w miejscu określonym przez podany adres. Nic nie stoi na przeszkodzie, aby nazwa zmiennej bazowej była nazwą zmiennej nałożonej.
Przykład Deklaracje zmiennych niezainicjowanych
Var
Count: integer;
Length, Area ,Volume : extended;
Buffer: array[1..128] of char;
FirstChar: char absolute Buffer;
Numbers : array[boolean] of real;
Complex: record
Re, Im : real
end absolute Numbers;
Zmienna FirstChar jest zmienną nołożoną na zmienną Buffer. Tym samym nazwa Bufferl i nazwa FirstChar są nazwami tej samej zmiennej. Zmienna Complex jest nałożona na zmienna Numbers. W szczególności Numbers {true} i Complex.Im ,ca nazwami tej samej zmiennej.
Deklaracje zmiennych zzainicjowanych i symboli
Zmienna, której w chwili utworzenia jest przypisana dana początkowa Jest nazywana zmienną zainicjowaną. Zmienne zainicjowane są tworzone tuż przed podjęciem wykonywania programu. Deklaracje zmiennych mogą być zgrupowane z deklaracjami symboli. Przyjmuje się z definicji że symbolem jest identyfikator reprezentujący literał. Literami są m.in. liczby (np. 12.4, -50, 6E-3) i łańcuchy (np. 'Jan', 'B ').
Przykład: Deklaracje zmiennych zainicjowanych i symboli:
const
e =2.718282;
g =9.81;
myName = 'Jan Bielecki";
Truth = true;
Sum : real = 0;
Name : string = 'Izabela';
Ptr: pointer = nil;
Colours : array[1..3] ofstringf[5]
Complex: recod
Re, Im : real
end = (Re : 2.0; Im : 3.0);
Letters : set of 'a'..'z' = ['x','y'];
eMinus = -e;
Napisy e,g, myName, Truth są symbolami. Napisy takie jak np.: Suń Name są nazwami zmiennych zainicjowanych.
Deklaracje procedur
Procedury dzielą, się na funkcyjne i nie funkcyjne. Procedury funkcyjne są nazywane funkcjami.
Deklaracja procedury określa czynności jakie zostaną wykonane w ramach jej wywołania. W
przypadku funkcji określa również typ danej udostępnionej w miejscu jej wywołania nazywanej rezultatem funkcji. Deklaracje procedur dzielą się na definicję zapowiadające i uzupełniające. Typowymi deklaracjami są deklaracje definiujące. Posłużenie się deklaracja zapowiadającą a następnie uzupełniającą jest niezbędne jedynie wówczas gdy nie jest możliwe takie uporządkowanie deklaracji definiujących aby nazewnik procedury wystąpił dopiero po deklaracji procedury.
Definicje procedur
const
Val; byte = 0;
function Fun (Par: byte): byte; [ zapowiedź ]
forward;
var
Num: byte;
procedure Sub(Par: byte); [ definicja ]
begin
if Par > O then
Val:=1 +Fun(Par-1)
end;
funetion Fun; [ uzupełnienie ]
begin
if Par > O then Sub(Par -1);
Fun .= 13
end;
begin [ main program ]
Readln(Num);
Write(FUn(Num)+Va1)
end.
Program zawiera trzy deklaracje procedur: deklarację zapowiadającą funkcji Fun, deklaracje
definiująca procedury nie funkcyjnej Sub i deklarację uzupełniającą funkcji Fun. Ciało deklaracji fun składa się z deklaratora forward. Nagłówek deklaracji uzupełniającej tej funkcji nie zawiera wykazów parametrów.
2.
Typ rekordowy jest typem złożonym. Rekord jest zmienna strukturalną której można przypisać dane
składające się z ustalonej liczby komponentów nazywanych polami. Pola są zmiennymi na ogół
różnych typów. Dostęp do pól odbywa się przez selekcję. Selekcja polega na podaniu nazwy rekordu i identyfikatora pola. Nazwę od identyfikatora oddziela znak kropki.
Opis typu rekordowego ma postać :
record
list: type;
list: type;
...
list: type;
end
w której każde list jest listą identyfikatorów pól rekordu, a każde type jest opisem typu. znak średnik poprzedzający słowo kluczowe może być pominięty.
Specjalną odmianę typów rekordowych stanowią typy rekordowe z wariantami. Deklaracja
wariantów może nastąpić w miejscu ostatniego napisu
List: type
Ma ona ona w ogólnym przypadku postać:
Case sel of
Lab : (var);
Lab : (var);
...
Lab : (var);
W której sel jest opisem typu wyróżnikowego albo deklaracją pola nazywaną wyróżnikowym, każde lab jest lista etykiet wyboru wariantu, a każde var jest wyrazem składowym wariantu.
Etykieta wariantu może być dowolne wyrażenie stałe typu wyróżnikowego najczęściej literał albo symbol.
Deklaracje typów i zmiennych rekordowych
Type
Date = record
Month: 1..12;
Year:1900.. 1999
End;
Gender = (małe, female, alien);
Person = record
Name : string [20];
BrithPlace : string [30];
Case Sex : Gender Of
Małe,female : (BrithDate:Date);
Alien : (BrithDate : real;
BodyDate: record
H: integer;
W: real;
End);
End;
Var
MyBybirthDay: Datę;
EarthMan , Galaxian : Person;
Typ datę jest związany ze zbiorem danych rekordowych z których każda składa się z przy danych. Pierwsza z pary danych jest typu 1..12 a druga typu 1900.. 1999. Typ person jest związany ze zbiorem danych z których każda skłda się z co najmniej z 3 danych o typach string, string i Gender. Jeśli dana typu Gender ma wartości małe lub female to dodatkowo występuje za nią dana rekordowa składająca się z typu danych integer i real. Zmiennej typu MyBirthDay mogą być przypisywane dane typu data a zmiennym EarthMan mogą być przypisywane dane typu Person.
3.
Typ zbiorowy jest typem złożonym. Mnogość jest zmienna strukturalną którejożna przypisać dane strukturalne składające się z dowolnych kolekcji danych wybranego typu porządkowego nazywanego typem bazowym typu mnogościowego. Wymaga się aby typ bazowy był związany ze zbiorem liczącym nie więcej niż 256 danych o liczbach porządkowych należących do przedziału O...255.
Opis typu mnogościowego ma postać:
Set of type
W którym type jest opisem typu bazowego danego typu mnogościowego. Dane typu zbiorowego są reprezentowane przez wyrażenia mnogościowe. Szczególnym wyrażeniem
jest konstruktor. Składa się on w ujęte nawiasy kwadratowe listy dowolnych wyrażeń typu bazowego. Jeśli pewna podlista reprezentuje dane o liczbach porządkowych z zakresu min... max to może być zastąpiona napisem eMin... eMax której eMin jest wyrażeniem reprezentującym daną o liczbie porządkowej min, a eMax jest wyrażeniem reprezentującym daną o liczbie porządkowej max.
W szczególności napis
['a', 'z', 'c', 'b']
może być zastąpiony napisem
['a'...'c','z'].
Przykład
Deklaracje typów zmiennych zbiorowych
Type
Hue = (Red,Green,Blue);
Colour = set of Hue;
Var
Digits: setof0...9;
Paint: Colour;
ASCII: set of char;
Typ Colour oraz nie nazywane typy set of O... 9 l set of char są anonimowymi typami zbiorowymi. Zmiennej Digits może przypisywać dane zbiorowe składające się z kolekcji danych typu 0..9.zmiennej Paint można przypisać dane składające się z kolekcji danych danych typu Hue. Zmiennej ASCII może przypisać dane składające się z kolekcji znaków rozszerzonego kodu ASCII.