1 / 17

Winter 2012-2013 Compiler Principles Example Questions for Parsing

Winter 2012-2013 Compiler Principles Example Questions for Parsing. Mayer Goldberg and Roman Manevich Ben-Gurion University. ניתוח תחבירי – שאלה 1. נתון הדקדוק הבא להשוואת מסלולי זיכרון בתכנית ע"י פקודת assert : S  assert C S  assert lp C rp C  P eq P P  id | id dot P

lizina
Download Presentation

Winter 2012-2013 Compiler Principles Example Questions for Parsing

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. Winter 2012-2013Compiler PrinciplesExample Questions for Parsing Mayer Goldberg and Roman Manevich Ben-Gurion University

  2. ניתוח תחבירי – שאלה 1 • נתון הדקדוק הבא להשוואת מסלולי זיכרון בתכנית ע"י פקודת assert: • S  assert C • S  assert lp C rp • C  P eq PP  id | id dot P • ה-tokens המופיעים בדקדוק מייצגים את המחרוזות המתאימות: lp:'(' rp:')' eq:'==' dot='.' . • דוגמאות לקלטים חוקיים הם הקלט "assert(x.a==y.b.c)" והקלט "assert x.n.n==y".תזכורת: בשיטת LL(k) אלגוריתם הניתוח משתמש בטבלה הממפה כל k סימנים מהקלט (סדרה של טרמינלים ומשתני דקדוק) לכלל הגזירה שבו יש להשתמש כדי להחליף את משתנה הגזירה השמאלי ביותר. • (3 נק') מהו ערך של k הדרוש על-מנת לבצע ניתוח תחבירי לדקדוק הנתון בשיטת LL(k)? (כמה tokens קדימה צריך להסתכל כדי להחליט באיזה כלל גזירה לבחור?) הסבירי. • (3 נק') האם ניתן להפחית את ערך k ע"י שינוי הדקדוק? אם כן, הראי כיצד. אם לא, הסבירי למה לא ניתן לעשות זאת. • (4 נק') הראי שתת הדקדוק הניתן על-ידי כללי הגזירה של P (שני הכללים האחרונים) אינו שייך ל-LR(0). • (10 נק') הראי כיצד ניתן לשכתב אותו כך שישתייך ל-LR(0). רמז: השתמשי בכלל החדש P'id.בני את דיאגרמת המצבים (האוטומט) של הדקדוק המשוכתב ואת טבלת הניתוח, והראי כיצד מתקבל הביטוי x.n.n"".

  3. תשובה לשאלה 1 • הדקדוק נמצא ב-LL(2), זאת מכיוון שכדי להבדיל בין הכלל S  assert C לכלל S  assert lp C rp דרוש להסתכל על ה-token השני, כלומר זה שבא לאחר assert ולבדוק האם הוא lp או token אחר. כמו-כן, כדי להבדיל בין הכלל P  id לכלל P  id dot P דרוש לבדוק האם ה-token שלאחר id הוא dot או token אחר. בכל מקרה יש לבדוק את שני ה-tokens הבאים בקלט. • כן, ניתן לבצע left-factoring ע"י הוצאת רישות משותפות של הכללים לכללים אחרים: S  assert C' C'  C | lp C rp C  P eq P P  id P’ P'  ε | dot P כעת ניתן להבדיל בין הכללים הנגזרים מ-C'ומ-P' ע"י בדיקת ה-token הראשון בלבד. לכן הדקדוק המשוכתב שייך ל-LL(1). • אוטומט המצבים יכלול מצב שבו קיימים שני ה-LR(0) items הבאים: P  id  ו-P  id  dot P, ולכן ישנו shift/reduce conflict, ולכן הדקדוק אינו שייך ל-LR(0). • ניתן לשכתב אותו כך: P  P' P  P dot P' P'  id (ניתן גם להוסיף לדקדוק סימן סוף קלט וכלל מתאים, אך התשובה הניתנת כאן היא ללא הכלל והסימן.)

  4. 1 2 4 P  P’P  P dot P’P’  id P’ P P  P’  P  P  dot P’ dot 5 id 3 P  P dot  P’P’  id id P’  id  P’ 6 P  P dot P’  המשך תשובה לשאלה 1 כפי שניתן לראות לא קיימים מצבים בעלי קונפליקטים ולכן הדקדוק שייך ל-LR(0). טבלת הניתוח המתאימה היא:

  5. המשך תשובה לשאלה 1 Stack Input Action S1 id dot id dot id shiftS1 id S3 dot id dot id reduce P'idS1 P' S2 dot id dot id reduce PP'S1 P S4 dot id dot id shiftS1 P S4 dot S5 id dot id shiftS1 P S4 dot S5 id S3 dot id reduce P'idS1 P S4 dot S5 P' S6 dot id reduce PP dot P'S1 P S4 dot id shiftS1 P S4 dot S5 id shiftS1 P S4 dot S5 id S3 reduce P'idS1 P S4 dot S5 P' S6 reduce PP dot P'S1 stop הפעלת הניתוח על הקלט "x.n.n" נראית כך:

  6. ניתוח תחבירי – שאלה 2 נתונות השפות הבאות מעל התווים a ו-b :{an b | n = 1,2,…} L1 = ו-{an c | n = 1,2,…}  {an b | n = 1,2,…} L2 =. • (6 נק') נסחי דקדוק חסר-הקשר לשפה L1 ששייך ל-LL(k) והראי את הגזירה של המחרוזת aab.תזכורת: דקדוק LL(k) גוזר מחרוזת בצורה הבאה: רושמים את סימן הדקדוק הראשי ובאיטרציה מחליפים את סימן הדקדוק השמאלי ביותר בכלל דקדוק הנקבע ע"י k התווים הבאים בקלט (ע"י טבלא מתאימה), עד אשר מתקבל מחרוזת ללא סימני דקדוק (רק תווים). • (7 נק') נסחי דקדוק לשפה L2 והראי שהוא ב-LR(0) ע"י בניית דיאגרמת מצבים וטבלת ניתוח. • (7 נק') הפעילי את הנתח שבנית בסעיף הקודם על הקלט aac.

  7. תשובה לשאלה 2 אין בינתיים

  8. ניתוח תחבירי – שאלה 3 (8 נק') אילו מהמשפטים הבאים נכון? הסבירי בקצרה (שורת הסבר יחידה מספיקה): • (2 נק') דקדוק רב-משמעי הוא בהכרח אינו LR(1), • (2 נק') דקדוק שהוא LR(1) הוא בהכרח חד-משמעי, • (2 נק') דקדוק שהוא חד-משמעי הוא בהכרח LR(1), • (2 נק') דקדוק בעל מעברי אפסילון אינו LR(0)

  9. תשובה לשאלה 3 • נכון, דקדוק LR(1) הוא חד-משמעי בהכרח. • נכון (היפוך לוגי של הסעיף הקודם). • לא נכון, קיימים דקדוקים חד-משמעיים שאינם ב-LR(1), לדוגמא חלק מהדקדוקים ב-LR(2). • נכון. לדוגמא אם קיים כלל גזירה X הדקדוק הוא רב-משמעי. זאת מכיוון שלכל מילה בשפה ניתן להפעיל את הכלל מספר כלשהו של פעמים וכך לייצר גזירות שונות.הערה: אנו מניחים שקיימת גזירה שבה X מופיע (כלומר שהמשתנה לא מיותר)

  10. ניתוח תחבירי שאלה 4 נתון הדקדוק הבא להגדרת רשימת משתנים: Dcl IdList ':' Type IdList  IdList ',' id IdList id Type int Type float בדקדוק זה יש קושי למלא את טבלת הסמלים תוך כדי ניתוח תחבירי, מכיוון שלא ניתן לדעת מה הטיפוס של סימן בזמן שה-parser מבצע reduce. (יודעים את הטיפוס של סימן רק כאשר מגיעים לסוף הרשימה). לכן, מציעים שני דקדוקים שקולים אלטרנטיביים. לכל אחד מהדקדוקים הבאים – G1 ו-G2– ענה על השאלות הבאות: בדוק האם הדקדוק הוא LR(0) או לא. הערה 1: אין צורך לבנות את כל האוטומט. מספיק להראות שני items המייצרים קונפליקט. הערה 2: ניתן לקצר את הסימנים בדקדוק לשם הפשטות (לדוגמא, במקום IntVars אפשר לקצר ל-I). במידה והדקדוק ב-LR(0), הפעילי את הנתח על הקלט a,b,c:int ואפייני את צריכת הזיכרון כפונקציה של מספר המשתנים.

  11. תשובה לשאלה 4 לכן, הדקדוק ב-LR(0). כעת נבנה את טבלת המעברים: • הדקדוק הינו LR(0), כפי שנראה ע"י בניית האוטומט חסר הקונפליקטים הבא:

  12. המשך תשובה בעזרת הטבלה, נפעיל את הנתח על הקלט a,b,c:int

  13. המשך תשובה • ניתן לראות שצריכת הזיכרון, כלומר עומק המחסנית, ליניארי במספר המשתנים. למעשה, מצב זה אופייני לדקדוקים בעלי רקורסיה ימנית. • הדקדוק בעל reduce/reduce conflict, לדוגמא קיים מצב המכיל את שני ה-items הבאים:IntVarsidFloatVarsid.

  14. ניתוח תחבירי – שאלה 5 נתונות השפותL1 = {an+1bn | n  0} ו-L2 = {an bn+1 | n  0}. • (5 נק') לכל אחת מהשפות, רשמי דקדוק מתאים בעל שני כללים. • (10 נק') אילו מהדקדוקים נמצאים ב-LR(0)? הוכיחי את תשובתך. אם אחד מדקדוקים ב-LR(0), הראי את אוטומט המצבים, טבלת הניתוח וריצה של אלגוריתם הניתוח על קלט באורך 3 תווים. • (5 נק') במידה ואחד מהדקדוקים אינו ב-LR(0), האם קיימת טרנספורמציה על השפה המאפשרת לבדוק ע"י (הפעלה יחידה של) נתח LR(0) האם מילת קלט בשפה? אם כן, הדגימי את תשובתך על קלט באורך 3 תווים.

  15. תשובה • להלן הדקדוקים – הדקדוק G1 מתאים לשפה L1 והדקדוק G2 מתאים לשפה L2. G1 : S  a | a S b G2 : S  b | a S b • הדקדוק G1 אינו ב-LR(0). ניתן לראות זאת ע"י מצב מספר 2 שנוצר בבניית אוטומט המצבים – מצב המכיל shift-reduce conflict.

  16. המשך תשובה הדקדוק G2 שייך ל-LR(0), כפי שניתן לראות ע" אוטומט המצבים הבא שאינו מכיל קונפליקטים וטבלת הניתוח המתאימה.

  17. המשך תשובה • נגדיר את הפונקציה הבאה על מחרוזות. הפונקציה f מקבלת מחרוזת, הופכת את סדר התווים ואז מחליפה בין תווי a לתווי b ולהיפך. כעת, נשים לב שמחרוזת  ב-L1 אם ורק אם f() ב-L2. לכן, בהינתן קלט, נפעיל עליו את f ונעביר אותו לנתח של G2 ואז נחזיר את התשובה שהוא מחזיר. לדוגמא, בהינתן הקלט aab, נפעיל את f ונקבל את abb שאת ניתוחו כבר הראינו בסעיף הקודם. כעת, נריץ את הנתח על הקלט abb.

More Related