⬅ فهرست
هر برنامه از یک heading و یک block تشکیل شده است. سینتکس دیاگرام program به صورت زیر است:

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

declaration part به همراه statement part بلاک را تشکیل میدهند. سینتکس دیاگرام یک بلاک را در زیر مشاهده میکنید:

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

label ها به صورت unsigned Integer و با مقداری بین 0 تا 9999 تعریف میشوند. به عنوان مثال:
Label
13, 00100, 99;
تعریف یک ثابت یعنی تعریف یک 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 identifier به آن ارجاع داده شود. در بعضی قسمتهای پاسکال نوع فقط میتواند به وسیلهی یک شناسهی نوع یا type identifier بیان شود. در پاسکال علاوه بر این که چندین type identifier استاندارد داریم، با قابلیت type definition میتوانیم type identifier های جدیدی نیز تعریف کنیم تا بیانگر یک نوع باشند. ترمینالِ type در ابتدای type definition part میآید. syntax diagram این قسمت به صورت زیر است:

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

هر 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 تعریف میشوند (فصل ۹).
تمام پروسیجرها و توابع باید قبل از استفاده تعریف شوند. تعریف پروسیجر و تابع به همان شکل 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; { ❌ }