Синтаксис і мовні конструкції 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Синтаксис і мовні конструкції



Паскаль, в його первісному вигляді, представляє собою чисто процедурний мову і включає в себе безліч алголоподобних структур і конструкцій з зарезервованими словами на зразок if, then, else, while, for, і т. д. Проте, Паскаль також містить велику кількість можливостей для структурування інформації та абстракцій, які відсутні в початковому Алгол-60, такі як визначення типів, записи, покажчики, перерахування, і безлічі. Ці конструкції були частково успадковані або інспіровані від мов Симула -67, Алгол-68, створеного Никлаусом Віртом AlgolW та запропоновано Хоаром.

У сучасних діалектах (Free Pascal) доступні такі операції як перевантаження операторів і функцій.


Hello world

Програми на Паскалі починаються з ключового слова program і наступного за ним ім'я програм з крапкою з комою (в деяких діалектах є необов'язковим), за ім'ям може в дужках слідувати список зовнішніх файлових дескрипторів в якості параметрів, за ним слід тіло програми, що складається із секцій опису змінних, типів і констант, оголошень процедур і функцій і наступного за ними блоку операторів, що є точкою входу в програму. У мові Паскаль блок обмежується ключовими словами begin і end. Оператори поділяються крапкою з комою, після тіла поміщається точка, що служить ознакою кінця програми. Літери в Паскалі не має значення.

Таким чином, найпростіша програма на Паскалі буде виглядати наступним чином:

program p; begin end.

Програма не виконує ніяких дій і містить порожній блок операторів.

Приклад програми, що виводить рядок "Hello, World!":

program HelloWorld (output); begin writeln ('Hello, World!') {Оператор виведення рядка} end.

В Pascal над цілими типами (byte, shortint, word, integer, longint і їх діапазони) припустимі побітові операції. Логічні операції над бітами: Над битами двох цілих операндів можна виконувати раніше розглянуті логічні операції: not, and, or, xor. Відмінність між побітовим і логічними операціями полягає в тому, що побітові (порозрядне) операції виконуються над окремими бітами операндів, а не над їх значенням в десятковому (звичайно) поданні.

Виділяється поняття порядкових типів даних (ordinal), до них відносяться цілі типи (знакові і беззнакові), логічний (boolean), символьний (char), Перечіслімий типи і типи-діапазони.

Порядкові типи задаються цілим числом (кодом), яку можна отримати за допомогою функції ord. Всі операції, що виконуються над порядковими типами, виконуються з їх кодами.

Діапазони містять підмножина значень інших порядкових типів:

var x: 1.. 10; Y: 'A'.. 'Z'; Z: pear.. orange;

Для порядкових типів визначені операції inc, dec, succ, pred, ord, операції порівняння (= > < => <= <>), їх можна використовувати в операторах case, for (як лічильник циклу), як кордони масивів, для завдання елементів множин і типів-діапазонів.

У Паскалі, на відміну від Сі-подібних мов, з типами boolean і char арифметичні цілочисельні операції не визначені.

На відміну від багатьох поширених мов, Паскаль підтримує спеціальний тип даних безліч:

var set1: set of 1.. 10; Set2: set of 'A'.. 'Z'; Set3: set of pear.. orange;

Безліч - фундаментальне поняття в сучасній математиці, яке може бути використане в багатьох алгоритмах.

В паскалі тип множина може містити тільки однотипні елементи порядкового типу. Ця особливість широко використовується і звичайно швидше еквівалентної конструкції у мові, що не підтримує множини. Наприклад, для більшості компіляторів Паскаля:

if i in [ 5.. 10 ] then {Перевірка на приналежність елемента множині}...

обробиться швидше, ніж

if (i> 4) and (i < 11) then {Перевірка логічними умовами}...

Для завдання значення безлічі використовується список елементів множини, відокремлених комами і ув'язнений в квадратні дужки (як уже було показано вище):

var {Секція оголошення змінних} d: set of char; begin {Початок блоку} d: = [ 'A', 'B' ];...

У Паскалі Йенсен і Вірта рядка представлялися як упаковані масиви символів, отже, вони мали фіксовану довжину і зазвичай доповнювалися до цієї довжини пробілами.

У сучасному Паскалі [11] для роботи з рядками використовується вбудований тип string, що підтримує операції конкатенації (+) та порівняння (> < = <> >= <=). Рядки порівнюються в лексикографічному порядку. Наприклад, рядки вважаються рівними якщо вони мають однакову довжину і коди всіх символів з однаковими індексами збігаються.

