هر برنامهای از یک heading و یک block تشکیل شده است. خود بلاک هم دو قسمت دارد:



heading به program یک نام میدهد. این نام در داخل برنامه هیچ اهمیت و کاربرد دیگری ندارد؛ همچنین پارامترهای برنامه را لیست میکند. این پارامترها موجودیتهایی هستند که خارج از برنامه وجود دارند و برنامه از طریق آنها با محیط ارتباط برقرار میکند. این موجودیتها که (که معمولا فایل هستند و در فصل ۹ به آنها خواهیم پرداخت) external نامیده میشوند. هر پارامتری که در این جا وارد میشود در داخل بلاک program باید دقیقا مثل متغیرهای local معمولی اعلان شود.

حال در این قسمت به تفصیل در مورد declaration part میپردازیم. به خاطر دارید که declaration part به همراه statement part بلاک را تشکیل میدهند. برای وضوح بیشتر مطلب ساختار کلی برنامه را در قالب لیست نشان میدهیم:
program heading
block
declaration part
label declaration part
هر statement ای در برنامه میتواند با یک label پیشوند
داده شود و یا به عبارت دیگر prefix شود و سپس بعد از آن یک : بیاید. به این
شیوه میتوان با استفاده از عبارت goto مستقیما به آن مکان رفت. label
باید قبل از استفاده در label declaration part اعلان یا declare شود. ترمینالِ
Label در ابتدای این قسمت میآید. ساختار کلی label declaration part به صورت زیر است:

label ها به صورت unsigned Integer و با مقداری بین 0 تا 9999 تعریف میشوند. به عنوان مثال:
Label
13, 00100, 99;
constant definition part
تعریف یک ثابت یعنی تعریف یک identifier در برنامه که به عنوان synonym مقدار ثابت داده شده عمل میکند. ترمینالِ Const در ابتدای constant definition part میآید. ساختار کلی این قسمت به شکل زیر است:

Constant یا یک عدد است یا یک Constant identifier (که ممکن است علامت داشته باشد) یا یک کاراکتر و یا یک string. پس syntax diagram یک Constant به صورت زیر است:

⬅ مثال از وجود علامت قبل از constant identifier
📝 استفاده از Constant Identifier ها معمولا باعث خواناتر شدن برنامه میشود و در حکم نوعی مستندسازی برنامهاست. همچنین به برنامهنویس امکان میدهد تا کمیتهای وابسته به ماشین را در ابتدای برنامه بیاورد. بدین صورت به سرعت متوجه این موارد میشویم و آنها را در صورت نیاز به راحتی تغییر خواهیم داد. این ویژگی قابلیت حمل و ماژولار بودن برنامه را بهبود میبخشد.
مثال:
const
Avogadro = 6.023E23;
PageLength = 60;
Border = '# * ';
MyMove = True;
type definition part
یک نوع داده در پاسکال یا میتواند مستقیما در اعلان یک متغیر (بعدا خواهیم دید) توصیف شود و یا به وسیلهی یک شناسهی نوع یا type identifier به آن ارجاع داده شود. در بعضی قسمتهای پاسکال نوع فقط میتواند به وسیلهی یک شناسهی نوع یا type identifier بیان شود. در پاسکال علاوه بر این که چندین type identifier استاندارد داریم، با قابلیت type definition میتوانیم type identifier های جدیدی نیز تعریف کنیم تا بیانگر یک نوع باشند. ترمینالِ type در ابتدای type definition part میآید. syntax diagram این قسمت به صورت زیر است:

به خاطر داشته باشید که Type در تصویر بالا بیانگر یک نوع دادهای ساده و یا structured type و یا pointer type است. Type یا یک type identifier است که یک نوع موجود را نشان میدهد و یا یک توصیف نوع جدید.

variable declaration part
هر variable identifier ای که در برنامه ظاهر میشود باید در variable declaration part معرفی شود. این اعلان از نظر متنی میبایست مقدم بر هر گونه استفادهای از متغیر باشد مگر این که متغیر پارامتر program باشد.
تعریف متغیر، یک variable identifier را به همراه نوع آن به برنامه میشناساند. این کار به سادگی با نوشتن نام identifier و بعد نوع آن انجام میشود. ترمینالِ VAR در ابتدای variable declarartion part میآید. ساختار کلی آن به صورت زیر است:

مثال:
VAR
Root1, Root2, Root3: Real;
Count, I: Integer;
Found: Boolean;
Filter: Char;
هر متغیری که (بیانگر یک موجودیت external است، معمولا یک فایل،) که در لیست پارامترهای program قرار گرفته است، بجز Input و Output، باید در variable declaration part اعلان شود. اگر Input و Output لیست شده باشند به صورت اتوماتیک به عنوان textfile تعریف میشوند (فصل ۹).
procedure and function declaration part
تمام پروسیجرها و توابع باید قبل از استفاده تعریف شوند. تعریف پروسیجر و تابع به همان شکل program است یعنی ابتدا یک heading و سپس یک block میآید. برای مطالعهی جزئیات بیشتر و مثال به فصل ۱۱ مراجعه کنید.
پروسیجرها زیربرنامههایی هستند که توسط procedure statement ها فعال میشوند. پروسیجر در دید کلی یک statement است و مقداری برنمیگرداند. تابعها هم به مانند پروسیجرها زیر برنامه هستند ولی برخلاف پروسیجر یک مقدارِ نتیجه تولید میکنند. لذا فراخوانی تابع یک expression محسوب میشود و میتوان آن را هر جا که یک expression مورد نیاز باشد به کار برد.
فرق بین procedure و procedure identifier و procedure statement را در کادر زیر بیان کردهایم:
{ PrintHello is procedure identifier }
PROCEDURE PrintHello(Name: String); { | procedure declaration }
BEGIN { | // }
WriteLn('Hello, ', Name); { | // }
END; { | // }
PrintHello('Mohsen'); { procedure statement }
در واقع منظور از procedure statement دستور فراخوانی پروسیجر است، دستوری که باعث activate شدن یا فراخوانی پروسیجر میشود. به عبارت امروزی procedure statement معادل procedure call است.
statement part
بررسی این قسمت موضوع این فصل نیست.
اعلان یا تعریف یک identifier
(constant،
type،
variable،
procedure،
function)
و یا label در تمام بلاکی که حاوی declaration یا definition آن
identifier
است اعتبار دارد، مگر
اینکه در یک بلاک subordinate یا زیرمجموعهاش، آن identifier یا label مجددا تعریف یا اعلان شده
باشد، به عبارت دیگر identifier ای در بلاک داخلیتر به همان نام identifier
بلاک خارجیتر تعریف شده باشد.
⬅ مثال
🔔 به منطقهای که در آن identifier یا label شناخته شده است و در آن قابل دسترسی است حوزه یا scope آن identifier یا label میگویند. identifier یا label ای که در داخل بلاکِ program تعریف یا اعلان شده است scope یا حوزهی دسترسیِ global دارد، یعنی در تمام برنامه و زیربرنامهها قابل دسترسی است.
identifier یا label نسبت به بلاکی که در آن تعریف شده است local است و نسبت به یک بلاک non local است اگر در بلاکی تعریفی شده باشد که بلاک مورد نظر ما را احاطه کرده است. این تصویر از فصل 0 را مجددا ملاحظه کنید:

یک identifier را نمیتوان بیشتر از یکبار در داخل همان سطح و scope تعریف کرد، لذا تعریف زیر اشتباه است:
VAR
X: Integer;
X: Char; { ❌ }