ניתוח תחבירי (Parsing)

Slides:



Advertisements
Similar presentations
ממיבחניםC שאלות ++.
Advertisements

מבוא למדעי המחשב לתעשייה וניהול
1 Formal Specifications for Complex Systems (236368) Tutorial #4 Refinement in Z: data refinement; operations refinement; their combinations.
טבלאות סמלים נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח.
צורה נורמלית של גרייבך הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 11.
Lecture 03 – Syntax analysis: top-down parsing Eran Yahav 1.
Theory of Compilation Erez Petrank Lecture 2: Syntax Analysis, Top-Down Parsing 1.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
ניתוח תחבירי Top-Down.
מנתח LL(1) נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מה החומר למבחן ? כל החומר שנלמד בהרצאות ובתרגולים. לגבי backtracking: לא תידרשו לממש אלגוריתם, אך כן להבין או להשלים מימוש נתון. אחת משאלות המבחן מבוססת.
עבודה סמינריונית Prelude to Ukkonen algorithm ON-LINE CONSTRUCTION OF SUFFIX TREES מגישים : עיד מוחמד טיבי פיראס.
ניתוח תחבירי (Parsing) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper and Torczon – Chapter 3.
אוטומט מחסנית הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 11.
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
מרצה: פרופסור דורון פלד
עיבוד תמונות ואותות במחשב אלכסנדר ברנגולץ דואר אלקטרוני : שיטות קידוד שיטות קידוד אורך מלת קוד ואנטרופיה אורך מלת קוד ואנטרופיה קידוד.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
ניתוח תחבירי (Parsing) - המשך. תזכורת : סוגי הניתוח התחבירי top-down – מהשורש לעלים ( נקרא גם – " ניתוח תחזית " – predictive) bottom-up – מהעלים לשורש.
תורת הקבוצות חלק ב'. קבוצה בת מניה הגדרה: קבוצה אינסופית X היא ניתנת למניה אם יש התאמה חד-חד ערכית בין X לבין .
צורות נורמליות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 10.
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
Backpatching 1. תזכורת מתרגול קודם קוד ביניים - שפת הרביעיות שיטות לייצור קוד ביניים –שימוש בתכונת code –כתיבה ישירה ל-buffer של פקודות שיטות לתרגום מבני.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
The Cyclic Multi-peg Tower of Hanoi מעגלי חד-כווני סבוכיות הפתרון בגרסאות עם יותר מ-3 עמודים.
טיב פני שטח (טפ"ש) טיב פני שטח- רמת החלקות של המשטח.
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
1 Data Structures, CS, TAU, Perfect Hashing בעיה: נתונה קבוצה S של n מפתחות מתחום U השוואה ל- Hash : * טבלה קבועה (Hash רגיל - דינאמי) * רוצים זמן קבוע.
עקרון ההכלה וההדחה.
יחס סדר חלקי.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
תחשיב היחסים (הפרדיקטים)
Markov Decision Processes (MDP) תומר באום Based on ch. 14 in “Probabilistic Robotics” By Thrun et al. ב"הב"ה.
עצים בינאריים - תזכורת דרגת צומת שורש עלה צומת פנימי מרחק בין 2 צמתים
ניתוח תחבירי Top-Down נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח 1.
תורת הקומפילציה הרצאה 2 ניתוח לקסיקלי Wilhelm, and Maurer – Chapter 7 Aho, Sethi, and Ullman – Chapter 3 Cooper and Torczon – Chapter 2.
מתמטיקה בדידה תרגול 2.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
Points on a perimeter (Convex Hull) קורס – מבוא לעבוד מקבילי מבצעים – אריאל פנדלר יאיר ברעם.
(C) סיון טל גילוי מידע וזיהוי תבניות תרגול מס. 9 גילוי מידע וזיהוי תבניות תרגול מס. 9 דחיסת נתונים מהו קידוד תכונות של קידודים אי - שוויון קרפט.
מנתח LL(1) נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח 1.
ניתוח לקסיקלי Wilhelm, and Maurer – Chapter 7 Aho, Sethi, and Ullman – Chapter 3 Cooper and Torczon – Chapter 2.
ניתוח תחבירי (Parsing) של דקדוקי LL(1)
Theory of Compilation Erez Petrank Lecture 2: Syntax Analysis, Top-Down Parsing 1.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
שיאון שחוריMilOSS-il מוטיבציה  python זה קל ו C זה מהיר. למה לא לשלב?  יש כבר קוד קיים ב C. אנחנו רוצים להשתמש בו, ולבסס מעליו קוד חדש ב python.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
Compiler Principles Fall Compiler Principles Lecture 2: Parsing part 1 Roman Manevich Ben-Gurion University 1.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 6. מפעל השעווה – לולאות  עד עכשיו  טיפלנו בייצור נרות מסוג אחד, במחיר אחיד  למדנו להתמודד עם טיפול במקרים שונים.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
Lecture 02b – Syntax analysis: top-down parsing Eran Yahav 1.
Formal Specifications for Complex Systems (236368) Tutorial #1
מבוא למדעי המחשב סיבוכיות.
תירגול 14: מבני נתונים דינאמיים
עבודה עם נתונים באמצעות ADO.NET
ממשקים - interfaces איך לאפשר "הורשה מרובה".
בעיות נוספות ב-NPC.
תזכורת מתרגולים אחרונים
תזכורת על מה דיברנו שיעור שעבר? בנינו אתר אינטרנט עם כותרות
תוכנה 1 תרגול 13 – סיכום.
Engineering Programming A
Presentation transcript:

ניתוח תחבירי (Parsing) תורת הקומפילציה 236360 הרצאה 3 ניתוח תחבירי (Parsing) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper and Torczon – Chapter 3

front-end שלב הניתוח תוכנית מקור token string Back end parse tree Lexical Analysis token string symbol table syntax analysis Parsing error messages parse tree semantic analysis decorated syntax tree

האינטרקציה בין המנתח לקסיקלי וה-parser תוכנית מקור error message manager Lexical analysis get next token token parser

ניתוח סינטקטי המטרה: להבין את המבנה של התוכנית. למשל: תוכנית C בנויה מפונקציות, כל פונקציה בנויה מהצהרות ופקודות, כל פקודה בנויה מביטויים וכו'. צורה פשוטה אך מדויקת לניסוח מבנה של תוכנית (בשפת תוכנית ספציפית) היא ע"י דקדוק חסר הקשר. אנו נתעניין במחלקות של דקדוקים ח"ה שניתן לנתח ביעילות. פרטים בהמשך... ה-parser יקרא את רצף ה-tokens, יוודא שהם מקיימים את הדקדוק (או יתריע על שגיאות), ויבנה את עץ הגזירה של התוכנית.

דקדוק חסר הקשר G=(V, T, P, S) V – nonterminals, משתנים T – terminals, טרמינלים, tokens P – חוקי גזירה P = V  (V U T)* S – משתנה תחילי S  V

דוגמא: דקדוק ח"ה עבור ביטוי אריתמטי סִימוּן מָלֵא: סימון מקוצר: {E, A} V = { ( , ) , - , id , +, - ,  , / , ^} T = A  +, , { E  E A E P = A  ‒, E  ( E ) A  , E  - E A  ^} A  /, E  id E S = E A E | ( E ) | - E | id E  + | ‒ |  | / | ^ A 

שפה חסרת הקשר גזירה – סדרה של החלפות של אותיות לא טרמינליות תוך שימוש בחוקי הגזירה שפה – אוסף ביטויים הנגזרים מהמצב התחילי והמכילים טרמינלים בלבד E A E  E id A E id + E id + id סימון הגזירה

שפה חסרת הקשר גזירה – סדרה של החלפות של אותיות לא טרמינליות תוך שימוש בחוקי הגזירה שפה – אוסף ביטויים הנגזרים מהמצב התחילי והמכילים טרמינלים בלבד תבנית פסוקית (sentential form) – תוצאת סדרת גזירות בה נותרו (אולי) לא-טרמינלים E * id + E גזירה שמאלית – גזירה בה מוחלף בכל שלב הסימן השמאלי ביותר (באופן דומה – גזירה ימנית) ניתן לגזירה (רב שלבית) E E A  E A id  E A id +  E A id + 

דוגמא לגזירה bottom-up נתון דקדוק S → a A c B e A → A b | b B → d קלט – a b b c d e a b b c d e נבחר בשמאלית a A b c d e a A c d e a A c B e  A A 3 אלטרנטיבות B  A A 3 אלטרנטיבות B  B S

דוגמא לגזירה bottom-up נתון דקדוק S → a A c B e A → A b | b B → d קלט – a b b c d e a b b c d e נבחר בשמאלית a A b c d e a A c d e a A c B e  A A 3 אלטרנטיבות B  A A 3 אלטרנטיבות B  B S

דוגמא לגזירה bottom-up נתון דקדוק S → a A c B e A → A b | b B → d קלט – a b b c d e a b b c d e נבחר בשמאלית a A b c d e a A c d e a A c B e  A A 3 אלטרנטיבות B  A A 3 אלטרנטיבות B  B S

דוגמא לגזירה bottom-up נתון דקדוק S → a A c B e A → A b | b B → d קלט – a b b c d e a b b c d e נבחר בשמאלית a A b c d e a A c d e a A c B e  A A 3 אלטרנטיבות B  A A 3 אלטרנטיבות B  B S

דוגמא לגזירה bottom-up נתון דקדוק S → a A c B e A → A b | b B → d קלט – a b b c d e a b b c d e נבחר בשמאלית a A b c d e a A c d e a A c B e  A A 3 אלטרנטיבות B  A A 3 אלטרנטיבות B  B S האם קיבלנו גזירה ימנית או שמאלית?

קיבלנו גזירה ימנית S  a A c B e  a A c d e  a A b c d e  a b b c d e מלמטה תמיד בחרנו בכלל השמאלי ביותר, ולכן הגזירה המתקבלת (מלמעלה) בוחרת קודם בכלל הימני ביותר, כלומר ימנית. נראה גם בעתיד ניתוחי תחביריים שהולכים על הקלט משמאל לימין ויוצרים גזירה ימנית. ניתוחים אלה מסומנים כ-LR והם עובדים בשיטת ה-bottom-up. ניתוחים שהולכים על הקלט משמאל לימין ומייצרים גזירה שמאלית מסומנים ב-LL והם עובדים לפי top-down.

ביטוי רגולרי מול דקדוק חסר הקשר כל מבנה שניתן לבטא ע"י ביטוי רגולרי יכול להיות מתואר ע"י דקדוק ההיפך לא נכון (למשל?) מדוע לא לעשות הכל בדקדוק? כרגיל: הפרדה, מודולריות, פישוט. אין טעם להפעיל כלים חזקים (ופחות יעילים) על ביטויים רגולריים שקל לנתח. ביטוים רגולרים שימושיים עבור תאור מבנים לקסיקלים כ- identifiers, קבועים, מילות מפתח וכו' דקדוקים שימושיים עבור מבנים מקוננים כסוגרים מאוזנים, התאמת begin-end, וכו'

החלק שטרם נקרא חלק הקלט שקראנו סוגי הניתוח התחבירי כל דקדוק חסר-הקשר שקול לאוטומט מחסנית (אי-דטרמיניסטי). אז למה שלא נבנה אוטומט מחסנית (דטרמיניסטי) ונשתמש בו בתור מנתח תחבירי? באופן כללי: Cocke-Younger-Kasami מתאים לכל דקדוק אבל בסיבוכיות O(n3) ולכן האלגוריתם אינו מעשי. המטרה פענוח ובנית עץ הגזירה תוך מעבר בודד על הקלט, משמאל לימין בכל שלב, הקלט w מתחלק ל x y החלק שטרם נקרא חלק הקלט שקראנו

סוגי הניתוח התחבירי (המשך) top-down – מהשורש לעלים (נקרא גם – "ניתוח תחזית" – predictive) bottom-up – מהעלים לשורש – מעבירים למחסנית, או מחליפים צד ימין בסימן מהצד השמאלי של חוק הדקדוק (נקרא גם shift reduce). s  x y s x y

נתחיל בניתוח top-down נתונים לנו דקדוק ומילה. רוצים להחליט ע"י מעבר על המילה, כיצד המשתנה התחילי S נגזר, ואח"כ תוך-כדי סריקת המילה, כיצד ממשיכים לגזור כל משתנה עד שמגיעים לטרמינלים. בדקדוק כללי תיתכן יותר מאפשרות אחת לגזור את המשתנה השמאלי ביותר לפי האות הבאה בקלט. אנו נשתדל לעבוד עם דקדוקים שבהם תהיה רק אפשרות אחת, אולי נצטרך lookahead קטן כדי להחליט מהו כלל הגזירה המתאים הבא.

דקדוק שקל לנתח התבוננו בדקדוק: E → LIT | ( E OP E ) | not E LIT → true | false OP → and | or | xor בכל שלב של הגזירה, אם מסתכלים על משתנה שצריך לגזור והאות הבאה בקלט, ברור מה כלל הגזירה שצריך להפעיל ! E למשל איך נגזרת המילה not ( not true or false ) ? not E E => not E => not ( E OP E ) => not ( not E OP E ) => not ( not LIT OP E ) => not ( not true OP E ) => not ( not true or E ) => not ( not true or LIT ) => not ( not true or false ) ( E OP E ) not LIT LIT or false true

ניתוח top-down תוך כדי הפעלת פונקציות: Recursive Descent מטרה: להתחיל במשתנה התחילי ולמצוא גזירה. עבור כל משתנה בדקדוק (nonterminal) מגדירים פונקציה. המנתח מתחיל לפעול מהפונקציה המתאימה ל-nonterminal התחילי. כל פונקציה מחקה את החוק שעבורו הוגדרה, באופן הבא: terminal מתורגם לקריאת האסימון המתאים מהקלט. nonterminal מתורגם להפעלת הפונקציה המתאימה לו. אם ישנם כמה חוקי גזירה עבור אותו nonterminal, בוחרים ביניהם בעזרת lookahead.

פונקציית עזר: match void match(token t) { if (lookahead == t) lookahead = next_token(); else error; } פונקצייה זו משמשת כדי לקרוא טרמינלים. ה-lookahead הוא של אסימון אחד בלבד.

כתיבת פונקציות בהתאם לדקדוק למשל, עבור הדקדוק: E → LIT | ( E OP E ) | not E LIT → true | false OP → and | or | xor נגדיר שלוש פונקציות: E, LIT ו-OP

כתיבת פונקציות בהתאם לדקדוק void E() { if (lookahead  {TRUE, FALSE}) // E → LIT LIT(); else if (lookahead = LPAREN) // E → ( E OP E ) match(LPARENT); E(); OP(); E(); match(RPAREN); else if (lookahead = NOT) // E → not E match(NOT); E(); else error; }

כתיבת פונקציות בהתאם לדקדוק void LIT() { if (lookahead = TRUE) match(TRUE); else if (lookahead = FALSE) match(FALSE); else error; }

כתיבת פונקציות בהתאם לדקדוק void OP() { if (lookahead = AND) match(AND); else if (lookahead = OR) match(OR); else if (lookahead = XOR) match(XOR); else error; } הפונקציות האלו נראות כאילו הן לא עושות כלום (חוץ מלזהות שגיאות), אבל ניתן כמובן להוסיף לכל אחת קוד נוסף, למשל שבונה את העץ כך שיוחזר העץ המלא של הגזירה ביציאה מן הרקורסיה.

הוספת פעולות במהלך הגזירה בכל פעם שנקראת אחת הפונקציות (למשל, E(), LIT() ו-OP() בדוגמא שלנו), פירוש הדבר ש"איתרנו" צעד בגזירה. בכל צעד כזה ניתן לבצע פעולות שונות. בפרט, ניתן לבנות את עץ הגזירה. כל פונקציה תחזיר רשומה מסוג Node (צומת בעץ). כל רשומה כזו מכילה רשימה של בנים. בכל קריאה לפונקציה אחרת (או ל-match), מוסיפים את תוצאת הקריאה ל-Node שנבנה כעת.

הוספת פעולות במהלך הגזירה Node E() { result = new Node(); result.name = “E”; if (lookahead  {TRUE, FALSE}) // E → LIT result.addChild(LIT()); else if (lookahead = LPAREN) // E → ( E OP E ) result.addChild(match(LPARENT)); result.addChild(E()); result.addChild(OP()); result.addChild(match(RPAREN)); else if (lookahead = NOT) // E → not E result.addChild(match(NOT)); else error; return result; }

הוספת פעולות במהלך הגזירה ואז, למשל: input = “(not true and false)”; Node treeRoot = E(); E ( E OP E ) not LIT and LIT true false

Recursive Descent גנרי נחזור לרגע לצורה הבסיסית. לכל משתנה דקדוק A יש פרוצדורה הנראית כך: Void A() { Choose an A-production, A -> X1X2…Xk; for (i=1; i≤ k; i++) { if (Xi is a nonterminal) call procedure Xi(); elseif (Xi == lookahead) advance input; else report error; } איך מבצעים את הבחירה של כלל הגזירה? ניתן פשוט לנסות אותם אחד אחר השני ולהמשיך באופן רקורסיבי עם backtracking. אבל זה יכול להיות מאד יקר.

איך מחליטים בין הכללים? בדוגמה שראינו הספיק lookahead של אסימון יחיד. פורמלית: עבור כלל A→α, נגדיר: FIRST(α) – רשימת האסימונים שהם ראשונים באחת או יותר גזירות אפשריות הנובעות מכלל זה. בדוגמה שלנו, עבור הכללים ל-E: FIRST(LIT) = { true, false } FIRST( ( E OP E ) ) = { ( } FIRST(not E) = { not } אין שום חיתוך בין הקבוצות השונות ולכן ניתן מיד לדעת מה לגזור עם lookahead של אסימון יחיד.

איך מחליטים בין הכללים? אם יש חיתוך בין ה-FIRSTs עבור כללים שונים ל-nonterminal נתון, צריך לתקן את הדקדוק או להשתמש ב-lookahead עמוק יותר. מחלקת הדקדוקים שעבורם ניתן לקבוע את כלל הגזירה הבא בכל פעם ע"י lookahead של k אסימונים נקראת LL(k).

דוגמא לבעיה הניתנת לפיתרון רקורסיה שמאלית יוצרת בעיית זיהוי עבור ניתוח top-down שלא ניתן לפתור בעזרת lookahead חסום. A -> AaB | aC לא ניתן לדעת איזה מהכללים להפעיל. (ויותר: backtracking עשוי להיתקע בלולאה אינסופית! ) משנים את הדקדוק. לכל דקדוק עם רקורסיה שמאלית יש דקדוק מקביל בלעדיה. A -> aCA’ A’ -> aBA’ | ε נלמד את אלגוריתם האלימינציה של רקורסיה שמאלית. בשיעורים הבאים נלמד על המחלקה LL(1) של דקדוקים הנוחים לגזירה מהירה, ומתאימים לשפות תכנות רבות.

מראה גזירה (לדוגמא) של תוכנית כללית program Main function More Functions { Decls Stmts } Function More Functions { Decls Stmts } Function { Decls Stmts } Decl Decls Stmt Stmts Decl Decls Stmt Type Id ; Decl id = expr ;

טיפול בשגיאות – נושא חשוב סוגי שגיאות שגיאות לקסיקליות (טעויות "דפוס"). שגיאות תחביריות (סוגרים לא מאוזנים). שגיאות סמנטיות (אופרנדים מטיפוס לא מתאים). שגיאות לוגיות (לולאה אינסופית, אבל גם שימוש ב-"=" במקום "=="). דרישות דיווח על שגיאות בצורה ברורה. היחלצות מהירה משגיאות כך שאפשר יהיה לגלות שגיאות המופיעות בהמשך. שימור יעילות ה-parser.

גישות לטיפול בשגיאות ראשית, מודיעים איפה הניתוח נתקע. בד"כ זה די קרוב לשגיאה. הבעיה העיקרית היא ההיחלצות מהשגיאה לצורך המשך ניתוח. panic mode – השמטת קטעים מהקלט עד מציאת סימן סנכרון ברור (למשל ";" או סוגר סוגריים). פשוט, אבל מאבד חלק (לפעמים משמעותי) מהקוד. phrase-level recovery – נסיונות תיקון מקומיים. למשל החלפת "," ב ";", הורדה או הוספה של ";", וכיו"ב. לא יעבוד אם הטעות קרתה לפני הזיהוי. error production - טיפול בשגיאות צפויות ע"י תיקון אוטומטי במסגרת הדקדוק. global correction – מציאת השינוי המינימאלי בתוכנית שיהפוך אותה לגזירה. יקר, לא פרקטי.

parsing: מפורמליזם לתוכנה grammar parse generator parsing tables parser driver parsing tables tokens parser syntax tree העיקרון דומה לזה של הניתוח הלקסיקאלי. הפורמליזם והשיטות – שונים הפורמליזם – דקדוק חסר הקשר האמצעי – הרצת ה-parsing table ע"י recursive descent. לכל משתנה ו-lookahead מתאים נאמר בטבלה מה להפעיל.

לסיכום לאחר שמקלפים את הקליפה הלקסיקלית, מפעילים ניתוח תחבירי parser על ה-tokens להבנת התחביר - עץ התוכנית. מבנה תוכנית חוקית מתואר בפשטות ובדייקנות ע"י דקדוק חסר-הקשר. המנתח התחבירי (parser) עובד בשיטת bottom-up או top-downומגלה אם התוכנית נגזרת מהדקדוק ואיך. שיטת ה-recursive descent משתמשת בפונקציה המתאימה לכל משתנה המחליטה על גזירת המשתנה עפ"י look-ahead. בעת הפעלת הפונקציות תוך כדי הניתוח ניתן כמובן לעשות דברים נוספים, כגון לשמור מידע על עץ הגזירה לשימוש עתידי וכיו"ב. ניתוח דקדוק כללי הוא קשה. ראינו דוגמא לדקדוק קל מאד לניתוח. בשיעורים הבאים נדבר על מחלקות של דקדוקים ריאליסטיים שניתן לנתח ביעילות.