330 likes | 651 Views
backend. ניתוח סמנטי. ניתוח תחבירי. ניתוח לקסיקלי. תזכורת מתרגולים אחרונים. מבנה סכמתי של קומפיילר ניתוח תחבירי: Top Down : LL(1) , RD Bottom up : LR(0) SLR LR(1) CLR LALR. אסימונים (tokens). ניתוח מלמטה למעלה – Bottom Up.
E N D
backend ניתוח סמנטי ניתוח תחבירי ניתוח לקסיקלי תזכורת מתרגולים אחרונים • מבנה סכמתי של קומפיילר • ניתוח תחבירי: • Top Down: LL(1) ,RD • Bottom up: • LR(0) • SLR • LR(1)\ CLR • LALR אסימונים (tokens)
ניתוח מלמטה למעלה – Bottom Up • מתחילים את הניתוח במילת הקלט, ומנסים להגיע עד למשתנה ההתחלתי (שורש עץ הגזירה). • מחליפים תבנית פסוקית במשתנה הגוזר אותה. • תכונות מנתחי LR: • קוראים את הקלט משמאל לימין (L) • מוצאים את הגזירה הימנית (R) ביותר, בסדר הפוך לסדר הגזירה. • דוגמא לניתוח בגישת Bottom-Up:
מבנהמנתח LR מנתח LR מכיל: סרט הקלט (בעל א"ב של טרמינלי הדקדוק, וסימן סוף הקלט). מחסנית: תוכנה מייצג את התבנית הפסוקית שראינו עד עתה. הניתוח ייעצר כאשר תוכנה יהיה רק S – שורש עץ הגזירה. טבלת ניתוח התלויה בדקדוק (action ו- goto).
מבנהמנתח LR • שלבי בניית המנתח: • בניית אוטומט פרפיקסי לפי הדקדוק הנתון • בניית טבלת הניתוח ע"פ האוטומט הפרפיקסי • הרצת המנתח על קלט: • בכל צעד המנתח יכול: • להכניס תו מהקלט למחסנית • או: • לצמצם תבנית פסוקית בראש המחסנית למשתנה הגוזר אותה
מנתח LR(0) • במנתח LR(0)אין lookahead, כלומר: • מצפים מהאלגוריתם לזהות כל כלל לאחר קריאת כל החלק הימני שלו, בלי קריאת ההמשך. • LR(0) הוא הפשוט ביותר מבין מנתחי LR. • קיימים דקדוקים רבים שהוא לא יצליח לנתח. • אלגוריתם LR(1) מסוגל להתמודד עם רב שפות התכנות הקיימות.
מנתח LR(0) – בניית האוטומט • פריט LR(0) הוא (A→α●β) כאשר • פריט מסמל את מצבו של המנתח. • משמעותו: זיהינו את מה שנמצא לפני הנקודה, וכעת אנו מצפים למצוא את מה שנמצא מימינה. • כל אחד ממצבי אוטומט המנתח הוא קבוצת פריטי LR(0). • שאלה: אילו פריטים אפשר לקבל עבור הכלל: A ε ?
מנתח LR(0) – בניית האוטומט • פריט LR(0) הוא (A→α●β) כאשר A→αβ P • כל אחד ממצבי אוטומט המנתח הוא קבוצת פריטי LR(0). • סגור (closure) על קבוצת פריטים I מוגדר באופן אינדוקטיבי: • בסיס: closure(I)=I • צעד: אם (A→α●Bβ)closure(I) אז • לכל B→γ P גם (B→●γ)closure(I) • פונקצית המעברים של האוטומט: קבוצת פריטי LR(0)
דוגמא - LR (0) 0) S’ S 1) S aA 2) S aB 3) A a 4) B b • בניית אוטומט פרפיקסי: 0 S` ●S S ●aA S ●aB • I0 = closure({S’→●S}) • closure(I)=I • If (A→α●Bβ)closure(I), then for allB→γ P, add (B→●γ) to closure(I)
דוגמא - LR (0) 0) S’ S 1) S aA 2) S aB 3) A a 4) B b • בניית אוטומט פרפיקסי: 0 S` ●S S ●aA S ●aB 2 S a●A S a●B A ●a B ●b a S S’ S● 1
דוגמא - LR (0) 0) S’ S 1) S aA 2) S aB 3) A a 4) B b • בניית אוטומט פרפיקסי: b 0 S` ●S S ●aA S ●aB 2 S aB● B A a 3 S a●A S a●B A ●a B ●b a S aA● 4 S A a● 5 S’ S● 1 B b● 6 הערה: מדוע מוסיפים את כלל 0 ? על מנת שהמשתנה ההתחלתי יופיע בחוקי הגזירה רק באגף שמאל. כך בצמצום למשתנה ההתחלתי אכן יובטח שאין עוד סימנים במחסנית ונדע שהסתיימה הגזירה.
מנתח LR(0) – בניית טבלת הניתוח אינדקס של מצב באוטומט הגדרת טבלת action למנתח LR(0): הגדרת טבלת goto למנתח LR(0):
דוגמא – בניית טבלת הניתוח b 0 S` ●S S ●aA S ●aB 2 S aB● B A a 3 S a●A S a●B A ●a B ●b actions goto 0) S’ S 1) S aA 2) S aB 3) A a 4) B b a S aA● 4 S A a● 5 S’ S● 1 B b● 6
פעולות אפשריות בטבלת ה Action • נסמן ב- t הוא הטרמינל בראש הקלט. • shift(k) - (בצע shift אל מצב k) : • דחוף למחסנית את (k,t). • קדם את הראש הקורא את הקלט צעד אחד ימינה. • reduce(j) - (בצע reduce לפי כלל הגזירה A→α שמספרו הוא j): • הוצא |α| זוגות מהמחסנית. סמן ב k’ את המצב שהתגלה בראש המחסנית. • דחוף למחסנית את (goto[k’,A],A) . • ניתן להוציא כפלט את j (מספר כלל הגזירה בו השתמשנו). הדפסת כללי הגזירה בסדר הפוך תיתן את הגזירה הימנית ביותר. • accept – קבל את המילה. (הערה: שקול לפעולה reduce(0) ). • error – הודע על שגיאה.
0) S’ S 1) S aA 2) S aB 3) A a 4) B b דוגמא LR (0) - הרצה רצף האסימונים בקלט: ab$ [goto(2,B)=3] [goto(0,S)=1] בכל שלב, תוכן המחסנית הוא רישא של תבנית פסוקית חוקית
מנתח SLR • יכול לזהות יותר דקדוקים לעומת LR(0) ללא קונפליקטים. • השינוי לעומת LR(0) : • לכל מצב עם פריט A α● , מוסיפים reduce מתאים בשורה של A בטבלת הaction, רק לעמודות שהאסימון שבראשן שייך ל- follow(A). • ב- SLR בונים את טבלת הניתוח על סמך אוטומט פרפיקסי המשתמש בפריטי LR(0). • הגדרת טבלת action למנתח SLR:
דוגמא - SLR 0) S’ S 1) S aA 2) S aB 3) A a 4) B b • אוטומט פרפיקסי – נשאר אותו דבר: b B A a 0 S` ●S S ●aA S ●aB 2 a S aB ● 3 S a●A S a●B A ● a B ● b S aA ● 4 S A a ● 5 S’ S● 1 B b ● 6
0) S’ S 1) S aA 2) S aB 3) A a 4) B b • דוגמא - SLR • בניית טבלת הניתוח: follow(S) = follow(A) = follow(B) = {$} actions goto
קונפליקטים אפשריים במנתחי LR • קונפליקט נוצר בטבלת הניתוח כאשר יש 2 פעולות שונות או יותר באותה משבצת בטבלה. • קיימים 2 סוגי קונפליקטים: • קונפליקט shift/reduce : • האם להמשיך לקרוא את הקלט או לצמצם ? • קונפליקט : reduce/reduce • לפי איזה כלל גזירה לצמצם ? • שאלה: מדוע אין קונפליקט shift/shift ?
דוגמא - קונפליקט R\R 0. S` S$ 1. S Aa 2. S Bb 3. A b 4. B b LR(0) S` ●S$ S ●Aa S ●Bb A ●b B ●b b A b● B b● 0 1
דוגמא - קונפליקט R\R 0. S` S$ 1. S Aa 2. S Bb 3. A b 4. B b Follow(A)={a} Follow(B)={b} SLR S` ●S$ S ●Aa S ●Bb A ●b B ●b b A b● B b● 0 1 נשים לב כי מעבר ל SLR פותר את הקונפליקט במקרה זה.
דוגמא - קונפליקט R\R 0. S` S$ 1. S Aa 2. S Ba 3. A b 4. B b • אבל עבור הדקדוק הבא: Follow(A)={a} Follow(B)={a} SLR S` ●S$ S ●Aa S ●Ba A ●b B ●b b A b● B b● 0 1 בדוגמא זו מעבר ל SLR אינו פותר את הקונפליקט.
דוגמא - קונפליקט R\S 0. S` S$ 1. S A 2. S aAa 3. A a LR(0) S` ●S$ S ●A S ●aAa A ●a a a A a● S a●Aa A a● A ●a 2 0 1
דוגמא - קונפליקט R\S 0. S` S$ 1. S A 2. S aAa 3. A a LR(0) SLR Follow(A)={a, $} S` ●S$ S ●A S ●aAa A ●a a a A a● S a●Aa A a● A ●a 2 0 1
דוגמא - קונפליקט R\S 0. S` S$ 1. S A 2. S aAa 3. A a LR(0) SLR Follow(A)={a, $} S` ●S$ S ●A S ●aAa A ●a a a A a● S a●Aa A a● A ●a 2 0 1 בדוגמא זו, הקונפליקט קיים גם ב LR(0) וגם ב SLR.
שאלה 1 G דקדוק LR(0) שבריצת מנתח ה- LR(0) שלו התקבל תוכן המחסנית: [0],[x,a],[y,b],[z,S],[w,b] א ) הוכח/הפרך: G יכול להכיל כלל: S->a ב) ענו על א' כאשר הפעם G הוא SLR
שאלה 1 G דקדוק LR(0) שבריצת מנתח ה- LR(0) שלו התקבל תוכן המחסנית: [0],[x,a],[y,b],[z,S],[w,b] א ) הוכח/הפרך: G יכול להכיל כלל: S->a תשובה: G לא יכול להכיל כלל זה. אם נניח בשלילה שקיים כלל כזה ב- G, אז נקבל שבמצב x באוטומט יש קונפליקט s/r אם האסימון הבא בקלט הוא b, וזו סתירה לכך ש- G הוא LR(0). ב) ענו על א' כאשר הפעם G הוא SLR תשובה: G לא יכול להכיל כלל זה. הנימוק דומה לסעיף הקודם, אך כעת כיוון שמדובר ב- SLR, צריך גם להתקיים ש- b נמצא ב- follow(S). ע"פ הנתון על תוכן המחסנית זה אכן מתקיים.
שאלה 2 נתון ש- G הוא דקדוק SLR. הוכח/הפרך: אם V={S} אז טבלת הפעולות עבור האוטומט הפרפיקסי למנתח LR(0) עבור Gאינה מכילה קונפליקט R/R . תשובה: הטענה נכונה. אם נניח בשלילה שיש קונפליקט R/R, אז יש מצב באוטומט שבו יש שני פריטים מהצורה: S α● , S β●, אך זה גורר ש- G הוא גם לא ב- SLR בסתירה לנתון. (יש לשים לב שמדובר באותו אוטומט גם עבור מנתח LR(0) וגם עבור מנתח SLR עבור הדקדוק G).
שאלה 3 האם יש יחסי הכלה בין המחלקות: LL(1) , LR(0) , SLR? • LR(0)מוכלת ב- SLR • לכל דקדוק G שאין בו כללי אפסילון, אם הוא ב- LL(1) אז הוא גם ב- LR(0) . • דוגמא לדקדוק ב- LL(1) שאינו ב- LR(0): S a| ε • דוגמא לדקדוק ב- LL(1) שאינו ב- SLR: S AaAb | BbBa • A ε • B ε • דוגמא לדקדוק ב- LR(0) שאינו ב- LL(1): S aA | aB • A a • B b