Тип string [n] або просто string в діалектах мови 1970-1990-х років визначався у вигляді масиву символів array [0..n] of char (n за замовчуванням брало значення 80 в UCSD Pascal і 255 в Turbo / Borland Pascal), код нульового символу при такому поданні служить для завдання довжини рядка, відповідно рядок могла мати максимальний розмір 255 символів. За умовчанням в Delphi і FreePascal як String використовується тип AnsiString, пам'ять під який виділяється і звільняється компілятором динамічно, а максимальний розмір рядка в поточних реалізаціях складає 2 гігабайти. Крім того, в Delphi і Free Pascal як string може використовуватися тип WideString, де застосовується 16-бітове представлення символів в кодуванні UCS-2, при цьому кошти перетворення з однобайтових рядків у багатобайтові і назад в стандартній бібліотеці мови відсутні.

Нові типи можуть бути визначені з існуючих:

type {Секція оголошення типів} x = Integer; Y = x;...

Більше того, з примітивних типів можуть бути сконструйовані складові:

type {Секція оголошення типів} a = Array [ 1.. 10 ] of Integer; {Визначення масиву} b = record {Визначення запису} x: Integer; Y: Char; end; C = File of a; {Визначення файлу}

Файлові типи в Паскалі діляться на типізовані, текстові та файли без типів.

Як показано в наведеному вище прикладі, типізовані файли в Паскалі - це послідовності однотипних елементів. Для кожного файлу існує змінна-вказівник на буфер, яка позначається f^. Процедури get (для читання) і put (для запису) переміщують покажчик до наступного елементу. Читання реалізовано так, що read(f, x) являє собою те ж, що і get(f); x:=f^. Відповідно, запис реалізована так, що write(f, x) являє собою те ж, що і f^:= x; put(f). Текстові файли text визначені як розширення типу file of char і крім стандартних операцій над типізований файлами (читання, запис символу), дозволяють здійснювати символьний введення-виведення в файл всіх типів даних аналогічно консольного вводу-виводу.

Файли без типів оголошуються як змінні типу file. З ними можна проводити операції побайтово нетипізовані вводу-виводу по кілька блоків байт зазначеної довжини через буфер, для цього є спеціальні процедури blockread і blockwrite (розширення UCSD).


Покажчики

Паскаль підтримує використання покажчиків (типізовані ^тип і нетипізовані pointer):

type a = ^ B; b = record x: Integer; Y: Char; Z: a; end; var pointer_to_b: a;

Тут змінна pointer_to_b - покажчик на тип даних b, є записом. Тип типізованого покажчика може бути заданий перед оголошенням типу, на який він посилається. Цей виняток до правила, яке говорить, що будь-яка річ належна бути оголошена перед тим, як використовується. Введення цього винятку дозволило організовувати рекурентні визначення структур даних, у тому числі такі, як лінійні списки, стеки і черзі, включаючи покажчик на запис в описі цього запису (див. також: нульовий покажчик - nil).

Для типізованого покажчика визначена операція разименованія (її синтаксис: указатель^).

Щоб створити новий запис і присвоїти значення 10 і символ A полям a і b в ній, необхідні наступні оператори:

new (pointer_to_b); {Виділення пам'яті вказівником} pointer_to_b ^. x: = 10; {Разименовиваніе покажчика та звернення до поля запису} pointer_to_b ^. y: = 'A'; Pointer_to_b ^. z: = nil;... dispose (pointer_to_b); {Звільнення пам'яті з-під покажчика}

Для цілей звернення до полів записів і об'єктів можна також використовувати оператор with, як показано в прикладі:

new (pointer_to_b); With pointer_to_b ^ do begin x: = 10; Y: = 'A'; Z: = nil end;... dispose (pointer_to_b);

Процедурний тип

В оригінальному мовою Паскаль Йенсен і Вірта процедурний тип використовувався тільки при описі формального параметра. Вже в TP існував повноправний процедурний тип. В оголошенні типу ставиться заголовок процедури або функції (без імені), узагальнено описує інтерфейс підпрограми. Значення цього типу містить покажчик на підпрограму з заголовком, відповідну описаному в оголошенні типу. За допомогою ідентифікатора змінної може відбуватися виклик відповідної процедури або функції.



Поделиться:


Последнее изменение этой страницы: 2017-02-10; просмотров: 103; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.150.89 (0.008 с.)