160 likes | 306 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 holds 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, REPLACE X,t • goto 1
דוגמה (המשך) • ריצת המנתח על המילה bca:
דוגמה (המשך) • ריצת המנתח על המילה bca: ראש המחסנית
דוגמה (המשך) • ריצת המנתח על המילה 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) עבור הדקדוק על מילת קלט כלשהי (שאינה בהכרח בשפה). הסבירו
שאלה ממבחן - המשך S AAB A a B b • הסימן הימני ביותר הוא בראש המחסנית א. BA ב. Ba ג. bA ד. Aa