Pascal/Структура програми
Алфавіт
[ред.]Програма на Паскалі - це звичайний текстовий файл, який може містити такі символи:
- великі і маленькі латинські літери:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
- символи-роздільники:
пробіл, символ нового рядку, символ табуляції
- символи:
+ - * / = < > @ . , ' ( ) [ ] { } : ; ^ # $
- решта символів припустима тільки всередині рядків (конкретний набір залежить від компілятора).
Лексеми
[ред.]Коли компілятор розбирає файл, він виокремлює з тексту лексеми - особливі послідовності символів, кожна з яких сприймається як окремий неподільний об'єкт, "атом", "слово" програми. В мові Паскаль вирізняються такі лексеми:
- Роздільники - знаки пробілу, нового рядку, табуляції, а також коментарі. Роздільники використовуються для того, щоб відокремити сусідні лексеми - наприклад, відрізнити ідентифікатор від ключового слова for, за яким іде ідентифікатор i:
fori
а також щоб полегшити читання програми. Після розбиття програми на лексеми компілятор ігнорує роздільники.for i
- Коментар - послідовність символів, взятих в фігурні дужки { } або дужки з зірочками (* *). Коментар є роздільником, тобто ігнорується компілятором:
{
Приклад програми на Паскалі
}
program sayhello;
begin {тут починається власне програма}
(* цей відступ буде проігноровано *)writeln('Hello world!'{як і цей коментар})
end. {тут програма закінчується}
Такий код для компілятора повністю ідентичний коду, наведеному в розділі "перша програма".
Слід зауважити, що коментарі використовуються також для передачі компілятору специфічних для нього директив, які не перетворюються на код, але впливають на подальше виконання програми, на кшталт заборони використання математичного сопроцесора. Такі директиви починаються зі знаку валюти $ на початку коментаря.
- Оператор - знак, що означає певну дію, такий, як +, -, >, дужки і т.д.
- Число - послідовність цифр, а також кількох інших знаків, що означають число. Числа в Паскалі бувають:
- Цілі, наприклад 0, 10, -256; також дозволяється використання шістнадцяткових чисел, які починаються зі знака $( $10 =16);
- Дійсні, наприклад 1.4 (одна ціла 4 десятих), -3.1415, 1e10 (10 в десятій степені, експоненційна форма запису), 6.67384e-11 і т.д.
- Ідентифікатор - послідовність латинських літер, цифр і знаків підкреслення, що починається не з цифри.
- Ключове слово - ідентифікатор, що має окреме значення в мові Паскаль:
absolute and array as asm begin case class const constructor destructor dispinterface dispose div do downto else end except exit exports false file finalization finally for function goto if implementation in inherited initialization inline inline interface is label library mod new nil not object of on on operator or out packed packed procedure program property raise record reintroduce repeat resourcestring self set shl shr string then threadvar to true try type unit until uses var while with xor
(в різних діалектах можуть бути інші ключові слова)
- Символ або рядок - один чи кілька знаків, взятих в одинарні лапки: 'a', 'Hello world!', '123'. Якщо в лапках один символ, то така лексема розглядається як символ (char), якщо кілька - як рядок (string). Символи також можуть позначатися своїм кодом в таблиці символів після знаку решітки #64 (те саме, що й '@'), а рядки - послідовністю таких символів. Так, вирази
writeln(#72#101#108#108#111#32#119#111#114#108#100#33)
і
writeln('Hello world!')
еквівалентні. Знак одинарної лапки ' позначається подвійним знаком лапки ' ' ' ' (зовнішні лапки, нагадаю, означають, що це символ, а не інша лексема):
writeln('б''ю, п''ять, п''є пишуться з апострофом!')
Розділи
[ред.]Лексеми групуються в розділи. Розділи є такі:
- program - назва програми або unit - назва модуля. Відмінність полягає в тому, що програма program описує програму, призначену для безпосереднього виконання, а модуль - бібліотеку підпрограм, яку можна використовувати в інших програмах. Розділ закінчується крапкою з комою.
- interface та implementation - розділи, що відокремлюють зовнішню (інтерфейсну) поведінку модуля і внутрішню (реалізацію). Закінчуються з початком іншого розділу.
- uses - список використовуваних бібліотек. Розділ закінчується крапкою з комою.
Іноді в підручниках з Turbo Pascal можна зустріти пораду завжди починати програму з рядка
uses CRT;
який під'єднує до програми модуль для роботи з консоллю MS DOS; очевидно, що в сучасних програмах, навіть навчальних, треба намагатися цього уникати (навряд чи багатьом знадобиться сумісність з операційною системою 20-річної давнини). Втім, цей модуль дає розширене управління консоллю (кольоровий вивід, зчитування стану клавітури та ін.)
- type - опис користувацьких типів даних. Розділ закінчується з початком іншого розділу.
- var - опис змінних. Розділ закінчується з початком іншого розділу.
- const - опис сталих. Розділ закінчується з початком іншого розділу.
- label - опис міток. Сучасні принципи програмування настійливо не радять використовувати мітки. Розділ закінчується крапкою з комою.
- procedure або function - опис підпрограми. Цей розділ може містити власні розділи type, var, const і label, а також власні внутрішні procedure та function! Ідентифікатори, описані всередині внутрішніх розділів, недосяжні ззовні підпрограми. Закінчується блоком коду між begin та end; (з крапкою з комою).
- Блок коду - починається з begin, закінчується end. (з крапкою). В модулях може бути відсутнім, тоді програма закінчується одним словом end. (з крапкою).
В цілому загальний вигляд програми мовою Паскаль такий:
program ...;
uses ..., ...; {бажано використовувати на початку}
{наступні 5 пунктів можуть як завгодно переставлятися один між одним, повторюватися чи бути взагалі відсутніми}
type ...;
...;{в одному розділі type може бути кілька оголошень}
const ...;
...;{в одному розділі const може бути кілька оголошень}
var ...;
...;{в одному розділі var може бути кілька оголошень}
label ...;
function/procedure ...;
type ...;{відступом позначено те, що ці розділи є локальними для функції чи процедури і недоступні ззовні}
const ...;
var ...;
label ...;
function/procedure ...;
...{функцій та процедур може бути декілька}
begin
end;
...{функцій та процедур може бути декілька}
begin
...{тут програмний код}
end.{програма закінчується end з крапкою}
Зони видимості
[ред.]Кожен ідентифікатор знаходиться в певній зоні видимості. Ідентифікатори, проголошені в розділах type, const, var і після ключових слів function та procedure, мають глобальну зону видимості, тобто можуть бути згадані де завгодно. Ідентифікатори, проголошені всередині розділів function та procedure у відповідних підрозділах, є локальними для цих функцій та процедур, і не можуть бути згадані за їх межами. Якщо локальний і глобальний ідентифікатори мають однакову назву, то всередині процедури компілятор вважатиме, що викликано локальний ідентифікатор, за межами - глобальний; таким чином, локальні ідентифікатори маскують глобальні.