230 likes | 407 Views
מנתח LL(1). נכתב ע"י אלכס קוגן ( (sakogan@cs סמסטר חורף, תשס"ח. S. A. תזכורת מהתרגול הקודם. ניתוח Top-Down : מתחילים מ- S , מפעילים כללי גזירה עד שמגיעים למילת הקלט. A α A β ?. שיטת Recursive Descent שיפור מנגנון ההחלטה
E N D
מנתח LL(1) נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח
S A תזכורת מהתרגול הקודם • ניתוח Top-Down: מתחילים מ-S, מפעילים כללי גזירה עד שמגיעים למילת הקלט. A α A β ? • שיטת Recursive Descent • שיפור מנגנון ההחלטה • כדי להחליט איזה כלל להפעיל על סמך הטרמינל הבא הנצפה בקלט, הגדרנו את פונקצית select
תזכורת (המשך) • select(Aα): קבוצת כל הטרמינלים אשר יגרמו לבחור בכלל הזה עבור המשתנה A. • לצורך חישוב select, הגדרנו את פונקציות העזר first ו-follow • first(A): כל הטרמינלים שיכולים להופיע בתחילת מילה שנגזרת מ-A. • first(α): ההרחבה של first לתבניות פסוקיות. • follow(A): כל הטרמינלים שיכולים להופיע אחרי המשתנה A בגזירה כלשהי.
מנתח LL(1) • קורא קלט משמאל לימין, מייצר ניתוח שמאלי ביותר ונעזר ב-lookahead של טרמינל אחד. • מסתמך על פונקציתselect בעת הניתוח. • לדקדוק G קיים מנתח LL(1) אם ורק אם לא קיים קונפליקט בדקדוק, כלומר לכל שני כללים בדקדוק עבור אותו המשתנה- Aα , Aβ: select(Aα) ∩ select(Aβ) = Ø • הרעיון: לחקות בעזרת מחסנית את תכנית ה - Recursive Descent • שקול בכוח הניתוח ל-RD
X α t select(X α) M (X,t) = error otherwise X V t T מבני נתונים של המנתח • Q: מחסנית הניתוח שמחזיקה את מה שרוצים עדיין לראות • בראש המחסנית - מה שרוצים לראות מיד • אתחול: בראש המחסנית יהיה S • תומכת בפעולות pop, push, top • M: טבלה שאומרת איזה כלל גזירה יש להפעיל בהינתן המשתנה הבא לגזירה והטרמינל הבא בקלט כאשר אין קונפליקטים, כל תא של M מכיל איבר אחד בלבד
דוגמה • נתון דקדוק הבא: • S Ab | bC • A a • C cA • נבנה טבלת M של מנתח LL(1). • לצורך כך, נחשב תחילה את פונקציית select עבור כל כלל גזירה.
דוגמה (המשך) select(SAb) = {a} select(SbC) = {b} select(Aa) = {a} select(CcA) = {c} בניית הטבלה M: המקומות הריקים מכילים error
פעולות המנתח • SHIFT: הוצאת טרמינל מהקלט • REPLACE X,t: החלפת משתנה X בצד ימין של כלל גזירה מתאים • חפש ב-M(X,t) איזה כלל גזירה להפעיל • אם מצאת error, עצור עם הודעת שגיאה • אחרת, נניח שזהו כלל X Y1Y2…Yn. הוצא את X מהמחסנית ודחוף Y1Y2…Ynלמחסנית בסדר הפוךכאשר Y1בראש המחסנית ראש ראש REPLACE A,e כאשר M(A,e) = A BCd
אלגוריתם הניתוח Init: push(Q,S), t is the next terminal in input • If (isEmpty(Q)) • if (t == $), report success // $ - end of input • else, report error • else • X = top(Q) • if (X is terminal) • if X ≠ t, report error • else, SHIFT and pop(Q) • if (X is variable) • if M[X,t] == error, report error • else do REPLACE (X,t) • goto 1
X = top(Q) • if (X is terminal) • if X ≠ t, report error • else, SHIFT and pop(Q) • if (X is variable) • if M[X,t] == error, report error • else do REPLACE (X,t) המשך הדוגמה • ריצת המנתח על המילה bca:
X = top(Q) • if (X is terminal) • if X ≠ t, report error • else, SHIFT and pop(Q) • if (X is variable) • if M[X,t] == error, report error • else do REPLACE (X,t) המשך הדוגמה • ריצת המנתח על המילה bca: ראש המחסנית
X = top(Q) • if (X is terminal) • if X ≠ t, report error • else, SHIFT and pop(Q) • if (X is variable) • if M[X,t] == error, report error • else do REPLACE (X,t) המשך הדוגמה • ריצת המנתח על המילה bca:
שאלה לדוגמה תנו דוגמה לדקדוק ח"הG אשר מקיים: • L(G) מכילה לפחות שתי מילים. • G אינו דקדוק LL(1). • G הינו דקדוק LL(k) עבור k>1. • מספר המשתנים, הטרמינלים וכללי הגזירה ב-G הוא המינימלי שניתן לבחור כך שהדרישות 1-3 יתקיימו.
פתרון השאלה • הדקדוק חייב להכיל לפחות שני כללי גזירה מאותו משתנה • מדוע? • חייב להיות לפחות משתנה אחד • מדוע? • חייב להיות לפחות טרמינל אחד • מדוע? • לפיכך, נציע: S aa | a • L(G) מכילה לפחות שתי מילים. • G אינו דקדוק LL(1). • G הינו דקדוק LL(k) עבור k>1. • G מינימלי עבור 1-3
שאלה ממבחן (מועד א', אביב, תשס"ז) נתון הדקדוק הבא: S AAB A a B b עבור כל אחת מהאפשרויות הבאות, קבעו האם תוכן המחסנית הנתון בה, יכול להתקבל בריצה של המנתח LL(1) עבור הדקדוק הנ"ל על מילת קלט כלשהי (שאינה בהכרח בשפה). הסימן הימני ביותר הוא בראש המחסנית: א. BA ב. Ba ג. bA ד. Aa
שאלה ממבחן - המשך א. BA ב. Ba ג. bA ד. Aa שלב 1: נבנה את הטבלה: S AAB A a B b
א. BA ב. Ba ג. bA ד. Aa שלב 2: נבנה לפי הטבלה את המצבים האפשריים במחסנית: S, BAA, BAa, BA, Ba, B, b --- ----- ----- ---- ---- --- --- --- BA and Ba are ok …
שאלה ממבחן נתונים שני דקדוקים: כך ש: (שימו לב, קבוצת הטרמינלים משותפת) נגדיר: הוכח/הפרך: קיים k טבעי כך ש
שאלה ממבחן • לדקדוק G יש מנתח LL(k)אם ורק אם לא קיים קונפליקט בדקדוק עבור lookahead של k טרמינלים. • או במילים אחרות, אין שני כללי גזירה המתאימים לאותו התא בטבלה M:
שאלה ממבחן • למשל עבור k=2 ( ): M:
שאלה ממבחן • לדקדוק G יש מנתח LL(k)אם ורק אם לא קיים קונפליקט בדקדוק עבור lookahead של k טרמינלים. • במקרה זה הטענה אינה נכונה. נייצר דוגמא נגדית: למילה יהיו שתי גזירות שונות בG ולכן לכל k גדול/שווה ל-1 יהיה קונפליקט בתא M(S,)