ברוכים הבאים ליחידה "ניתוח לקסיקלי וסינטקטי" בקורס "שפות תכנות". יחידה זו חיונית להבנת הדרך שבה מחשבים מפרשים ומבינים את קוד המקור שאנו כותבים. נצלול לעומק התהליכים המאפשרים למחשב לזהות את אבני הבניין הבסיסיות של הקוד (אסימונים) ולאחר מכן לבנות מהם מבנה היררכי הגיוני (עץ ניתוח), בדומה לאופן שבו אנו מבינים משפט בשפה טבעית.
ניתוח לקסיקלי: זיהוי אבני הבניין של הקוד
השלב הראשון בהבנת קוד המקור הוא הניתוח הלקסיקלי (Lexical Analysis), המכונה גם סריקה (Scanning). בשלב זה, הקומפיילר (או המפרש) קורא את קוד המקור תו אחר תו ומקבץ אותם ליחידות משמעותיות.
ביטויים רגולריים להגדרת אסימונים
כיצד מזהה המנתח הלקסיקלי אילו רצפי תווים מהווים אסימונים? התשובה טמונה בביטויים רגולריים. כל סוג של אסימון מוגדר באמצעות ביטוי רגולרי המתאר את התבנית של הלקסמות השייכות אליו.
ניתוח סינטקטי: בניית מבנה הקוד
לאחר שהמנתח הלקסיקלי סיפק זרם של אסימונים, המנתח הסינטקטי (Syntactic Analysis), המכונה גם מנתח תחבירי (Parser), נכנס לפעולה. תפקידו הוא לבדוק אם רצף האסימונים תואם את כללי הדקדוק של השפה וליצור ייצוג מבני של הקוד.
עצי ניתוח: ייצוג ויזואלי של המבנה
התוצר העיקרי של הניתוח הסינטקטי הוא עץ הניתוח, המכונה גם עץ תחבירי (Parse Tree) או עץ גזירה (Derivation Tree). עץ זה מציג את המבנה ההיררכי של הקוד בהתאם לכללי הדקדוק.
עץ הניתוח מאפשר לקומפיילר להבין את המשמעות המבנית של הקוד, למשל, איזה אופרטור קודם לאיזה, או מהו גוף הלולאה. הוא מהווה בסיס לשלבים הבאים בקומפילציה, כמו ניתוח סמנטי ויצירת קוד ביניים.
הקשר בין ניתוח לקסיקלי לסינטקטי
שני השלבים הללו פועלים בתיאום הדוק, בדרך כלל באופן איטרטיבי. המנתח הסינטקטי "מבקש" מהמנתח הלקסיקלי את האסימון הבא בכל פעם שהוא זקוק לו כדי להמשיך בבניית עץ הניתוח.
ניתוח לקסיקלי
קלט: זרם תווים (קוד מקור).
פלט: זרם אסימונים.
מטרה: זיהוי לקסמות והפיכתן לאסימונים.
כלים: ביטויים רגולריים, אוטומטים סופיים.
שגיאות: תווים לא חוקיים, לקסמות לא מוכרות.
ניתוח סינטקטי
קלט: זרם אסימונים.
פלט: עץ ניתוח (או שגיאה).
מטרה: בדיקת תקינות מבנית ובניית ייצוג היררכי.
כלים: דקדוקים חסרי הקשר, אוטומטי מחסנית.
שגיאות: הפרת כללי הדקדוק (למשל, סוגריים לא סגורים, אופרטורים במקום לא נכון).
שאלות לדיון
- הסבר את ההבדל המהותי בין אסימון ללקסמה, ותן דוגמה לכל אחד מהם בהקשר של שפת תכנות.
- כיצד ביטויים רגולריים תורמים ליעילות ולדיוק של הניתוח הלקסיקלי? תאר מצב שבו הגדרה לא נכונה של ביטוי רגולרי יכולה לגרום לשגיאות.
- מהו התפקיד של דקדוק חסר הקשר (CFG) בניתוח סינטקטי? ציין את ארבעת המרכיבים העיקריים של CFG.
- בהינתן קטע קוד פשוט (לדוגמה:
x = y + 5;), תאר בקצרה את תהליך הניתוח הלקסיקלי והסינטקטי שיעבור עליו, כולל התוצרים בכל שלב.
נקודות לתשובת מודל
- אסימון ולקסמה: אסימון הוא קטגוריה (למשל, ID, NUMBER), לקסמה היא מופע ספציפי של הקטגוריה (למשל, "myVar", "123").
- ביטויים רגולריים: מגדירים תבניות ללקסמות, מאפשרים זיהוי אוטומטי ויעיל של אסימונים. שגיאה בהגדרה עלולה לגרום לזיהוי שגוי או אי-זיהוי של לקסמות חוקיות.
- דקדוק חסר הקשר (CFG): מגדיר את כללי התחביר של השפה. מרכיבים: סמלים טרמינליים, סמלים לא-טרמינליים, סמל התחלה, כללי יצירה.
- עצי ניתוח: ייצוג היררכי של מבנה הקוד, נבנה על ידי הפארסר בהתאם ל-CFG. משמש לבדיקת תקינות תחבירית ולבסיס לשלבים הבאים.
- אינטראקציה: הלקסר מספק אסימונים לפארסר, הפארסר בונה מהם את עץ הניתוח ובודק עמידה בכללי הדקדוק. כל שלב מטפל בסוג שגיאות שונה.