1 / 120

פרק 4 ניתוח התחביר

פרק 4 ניתוח התחביר. ניתוח ( analysis ). מנתח לקסיקאלי lexical analyser. מנתח תחביר syntax analyser. מנתח משמעות semantic analyser. מייצר קוד ביניים intermediate code generator. מייעל קוד code optimizer. חיבור ( synthesis ). מייצר קוד code generator.

keola
Download Presentation

פרק 4 ניתוח התחביר

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. פרק 4 ניתוח התחביר תורת הקומפילציה

  2. ניתוח (analysis) מנתח לקסיקאלי lexical analyser מנתח תחבירsyntax analyser מנתח משמעות semantic analyser מייצר קוד בינייםintermediate code generator מייעל קוד code optimizer חיבור (synthesis) מייצר קוד code generator ניתוח התחביר מנתח תחבירsyntax analyser תורת הקומפילציה

  3. תחביר (Syntax) של שפות מחשב נוח לתאר את התחביר של שפת מחשב בעזרת דקדוק חסר הקשר • דקדוק נותן מפרט תחבירי מדויק וקל להבנה של השפה • מתוך דקדוקים בעלי תכונות מסוימות ניתן לבנות באופן אוטומטי פורסים יעילים • בתהליך הבניה ניתן לגלות מצבים של רב-משמעות תחבירית • דקדוק מתוכנן היטב מאפשר כתיבת תוכניות בעלות מבנה טוב המאפשר תרגומן לקוד מכונה נכון ויעיל • דקדוק מסודר מאפשר לעדכן את הגדרת השפה עם הזמן באופן נוח תורת הקומפילציה

  4. היררכיה בהגדרת התחביר של שפה • הגדרת תמניות באמצעות ביטויים רגולרים ע"מ לפשט את הגדרת השפה ובנית המהדר • הגדרת התחביר באמצעות דקדוק חסר הקשר • הוספת כללים שאינם ניתנים להבעה ע"י דקדוק חסר הקשר כגון: "אין להשתמש במזהה לפני שהוצהר עליו"או הצורך בהתאמה בין הארגומנטים והפרמטרים של פונקציה(ראה דיון ב-ASU עמ' 179−181) תורת הקומפילציה

  5. ניתוח התחביר ─ מטרה • קבלת זרם התמניות מהמנתח הלקסיקאלי • ניתוח זרם התמניות ע"פ כללי הגזירה ויצירת עץ הפריסה • מציאת שגיאות תחביר והיחלצות מהן • עדכון טבלת הסמלים תורת הקומפילציה

  6. stmt stmt if( expr )stmt | if( expr )stmtelsestmt | while( expr )stmt stmt expr expr args מנתח התחביר if ( id relop num ) id ( ) ; ניתוח החיבור ─ השיטה • תיאור הפסוקים בשפה באמצעות דקדוק חסר הקשר • ניתוח זרם התמניות ע"י הפעלת אלגוריתמים לפריסה if (id relop num) id(); תורת הקומפילציה

  7. תמנית מנתח לקסיקאלי מנתח תחביר שאר חלקי הצד הקדמי עץ הפריסה קוד ביניים דרישה לתמנית הבאה טבלת סמלים יחס גומלין של מנתח התחביר תוכנית המקור תורת הקומפילציה

  8. שיטות לביצוע פריסה • קיימות שיטות לפריסה אוניברסלית של כל דקדוק נתון • אינן יעילות לבנית מהדרים בפועל • קיימות שיטות לפריסה של דקדוקים בעלי תכונות מיוחדות • פריסה מלמעלה למטה (top-down) • למשל עבור דקדוקי LL • שימושית לבניה ידנית של פורס • פריסה מלמטה למעלה (bottom-up) • למשל עבור דקדוקי LR • שימושית לבניה אוטומטית של פורס תורת הקומפילציה

  9. משימות נוספות המתבצעותתוך כדי הפריסה הפורס • מפעיל את הסורק ע"מ לייצר עבורו את זרם התמניות • מפעיל את "שאר חלקי הצד הקדמי" • ניתוח המשמעות • עדכון טבלת הסמלים • יצירת קוד ביניים תורת הקומפילציה

  10. טיפול בשגיאות • סוגי השגיאות • יעדי מטפל השגיאות • שיטות לטיפול בשגיאות תורת הקומפילציה

  11. סוגי שגיאות • לקסיקאליות ─ למשל: איות לא נכון של מזהה, מלת מפתח או אופרטור • תחביריות ─ למשל: חוסר איזון של סוגריים בביטוי אריתמטי • משמעות ─ למשל: אופרטור המופעל על אופרנד בלתי-מתאים • לוגיות ─ למשל: רקורסיה אינסופית חלק ניכר מהשגיאות המתגלות הן שגיאות תחביר: • הרבה שגיאות הן אכן שגיאות תחביר • ניתן לגלות בקלות שגיאות תחביר ואף לתקן חלק מהן • קשה לגלות ולתקן שגיאות משמעות ושגיאות לוגיות תורת הקומפילציה

  12. יעדי מטפל השגיאות • דיווח על הימצאות שגיאה במקום מסוים בבירור ובדייקנות • התאוששות מהשגיאה מהר ככל הניתן ע"מ לגלות שגיאות נוספות • אסור שיאיט באופן משמעותי עיבוד של תוכניות נכונות תורת הקומפילציה

  13. שיטות לטיפול בשגיאות • מצב פניקה (panic mode) • רמת הביטוי (phrase level) • כללי גזירה לשגיאות (error productions) • תיקון גלובלי (global correction) תורת הקומפילציה

  14. התאוששות ממצב פניקה(Panic Mode Recovery) • בעת שהפורס מגלה שגיאת תחביר הוא נכנס ל"מצב פניקה",ומדלג על כל התמניות עד שהוא מגיע לתמנית סינכרון • תמנית סינכרון (synchronization token)─ תמנית הבאה בסוף מבנה (משפט, סדרת משפטים) והמציינת את סופודוגמאות:נקודה-פסיק ;סוגר מסולסל ימני { מלת מפתח end • שיטה טובה בהנחה שמשפט מכיל לרוב רק שגיאת תחביר אחת • מונעת כניסה ללולאה אינסופית של הפורס תורת הקומפילציה

  15. התאוששות ברמת הביטוי(Phrase Level Recovery) בעת שהפורס מגלה שגיאה הוא מנסה לתקן אותה ע"י החלפת הרישא של המשך הקלט במחרוזת אחרת דוגמאות:החלפת פסיק בנקודה-פסיק מחיקת תו מיותר הוספת סימן חסר יש להיזהר לא להגיע למצב של לולאה אינסופית (למשל אם הטיפול בשגיאה הוא תמיד הוספת תו לפני שאר הקלט) תורת הקומפילציה

  16. התאוששות ע"י כללי גזירה לשגיאות(Error Production Recovery) • הדקדוק יכיל מראש כללי גזירה לשגיאות נפוצות • בכללים האלה תשולבנה מראש הפעולות לביצועבעת גילוי שגיאות אלה דוגמה: stmt if (expr ) thenstmtelsestmt שימוש בכלל הגזירה הזה מעיד על הימצאות then מיותר תורת הקומפילציה

  17. תיקון גלובלי(Global Correction) מציאת התוכנית הנכונה הקרובה ביותר לתוכנית המקורית • יש להגדיר מטריקה בין תוכניות,למשל ע"י מספר השינויים הבסיסים שיש לבצע במעבר מתוכנית לתוכנית • שינוי בסיסי: החלפת תו, מחיקת תו, הוספת תו, היפוך תווים • טכניקה יקרה מאוד ליישום באופן גלובלי על כל התוכנית • עשויה להיות שימושית כטכניקה מקומית בשיטת ההתאוששות ברמת הביטוי תורת הקומפילציה

  18. דקדוק (Grammar) ושפה (Language) G─דקדוק (grammar)─G = T, N, P, S T─קבוצת טרמינלים (terminals)─ האלף-בית N─קבוצת נונטרמינלים (nonterminals)─T  N =  P─כללי גזירה (productions)─ מהצורה   כאשר  ו- הן מחרוזות של טרמינלים ו/או נונטרמינלים, או ש- הוא ε (המסמן את המחרוזת הריקה) S─סמל ההתחלה (start symbol)─S  N L(G)─שפה (language)─ אוסף כל המחרוזות מעל האלף-בית הניתנות ליצור ע"י הדקדוק (בהמשך הגדרה יותר מדוייקת) תורת הקומפילציה

  19. חוסר הקשר(Context Freedom) דקדוק חסר הקשר (context free grammar)― דקדוק בו כל כללי הגזירה הם מהצורה A  כאשר A הינו נונטרמינל יחיד ( כמו קודם) שפה חסרת הקשר (context free language)― שפה שעבורה קיים דקדוק חסר הקשר המייצר אותה דקדוק חסר הקשר ניתן להכרה ע"י אוטומט מחסנית רוב המבנים של שפות התכנות הקיימות ניתנים לתיאור באמצעות דקדוק חסר הקשר תורת הקומפילציה

  20. פורס (Parser) • כלי המנתח את תוכניות המקור ע"פ דקדוק השפה • הטרמינלים ─ התמניות הנוצרות ע"י הסורק (scanner) • הנונטרמינלים ─ משתנים המתארים צורות שונות של פסוקים ומבנים בשפה דוגמה: • expr exprop expr • expr (expr) • expr -expr • expr id • op + • op - • op  • op / • op  טרמינלים: id + -  /  ( ) נונטרמינלים: expr op תורת הקומפילציה

  21. קונבנציות סימון • טרמינלים א. אותיות קטנות מתחילת האלף-בית הלטיני a b c. . . ב. סמלי פעולה + -  /. . . ג. סמלי פיסוק ( ) , ;. . . ד. הספרות 0 1 . . . 9 ה. מחרוזות בגופן בולט id if. . . תורת הקומפילציה

  22. המשך סימון • נונטרמינלים א. אותיות גדולות מתחילת האלף-בית הלטיניA B C. . . ב. האות S המסמנת את סמל ההתחלהS ג. מחרוזות של אותיות קטנות נוטותstmt expr op . . . • מטה-משתנים א. אותיות גדולות מסוף האלף-בית הלטיניX Y Z . . .מסמנות סמלי דקדוק (כלומר טרמינלים או נונטרמינלים) ב. אותיות קטנות מסוף האלף-בית הלטיניu v . . . zמסמנות מחרוזות של טרמינלים ג. אותיות קטנות מתחילת האלף-בית היווני   . . .מסמנות מחרוזות של סמלי דקדוק תורת הקומפילציה

  23. המשך סימון • אלטרנטיבה הסימן | המשמש לקיצורA  1 A  1 | 2 | . . . | kA  2 . . . A  k • סמל ההתחלה סמל ההתחלה הינו הצד השמאלי של כלל הגזירה הראשון (אלא אם ציון אחרת) דוגמה E E A E | (E) | -E | id A  + | - |  | / |  תורת הקומפילציה

  24. גזירה (Derivation) סדרה של צעדים על מחרוזת המורכבת מטרמינלים ונונטרמינלים בה בכל צעד מוחלף סמל X המופיע במחרוזת בתת-מחרוזת , תוך שימוש בכלל גזירה X   נסמן:צעד גזירה סדרת צעדי גזירה סדרה לא ריקה של צעדי גזירה דוגמה: -(E)  -(E A E)  -(E+E)  -(E+ id)  -(id + id) -(E)-(id + id)    +    תורת הקומפילציה

  25. שפה (Language) • שפהL(G) הנוצרת ע"י דקדוק G היא אוסף כל המחרוזות של טרמינלים הנגזרות מסמל ההתחלה של דקדוק L(G)= { w | Sw } • המחרוזת w נקראת משפט (sentence) בשפה • דקדוקים שקולים (equivalent)─ שני דקדוקים המייצרים אותה שפה • sentential─ מחרוזת  של סמלי דקדוק הנגזרת מסמלההתחלה S  • משפט (sentence) הוא sententialהמורכב מטרמינלים בלבד +    תורת הקומפילציה

  26. גזירה משמאל (Leftmost)וגזירה מימין (Rightmost) • בכל צעד גזירה יש לקבל שתי החלטות: • איזה נונטרמינל לגזור • באיזה כלל גזירה (מבין כללי הגזירה של אותו נונטרמינל) נשתמש • כאשר בשלב 1 בוחרים את הנונטרמינל השמאלי ביותר במחרוזת הגזירה נקראת גזירה שמאלית (leftmost) ומסומנת ע"י A  : wA  w   ( w  T* ) • כאשר בשלב 1 בוחרים את הנונטרמינל הימני ביותר במחרוזת הגזירה נקראת גזירה ימנית (rightmost) ומסומנת ע"י A  :  Au   u ( u  T* )  lm  lm  rm  rm תורת הקומפילציה

  27. גזירה משמאל ומימין ─ המשך הסימון   מדגיש כי  נגזרת מ-  בסדרה של צעדי גזירה שמאליים הסימון   מדגיש כי  נגזרת מ-  בסדרה של צעדי גזירה ימניים דוגמאות: - (E+E)- ( id +E) - (E+E)- (E+ id )   lm   rm  lm  rm תורת הקומפילציה

  28. E עדכון עץ הפריסה: − E ( E ) E + E גזירה ועץ פריסה בנית עץ פריסה שקולה לגזירה כלל הגזירה:B   צעד הגזירה: B      מתבטא בעץ: ביצירת בנים לצומת המסומן ב-B אם   ε אזי מספר הבנים הוא באורך  והסדר שלהם הוא כסדרם ב-  אם  = ε נוצר בן יחיד המסומן ב-ε כלל הגזירה: E E+E צעד הגזירה:- (E) - (E+E) תורת הקומפילציה

  29. רב-משמעות (Ambiguity) דקדוק רב-משמעי (ambigous)─ דקדוק המייצר יותר מעץ פריסה יחיד למחרוזת כלשהי הרב-משמעות עשויה לנבוע מהבחירה של צעד 1 (איזה נונטרמינל לגזור) אבל גם אם מחליטים על גזירה שמאלית (או ימנית) היא עשויה לנבוע מצעד 2 (באיזה כלל גזירה להשתמש) דוגמה: E E+EE EE  id +E  E+EE  id +EE  id +EE  id + id E  id + id E  id + id  id  id + id  id תורת הקומפילציה

  30. E E E + E E  E id E  E E + E id id id id id רב-משמעות ─ המשך דקדוק רב-משמעי עשוי להטעות אותנו במציאת המשמעות שלהמשפט ולכן רצוי להימנע מדקדוק רב-משמעותלחילופין ניתן לנסח כללי חדות (disambiguating rules) הבוררים את עץ הפריסה הרצוי מתוך העצים הפורסים האפשריים תורת הקומפילציה

  31. stmt if expr then stmt else stmt E1 S1 if expr then stmt else stmt E2 S2 S3 רב משמעות ─ דוגמה בעית ה-else המתנדנד (dangling else): דקדוק stmt ifexprthenstmt | ifexprthenstmtelsestmt | other המשפט ifE1thenS1else ifE2thenS2elseS3 נפרס ע"י עץ פריסה תורת הקומפילציה

  32. stmt stmt if expr then stmt else stmt E1 S2 if expr then stmt E1 if expr then stmt E2 S1 if expr then stmt else stmt E2 S1 S2 רב משמעות ─ המשך דוגמה אולם המשפט ifE1thenifE2thenS1elseS2 נפרס ע"י שני עצים אפשריים: תורת הקומפילציה

  33. סילוק רב-משמעות • שפות התכנות שבהם משפטי תנאי כנ"ל מעדיפות את עץ הפריסה השמאלי • כלומר, ה-else צריך להיות משויך ל-then הקרוב אליו ביותר • כלומר, לא ייתכן שבין then ו-else המשויך לו יהיה then אשר אין לו else משויך הדקדוק הבא מאפשר היווצרות של העץ השמאלי בלבד stmtmatched_stmt | unmatched_stmt matched_stmtifexprthenmatched_stmtelsematched_stmt | other unmatched_stmtifexprthenstmt |ifexprthenmatched_stmtelseunmatched_stmt תורת הקומפילציה

  34. רקורסיה שמאלית(Left Recursion) • כאשר דקדוק מאפשרגזירה: AAנאמר כי קיימת בו רקורסיה שמאלית (left recursion) • פורסים העובדים מלמעלה למטה מתקשים להתמודד עם מצב כזה,ועלולים להיכנס לרקורסיה אינסופית • רקורסיה שמאלית פשוטהA  A :A  A | ניתנת לסילוק ע"י החלפת הכלל בצמד כללים: A  A’ A’  A’ | ε +  תורת הקומפילציה

  35. דוגמה לסילוק רקורסיה שמאלית פשוטה הדקדוק: E E+T |T T  TF|F F (E) | id ניתן לכתיבה מחדש כך: E TE’ E’ +T E’ |ε T F T’ T’ F T’ |ε F (E)|id תורת הקומפילציה

  36. רקורסיה שמאלית מיידית הכלל: A A1 | A2 | . . . | Am | 1 | 2 | . . . | n כאשר שום i לא מתחיל ב-A וכל i שונה מ-ε ניתן להחלפה ע"י הכללים: A 1A’ | 2 A’ | . . . | nA’ A’  1A’ | 2A’| . . . | mA’ | ε תורת הקומפילציה

  37. סילוק רקורסיה שמאלית כללית נניח כי G חסר מעגלים (לא מתקיים AA) וכי אין בו כללי ε (אין כללים מהצורה A ε ) (ניתן לסלק את אלה מראש, ראה ASU תרג' 4.20 ו-4.22)האלגוריתם הבא מסלק רקורסיה שמאלית כללית • סדר את הנונטרמינלים בסדר כלשהו A1, A2, . . . , An • עבור כל Aii  [1 .. n] ועבור כל Ajj  [1 .. i-1] אם קיים כלל P מהצורהAi Aj  וכן קיימים כלליםAj  1 | 2 | . . . | kהחלף את P בכללAi 1  | 2  | . . . | n  סלק רקורסיה שמאלית מכללי Ai +  תורת הקומפילציה

  38. פירוק שמאלי (Left Factoring) הדקדוק stmt ifexprthenstmtelsestmt | ifexprthenstmt מותיר במבוכה פורס מנבא מפני שכאשר הפורס רואה את התמניתif איננו יודע באיזה משני כללי הגזירה להשתמש באופן כללי אם קיים כלל:A  1 |  2 נחליף אותו בצמד הכללים:A  A’ A’  1 | 2 כלומר נדחה את ההכרעה בין 1 ו-2 לשלב מאוחר יותר בפריסה תורת הקומפילציה

  39. פירוק שמאלי ─ המשך ובאופן כללי: לכל נונטרמינל A: • מצא את הרישא  הארוכה ביותר המשותפת לשתים או יותר אלטרנטיבות של A • אם   ε אזי קיימת רישא משותפת אמיתית • כלל A נראה מהצורה A  1 |  2 | . . . |   n | 1 |  2 | . . . | m כאשר  איננה רישא של אף i • החלף את כלל הנ"ל בכללים הבאים: A  A’ | 1 |  2 | . . . | m A’  1 | 2 | . . . |  n • חזור על צעדים אלה עד שלא תהיה יותר רישא משותפת אמיתית לאלטרנטיבות של A תורת הקומפילציה

  40. פריסה מלמעלה למטהTop Down Parsing • שיטה לפריסה המתאימה לבניה ידנית של פורסים • תשתמש בגזירה שמאלית תורת הקומפילציה

  41. ירידה רקורסיבית(Recursive Descent) אתחול • המקום הנוכחי בקלט: בהתחלה • בנה עץ פריסה ריק • הכנס את S כשורש העץ • פרוס את S • ודא שהגעת לסוף הקלט תורת הקומפילציה

  42. ירידה רקורסיבית  המשך פריסה רקורסיבית • הצומת לפריסה הוא V • סמן את המקום הנוכחי בקלט:P • עבור כל הכללים V בצע: • חזור בקלט למקום P • בטל כל הבנים של V (אם יש) • הוסף ל-V בנים לפי  • לכל בן של V (משמאל לימין): • אם הבן הוא נונטרמינל  פרוס אותו • אחרת (טרמינל) אם הוא זהה לקלט הבא  התקדם בקלט • אחרת (נסיגה)  חזור לצעד 3 • V נפרס היטב  חזור מהרקורסיה תורת הקומפילציה

  43. cad S cad S cad S c A d c A d cad S S cad cad S c A d c A d c A d a b a cad S S cad cad S c A d c A d c A d a b a a ירידה רקורסיבית  דוגמה הדקדוק: S cAd A  ab  a הקלט: cad תורת הקומפילציה

  44. נסיגה (Backtracking) • הפורס בחר כלל גזירה שגוי, ונאלץ לחזור אחורה: • לבטל צמתים בעץ • לחזור אחורה בקלט • ישנם דקדוקים חסרי הקשר שלא ניתן לפרוס אותם מלמעלה למטה ללא נסיגות • ישנן שפות חסרות הקשר שעבורן אין דקדוק שניתן לפריסה מלמעלה למטה ללא נסיגות • ישנן שפות שעבורן ניתן לכתוב דקדוק הניתן לפריסה מלמעלה למטה ללא נסיגות תורת הקומפילציה

  45. פורס מנבא(Predictive Parser) פורס מנבא (Predictive Parser)―פורס יורד רקורסיבית ללא נסיגות • מתאים בד"כ להוראות הבקרה של רוב שפות התכנות stmt if exprthenstmtelsestmt while exprdostmt begin stmt_listend stmt_list stmt stmt_list   • ע"פ הקלט הבא ניתן תמיד לבחור באופן חד-משמעי את כלל הגזירה המתאים, ועל כן אין צורך בנסיגות תורת הקומפילציה

  46. דיאגרמת מעבר(Transition Diagrams)לפורסים מנבאים • דיאגרמה אחת לכל נונטרמינל • תוויות הקשתות הן טרמינלים ונונטרמינלים • הפריסה • מתחילים בדיאגרמה של סמל ההתחלה • מעבר ע"פ קשת טרמינל  ניתן לעבור בקשת זו אם הקלט הבא הוא התמנית המתאימה • מעבר ע"פ קשת נונטרמינל  קריאה לנוהל שיפרוס את הנונטרמינל ע"פ הדיאגרמה שלו תורת הקומפילציה

  47. בנית דיאגרמת מעבר • סלק רקורסיה שמאלית מהדקדוק • בצע פירוק שמאלי של הדקדוק • לכל נונטרמינל A: • ייצר מצב התחלה ומצב סיום (חזרה) • לכל כלל A x1x2…xn ייצר מסלול ממצב ההתחלה למצב הסיום כך שהקשתות על המסלול מסומנות: x1, x2, … xn תורת הקומפילציה

  48. T E’ 0 1 E : + T E’ 3 4 5 E’ :  F T’ 7 8 T :  F T’ 10 11 12 T’ :  13 9 6 2 17 ( E ) 14 15 16 F : id דיאגרמת מעבר לפריסה  דוגמה הדקדוק:הדיאגרמות: E TE’ E’ +T E’|ε T F T’ T’ F T’| ε F’ (E)|id תורת הקומפילציה

  49. T  + + T 3 4 5 3 4 E’: E’: + T E’   3 4 5 E’ :  + T + T T 0 3 5 0 3 E : E : T 6 6 6 2 6 6 E’ 0 1   E : פישוט דיאגרמות מעבר לפריסה תורת הקומפילציה

  50. פריסה מנבאת לא-רקורסיבית קלט a + b $ מחסנית X תוכנית פריסה מנבאת פלט Y Z טבלת פריסה M $ • טבלת הפריסה • שורה לכל נונטרמינל • עמודה לכל טרמינל ועמודה ל-$ • הכניסה M[X,a] מכילה את כלל(י) הגזירה שניתן • ליישם כאשר יש לגזור את Xוהקלט הבא הוא a כיצד בונים ? בינתיים  תעלומה תורת הקומפילציה

More Related