תחביר (Syntax) בשפת פסקל

עמוד זה מספק מבוא מהיר לשפת Pascal Script למתכנתים עם רקע קודם בשפת JavaScript.
מטרת הפרק ליישר קו ולהסביר אודות התחביר והמושגים החיוניים הדרושים כדי להתחיל לכתוב ולקרוא קוד Pascal.

עקרונות יסוד כלליים

להלן מספר חוקי אצבע שעליך להכיר, היישום שלהם מודגם בהמשך העמוד.
  • בפסקל הסימן ; מורה על סיום פרוצדורה/פונקציה, שורת פקודה/השמה
  • "בלוקים" של קוד יוצבו בין במילים "Begin" ... "End" במקום סוגריים מסולסלים "{ ... }"
  • ירידת שורה לא פוגעת ברצף הקוד ולא נדרש סימן מיוחד לכך.
  • בפרוצדורות ופונקציות חובה להצהיר על כל המשתנים לפני השימוש (בראש הקוד)
  • השמת ערך אל משתנה יבוצע באמצעות הסימנים =: כמודגם בהמשך.
  • חובה להציב את פרוצדורות המערכת (כגון: init, After_Showing, After Edit וכיו"ב) מתחת לכל שאר הפרוצדורות/פונקציות הפרטיות.

סימנים בפסקל ומשמעותם

סימן הסבר
; מורה על סיום: שורת קוד / פרוצדורה / פונקציה
=: השמת ערך אל תוך משתנה לדוגמה:  
x:= 5;
' 'טקסט יוצב בין גרשים בודדים'
= תנאי שיוויון כבדיקה (IF)
< , > , =< , => , <> תנאי השוואה (IF), לפי הסדר מימין לשמאל: גדול מ , קטן מ , גדול שווה , קטן שווה , שונה
// , { } הערות: // לשורת הערה בודדה , { בלוק הערות ברובה שורות יוצב בתוך סוגריים מסולסלים }

פעולות בפסקל ומשמעותם

סימן הסבר
+ פעולת חיבור אריטמטית עבור משתנים ומספרים וגם פעולת שירשור לטקסט
- , * , / פעולות אריטמטיות: חיסור , כפל , חילוק
DIV חלוקה בדומה לסימן /
Mod השארית שנותרה לאחר חלוקה של שני מספרים.
לדוגמה:
12 MOD 5 = 2

כי 5 נכנס פעמיים ב-12 ונשארו 2 יחידות שארית

שימוש במשתנים

  • ב- Pascal מכריזים על משתנים באמצעות המילה VAR ומספיק לכתוב אותה פעם אחת כמודגם בהמשך.
  • במערכת התסריטים מיקום ההגדרה של שמות המשתנים חייב להתבצע אך ורק מתחת לשם הפרוצדורה (כמודגם בהמשך)
  • הכרזה על משתנה חייב לכלול את שמו + סוג המשתנה גם אם מדובר במשתנה "כללי" (Variant).
  • השמת ערך למשתנה לא יכולה להתבצע באותה הפקודה של ההכרזה (שתי פעולות שונות).

סוגי משתנים (Data Types)

להן לרשימת משתנים הנתמכים ע"י מערכת התסריטים, שימוש במשתנים שאינם מופיעים כאן יגרום לכישלון בשלב ה- Compile.
שם טוח מינימום טוח מקסימום תיאור
מספרים שלמים:
Integer 2147483648- 2147483647 מספר שלם 32 ביט.
LongInt 9223372036854775808- 9223372036854775807 מספר שלם 64 ביט.
Cardinal 0 4294967295 מספר שלם חיובי 32 ביט.
Word 0 65535 מספר שלם. אינו מושפע מפלטפורמה 32/64 ביט.
LongWord 0 4294967295 או
18446744073709551615
מספר שלם. בפלטפורמת 32 ביט יתפקד כ- Cardinal. בפלטפורמת 64 ביט יתפקד כ- UInt16 אוטומטית.
מספרים עשרוניים:
Double 2.23e-308 1.79e+308 מספר עשרוני המאפשר עד 15 ספרות לאחר הנקודה. אינו מושפע מפלטפורמה 32/64 ביט.
Extended 2.23e-308 או
3.37e-4932
1.79e+308 או
1.18E+4932
מספר עשרוני המאפשר עד 18 ספרות לאחר הנקודה. למעשה זה הוא Long Double.
זהירות: Extended מתפקד בצורה שונה בין מערכות הפעלה ופלטפורמות שונות! אנו לא ממליצים להשתמש בו.
Currency 922337203685477.5808-
10000/(263+1)-
922337203685477.5807
263/10000
מספר עשרוני גדול המאפשר עד 4 ספרות אחרי הנקודה. אינו מושפע מפלטפורמה 32/64 ביט.
טקסט / תוים:
String טקסט, כולל בתוכו את Wide String התומך Unicode. אינו מוגבל בגודל ואינו מושפע מפלטפורמה 32/64 ביט.
Char 0 16 תו בודד בגודל 16 ביט, כולל בתוכו את WideChar התומך Unicode
Boolean 0 16 דגל, הכולל בתוכו WordBool המאפשר קידוד באמצעות המילים TRUE/FALSE.
Variant משתנה כללי המאפשר להכיל אוביקט. לדוגמה OLE Objects וכדומה.

דוגמאות להכרזות משתנים (יצירת משתנים)


Procedure DoSomething;
Var Age: integer;
  Distance: double;
  Comment, Date, Time: string;
  Letter: char;
  YesNo: boolean;
Begin
  Age:= 30;
  Distance:= 17.956;
  Comment:= 'Helo World';
  Date:= '27/07/2023'; Time:= '10:23:33';
  Letter:= 'D';
  YesNo:= False;
End;

שרשור טקסטים

טקסטים מוזנים בין שני תוים של מרכאה בודד. 'טקסט'
שירשור מבוצע באמצעות הסימן +
לדוגמה:

Procedure After_Showing;
Var MyName: string;
Begin
  MyName:= 'Yaniv';
  PopupMessage('My name is: ' + MyName);
End;

פונקציות ופרוצדורות

* פרוצדורה (Procedure) לא תחזיר ערך, לעומתה פונקציה (Function) כן.
* השמת הפקודה Exit בפרוצדורה/פונקציה - תעצור את המשך הביצוע הקוד.
* פונקציה תחזיר את הערך המיושם ב- result בסיום פעולתה (גם אם הפונקציה הופסקה באמצעות הפקודה EXIT).
* פונקציה שבה לא השמת ערך ל- Result תחזיר 0/False כברירת מחדל.

הכרזה על פרוצדורה תבוצע בצורה הבאה:

{סוג}	    {שם}
Procedure After_Showing;
Begin
  {type your Procedure code here...}
End;

הכרזה על פונקציה המחזירה integer תבוצע בצורה הבאה:

{סוג}	  {שם}	     {משתנים}	                      {סוג ערך מוחזר}
Function Do_Somthing(Param1, Param2: integer): integer;
Begin
  Result:= Param1 + Param2;
End;

קריאה לפונקציה תתבצע כך:

Procedure After_Edit(FeildName);
Var DayNumber: integer;
Begin
  DayNumber:= -1;
  DayNumber:= Day_Of_Week(Now, False);     //'Day_Of_Week' is a Function that returns the current day number...
  PopupMessage('The day number is: ' + Shint(DayNumber));
End;

תנאי - IF

כאשר כותבים תנאים בפסקל צריך לשים לב למספר כללי בסיס (המומחשים בהמשך):
* כאשר התנאי מכיל רק פעולה אחת, ניתן לכתוב את הפעולה באותה השורה או לרד שורה אחת מתחת למילה IF.
* כאשר יש ריבוי פעולות יש לתחום אותם בתוך Begin...End
* שורת הפקודה שלפני ה- ELSE או ELSE IF לא תסתיים בתו ;


Procedure After_Showing;
Var MyName: string;
Begin
  MyName:= 'Yaniv';

{דוגמה לתנאי פשוט - פעולה בודדת}
  If (MyName = 'Eli') Then
    Do_somthing;

{דוגמה לתנאי פשוט - ריבוי פעולות}
  If (MyName <> 'Eli') Then
    Begin
     Do_Something1;
     Do_Something2;
     Do_Something3;
    End;

{דוגמה לתנאי מורכב - ריבוי פעולות}
  If ((MyName <> 'Eli') AND (MyName <> '')) Then
    Do_Something
  Else
    Begin
      Do_Something_Else1;
      Do_Something_Else2;
      Do_Something_Else3;
    End;

{דוגמה לתנאי מורכב הכולל if else if - ריבוי פעולות}
  //Reminder: the last command\action befor the "else" statment will not end with ';' sign.
  If ((MyName <> 'Eli') AND (MyName <> '')) Then
    Begin
      Do_Something;
      Call_aFunction;
    End
  Else If (MyName = 'Ziv') Then
    Do_Something_Else1
  Else If (MyName = 'Ran') Then
    Do_Something_Else2
  Else
    Do_Something_Else3;
End;

IF בכתיבה מקוצרת

למי שפיתח בשפת JAVA כנראה שנתקל בתצורת הכתיבה הבאה.
בתצורה זו משלבים תנאי IF (נסתר) בשורה אחת יחד עם ההשמה.
צורה זו טובה רק למקרים של פעולה בודדה אחת המתקיימת בהקשר לתנאי True/False.

קוד לדגומה: להלן פונקציה הבודקת עם הטקסט שקיבלה תחום בתוך סוגריים מסולסלים ומחזירה True/False בהתאם לבדיקה:

Function CheckIfInBrackets(S: String): Boolean;
Begin

  //נסתר IF ולכן המינוח - IF כך הייתה נראת תצורת הכתיבה ה"רגילה" המשתמשת בתנאי
  IF (Copy(S,1,1) = '{') AND (Copy_End_Of_String(S,1) = '}') Then
    Result:= True;

  //וכך נכתוב את אותו תנאי נסתר בתצורת כתיבה מקוצרת.
  //יחזירו שתיהן תשובה חיובית Copy ניתן לראות שהתוצאה תהיה חיובית רק כאשר שתי הפונקציות
  Result:= (Copy(S,1,1) = '{') AND (Copy_End_Of_String(S,1) = '}');

  
End;

תנאי - CASE

הקוד של הייפר יודע קבל תנאי Case גם עבור מספרים וגם עבור בדיקות טקסט.
עבור בדיקות טקסט קח בחשבון שהבדיקה היא Case Sensetive (רגישה לאותיות גדולות וקטנות)
להלן דוגמה לתנאי Case עבור ערכים מספריים:

Procedure Case_Check;
VAR a, b: Integer;
Begin
  a:= ClientTb.IField['ID Doc Type',-1];
  b:= ClientTb.IField['Gender',-1];

  Case a OF
    1..4,8: a:=1;
    5..7:   a:=2;
  Else
    a:=0;
  End;
End;

לולאות

* תזכורת: יש להכריז על המשתנה בו תשתמש בלולאה בראש הפרוצדורה/פונקציה.
* הפקודה Continue - מורה לעצור את המשך הקוד הנוכחי בלולאה, ולקפוץ לתחילת הלולאה (למחזור ביצוע חדש).
* הפקודה Break - מורה על עצירת הקוד ויציאה מהלולאה.
** זהירות - מפני לולאות אין סופיות! למערכת התסריטים של הייפר אין פקודת "אתנחתה" כגון: DoEvents / ProcessMessages / root.update וכיו"ב.

לולאת FOR


{לולאה הסופרת כלפי מעלה ומבצעת שורת קוד יחידה}
For i:= 0 To 4 Do
  PopupMessage(_Int_To_Str(i, false));


{לולאה הסופרת כלפי מטה ומבצעת שורת קוד יחידה}
For i:= 4 DownTo 0 Do
  PopupMessage(_Int_To_Str(i, false));


{לולאה הסופרת כלפי מעלה ומבצעת מקבץ שורת קוד}
Procedure After_Showing;
Var _ctr: integer;
    _time: double;
Begin
  For _ctr:= 0 To 1 Do
  Begin
    _time:= Now;
    PopupMessage('The Time is: ' + Format_FixDT_To_Str('HH:MM:SS', _time));
  End;
End;

לולאת While


{לולאה בגרסה קצרה של שורה אחת}
While (Condition) Do
  [Single Action Code;]

{לולאה עם ריבוי פקודות}
While number < 5 Do
Begin
  sum := sum + number;
  number := number - 2;
End;

לולאת Repeat


{לולאה מסוג זה מיועדת לריבוי שורות}
Repeat
  [Action Code1];
  [Action Code2];
  [Action Code3];
Until (Condition);

הפקודה Try Execept

נשתמש בפקודה זו כאשר נכתוב קטע קוד הרגיש לתקלות. לדוגמה: שמירת קובץ, שליחת הודעה, או כל פעולה שתוצאתה אינה תלויה במתכנת.
לפני השימוש בפקודה מומלץ להכיר את שיטות שמירה/שליחת הודעות שגיאה במערכת, כי אין הגיון לתפוס שגיאה ולא לנהל אותה או לדווח עליה.

חוקיות:
* בפקודה זו לא נדרש ליישם Begin End בתוך "הבלוקים" עצמם.
* TRY ירוץ ראשון. במידה ואחת הפקודות שבו תיכשל, הקוד יקפוץ לבלוק ה- Except
* לבסוף תמיד ירוץ ה- Finally !
* אפשר להפעיל TRY בתוך TRY.

להלן מספר תצורות כתיבה אפשריות של הפקודה במערכת התסריטים:

{אפשרות ראשונה}
Try
  ...
Except
  ...
End;

{אפשרות שניה}
Try
  ...
Except
  ...
Finally
  ...
End;

{אפשרות שלישית}
Try
  Try
    ...
  Except
    ...
  End;
Finally
  ...
End;

מערכים

* יש לייצר את המערך הנדרש בראש הפרוצדורה/פונקציה.
* מערך דינאמי לא משנה את גודול באופן אוטומטי. יש להכריז על גודלו באמצעות setlegth כמוסבר בהמשך.

Procedure Init;
Var Vector:  Array[1..5] of integer; //הגדרת מערך בעל 5 תאים מסוג מספר. שים לב: המערך יתחיל בספרה 1
    Vector2: Array of integer;       //הגדרת מערך דינאמי מסוג מספר
    Test: String;                    //הגדרת משתנה מסוג String בדוגמה הנל ניגש אל ערכיו בתצורת מערך.
    i: integer;
Begin
  For i:= 1 To 5 Do
    Vector[i]:= i*100;

  PopupMessage(_Int_To_Str(Vector[3], False));

  Test:= 'Yaniv';
  PopupMessage(Test[2]);             //a התוצאה תהיה הקפצת חלון המציג את האות

  SetLength(Vector2, 3);
  Vector2[0]:= 0;
  Vector2[1]:= 10;
  Vector2[2]:= 200;
  ShInt(Vector2[1]);
End;