1 / 21

מנתח LL(1)

מנתח LL(1). נכתב ע"י אלכס קוגן ( (sakogan@cs סמסטר חורף, תשס"ח. S. A. תזכורת מהתרגול הקודם. ניתוח Top-Down : מתחילים מ- S , מפעילים כללי גזירה עד שמגיעים למילת הקלט. A  α A  β ?. שיטת Recursive Descent שיפור מנגנון ההחלטה

altessa
Download Presentation

מנתח LL(1)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. מנתח LL(1) נכתב ע"י אלכס קוגן ((sakogan@cs סמסטר חורף, תשס"ח

  2. S A תזכורת מהתרגול הקודם • ניתוח Top-Down: מתחילים מ-S, מפעילים כללי גזירה עד שמגיעים למילת הקלט. A α A  β ? • שיטת Recursive Descent • שיפור מנגנון ההחלטה • כדי להחליט איזה כלל להפעיל על סמך הטרמינל הבא הנצפה בקלט, הגדרנו את פונקצית select

  3. תזכורת (המשך) • select(Aα): קבוצת כל הטרמינלים אשר יגרמו לבחור בכלל הזה עבור המשתנה A. • לצורך חישוב select, הגדרנו את פונקציות העזר first ו-follow • first(A): כל הטרמינלים שיכולים להופיע בתחילת מילה שנגזרת מ-A. • first(α): ההרחבה של first לתבניות פסוקיות. • follow(A): כל הטרמינלים שיכולים להופיע אחרי המשתנה A בגזירה כלשהי.

  4. מנתח LL(1) • קורא קלט משמאל לימין, מייצר ניתוח שמאלי ביותר ונעזר ב-lookahead של טרמינל אחד. • מסתמך על פונקציתselect בעת הניתוח. • לדקדוק G קיים מנתח LL(1) אם ורק אם לא קיים קונפליקט בדקדוק, כלומר לכל שני כללים בדקדוק עבור אותו המשתנה- Aα , Aβ: select(Aα) ∩ select(Aβ) = Ø • הרעיון: לחקות בעזרת מחסנית את תכנית ה - Recursive Descent • שקול בכוח הניתוח ל-RD

  5. X  α t  select(X  α) M (X,t) = error otherwise X  V t  T מבני נתונים של המנתח • Q: מחסנית הניתוח שמחזיקה את מה שרוצים עדיין לראות • בראש המחסנית - מה שרוצים לראות מיד • אתחול: בראש המחסנית יהיה S • תומכת בפעולות pop, push, top • M: טבלה שאומרת איזה כלל גזירה יש להפעיל בהינתן המשתנה הבא לגזירה והטרמינל הבא בקלט כאשר אין קונפליקטים, כל תא של M מכיל איבר אחד בלבד

  6. דוגמה • נתון דקדוק הבא: • S  Ab | bC • A  a • C  cA • נבנה טבלת M של מנתח LL(1). • לצורך כך, נחשב תחילה את פונקציית select עבור כל כלל גזירה.

  7. דוגמה (המשך) select(SAb) = {a} select(SbC) = {b} select(Aa) = {a} select(CcA) = {c} בניית הטבלה M: המקומות הריקים מכילים error

  8. פעולות המנתח • SHIFT: הוצאת טרמינל מהקלט • REPLACE X,t: החלפת משתנה X בצד ימין של כלל גזירה מתאים • חפש ב-M(X,t) איזה כלל גזירה להפעיל • אם מצאת error, עצור עם הודעת שגיאה • אחרת, נניח שזהו כלל X  Y1Y2…Yn. הוצא את X מהמחסנית ודחוף Y1Y2…Ynלמחסנית בסדר הפוךכאשר Y1בראש המחסנית ראש ראש REPLACE A,e כאשר M(A,e) = A  BCd

  9. אלגוריתם הניתוח 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

  10. 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:

  11. 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: ראש המחסנית

  12. 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:

  13. שאלה לדוגמה תנו דוגמה לדקדוק ח"הG אשר מקיים: • L(G) מכילה לפחות שתי מילים. • G אינו דקדוק LL(1). • G הינו דקדוק LL(k) עבור k>1. • מספר המשתנים, הטרמינלים וכללי הגזירה ב-G הוא המינימלי שניתן לבחור כך שהדרישות 1-3 יתקיימו.

  14. פתרון השאלה • הדקדוק חייב להכיל לפחות שני כללי גזירה מאותו משתנה • מדוע? • חייב להיות לפחות משתנה אחד • מדוע? • חייב להיות לפחות טרמינל אחד • מדוע? • לפיכך, נציע: S  aa | a • L(G) מכילה לפחות שתי מילים. • G אינו דקדוק LL(1). • G הינו דקדוק LL(k) עבור k>1. • G מינימלי עבור 1-3

  15. שאלה ממבחן (מועד א', אביב, תשס"ז) נתון הדקדוק הבא: S  AAB A  a B  b עבור כל אחת מהאפשרויות הבאות, קבעו האם תוכן המחסנית הנתון בה, יכול להתקבל בריצה של המנתח LL(1) עבור הדקדוק הנ"ל על מילת קלט כלשהי (שאינה בהכרח בשפה). הסימן הימני ביותר הוא בראש המחסנית: א. BA ב. Ba ג. bA ד. Aa

  16. שאלה ממבחן - המשך א. BA ב. Ba ג. bA ד. Aa שלב 1: נבנה את הטבלה: S  AAB A  a B  b

  17. א. BA ב. Ba ג. bA ד. Aa שלב 2: נבנה לפי הטבלה את המצבים האפשריים במחסנית: S, BAA, BAa, BA, Ba, B, b --- ----- ----- ---- ---- --- --- ---  BA and Ba are ok …

  18. שאלה ממבחן נתונים שני דקדוקים: כך ש: (שימו לב, קבוצת הטרמינלים משותפת) נגדיר: הוכח/הפרך: קיים k טבעי כך ש

  19. שאלה ממבחן • לדקדוק G יש מנתח LL(k)אם ורק אם לא קיים קונפליקט בדקדוק עבור lookahead של k טרמינלים. • או במילים אחרות, אין שני כללי גזירה המתאימים לאותו התא בטבלה M:

  20. שאלה ממבחן • למשל עבור k=2 ( ): M:

  21. שאלה ממבחן • לדקדוק G יש מנתח LL(k)אם ורק אם לא קיים קונפליקט בדקדוק עבור lookahead של k טרמינלים. • במקרה זה הטענה אינה נכונה. נייצר דוגמא נגדית: למילה יהיו שתי גזירות שונות בG ולכן לכל k גדול/שווה ל-1 יהיה קונפליקט בתא M(S,)

More Related