Presentation is loading. Please wait.

Presentation is loading. Please wait.

פרק 5 תרגום מונחה תחביר תורת הקומפילציה איתן אביאור.

Similar presentations


Presentation on theme: "פרק 5 תרגום מונחה תחביר תורת הקומפילציה איתן אביאור."— Presentation transcript:

1 פרק 5 תרגום מונחה תחביר תורת הקומפילציה איתן אביאור

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

3 חוקי משמעות (Semantic Rules)
תכונות (attributes)  ערכים המוצמדים לסמלי הדקדוק חוקי משמעות (semantic rules)  הכללים הקובעים איך מחשבים ערכי תכונות מתוך ערכים של תכונות אחרות שיטות לרישום כללי משמעות וקשירתם לכללי הגזירה הגדרות מונחות תחביר (syntax directed definitions) סכימות תרגום (translation schemes) תורת הקומפילציה איתן אביאור

4 המהלך הכללי פריסת זרם התמניות בנית עץ הפריסה
מעבר על העץ לחישוב חוקי המשמעות לא תמיד יש לבצע בפועל את כל השלבים האלו, וישנם קיצורי דרך. סדר חישוב כללי המשמעות גרף תלויות עץ הפריסה זרם התמניות תורת הקומפילציה איתן אביאור

5 הגדרות מונחות תחביר (Syntax Directed Definitions)
לכלל גזירה מוצמדים מספר חוקי משמעות מהצורה b = f (c1, c2, ck) כאשר b ו-ci הם תכונות של סמלי הדקדוק המשתתפים בכלל הגזירה תכונה מורכבת (synthesized attribute)  b היא תכונה של הסמל בצד שמאל של כלל הגזירה ו-ci תכונות של הסמלים בצד הימני התכונה של צומת בעץ פריסה תלויה בתכונות הבנים שלו תכונה נורשת (inherited attribute)  b היא תכונה של אחד הסמלים בצד ימין של כלל הגזירה ו-ci תכונות של הסמל בצד שמאל ו/או סמלים בצד הימני התכונה של צומת בעץ הפריסה תלויה בתכונות ההורה ו/או האחים שלו תורת הקומפילציה איתן אביאור

6 המשך פונקציה של חוק משמעות נרשמת בד"כ כביטוי
לעיתים יש צורך בתוצאות נלוות (side effects) כגון: שינוי ערכי משתנים גלובלים יצירת פלט במקרים כאלה ניתן לדמות כאילו הפעולה הינה חוק המגדיר את ערכיה של תכונה סתמית (dummy) של הסמל בצד שמאל של כלל הגזירה לטרמינלים יש רק תכונות מורכבות שאת הערכים שלהם קובע המנתח הלקסיקאלי לסמל ההתחלה יש בד"כ רק תכונות מורכבות (אלא אם נאמר במפורש אחרת) הגדרה של תכונות-S (S-attributed definition)  הגדרת משמעות באמצעות חוקים שבהם כל התכונות הינן מורכבות (ולא נורשות) תורת הקומפילציה איתן אביאור

7 עץ פריסה מעוטר/מקושט (Annotated/Decorated Parse Tree)
עץ פריסה בו רושמים לצד כל צומת בעץ את ערכי התכונות של אותו צומת כלל גזירה כלל משמעות קלט עץ מעוטר E  d1 + d2 E.val := d1.val + d2.val 7 + 5 E.val = 12 d1.val = 7 + d2.val = 5 תורת הקומפילציה איתן אביאור

8 דוגמה להגדרות מונחות תחביר עם תכונות מורכבות
כלל גזירה חוקי משמעות L  E n print ( E.val ) E  E1 + T E.val := E1.val + T.val E  T E.val := T.val T  T1  F T.val := T1.val  F.val T  F T.val := F.val F  ( E ) F.val := E.val F  digit F.val := digit.lexval תורת הקומפילציה איתן אביאור

9 דוגמה לעץ מעוטר של תכונות מורכבות
דוגמה לעץ מעוטר של תכונות מורכבות הקלט 3  n עץ הפריסה המעוטר L n E.val = 19 + E.val = 15 T.val = 4 T.val = 15 digit.lexval = 4 T.val = 3 F.val = 5 F.val = 3 digit.lexval = 3 digit.lexval = 5 F.val = 4 תורת הקומפילציה איתן אביאור

10 דוגמה להגדרות מונחות תחביר עם הגדרות נורשות
כלל גזירה חוקי משמעות D  T L L.in := T.type T  int T.type := integer T  real T.type := real L  L1, id L1.in := L.in addtype ( id.entry, L.in ) L  id addtype ( id.entry, L.in ) תורת הקומפילציה איתן אביאור

11 דוגמה לעץ מעוטר של תכונות נורשות
דוגמה לעץ מעוטר של תכונות נורשות הקלט real id1 , id2 , id3  D T.type = real L.in = real real L.in = real , id3 L.in = real , id2 id1 תורת הקומפילציה איתן אביאור

12 גרף תלויות (Dependency Graph)
גרף שבו: הצמתים: תכונות של הצמתים בעץ הפריסה קשתות: התלות של תכונה א' בתכונה ב' אופן הבניה צמתים לכל צומת n בעץ הפריסה לכל תכונה a של סמל הדקדוק בצומת n בנה בגרף התלויות צומת עבור n.a קשתות  לכל צומת n בעץ הפריסה לכל כלל משמעות מהצורה b = f(c1,c2, … ck) שקשור לכלל הגזירה שיצר את הצומת n לכל i בתחום [1..k] בנה בגרף התלויות קשת מהצומת ci לצומת b תורת הקומפילציה איתן אביאור

13 דוגמאות לגרף תלויות דוגמה ב' גרף התלויות של העץ המעוטר
עם תכונות נורשות דוגמה א' כלל גזירה E  E1 + E2 כלל משמעות E.Val := E1.val + E2.val גרף תלויות D T 4 6 in 5 L type 3 real , entry E E1 E2 + val in id3 7 L 8 2 id2 , entry in 9 L 10 1 entry id1 תורת הקומפילציה איתן אביאור

14 סדר חישוב המשמעות בניית עץ הפריסה המעוטר ע"פ הדקדוק בניית גרף התלויות
מציאת מיון טופולוגי של גרף התלויות חישוב התכונות לפי סדר המיון הטופולוגי תורת הקומפילציה איתן אביאור

15 שיטות לחישוב המשמעות שיטות עץ פריסה (parse-tree methods) בזמן ההידור נבנה עץ הפריסה מעוטר וממנו גרף תלויות, ואז מחושב המיון הטופולוגי שיטות המבוססות על חוקים (rule-based methods) בזמן בנית המהדר מנותחים (ידנית או אוטומטית) חוקי המשמעות המקושרים עם כללי הגזירה ולכל כלל גזירה נקבע מראש סדר חישוב חוקי המשמעות הקשורים אליו שיטות מתעלמות (oblivious methods) סדר חישוב המתעלם מחוקי המשמעות עצמם (למשל  לפי סדר השימוש בכללי הגזירה) מגביל את אוסף ההגדרות מונחות הדקדוק שניתן ליישם בשיטה זו תורת הקומפילציה איתן אביאור

16 עץ תחביר (Syntax Tree) עץ תחביר (syntax tree)  עץ המשקף את המבנה ההיררכי של השפה דחוס יותר מעץ פריסה בעלים אין מופיעים אופרטורים או מילות מפתח והם מוכלים בצומת שהיה ההורה שלהם אילו הופיעו גזירות יחידות (X  Y) מסולקות מהעץ S  if B then S1 else S2  if-then-else B S1 S2 תורת הקומפילציה איתן אביאור

17 דוגמה לעץ תחביר הקלט: 3  5 + 4 n עץ פריסה עץ תחביר L n E.val = 19 +
עץ פריסה עץ תחביר L n E.val = 19 + E.val = 15 T.val = 4 T.val = 15 digit.lexval = 4 T.val = 3 F.val = 5 F.val = 3 digit.lexval = 3 digit.lexval = 5 F.val = 4 + 4 5 3 תורת הקומפילציה איתן אביאור

18 בניית עץ תחביר לביטויים
כל צומת בעץ התחביר מיוצג ע"י רשומה בעלת מספר שדות סוג הצומת או האופרטור  מכונה תווית (label) של הרשומה מחוונים לצמתי הבנים ערכים (בצמתי עלים) נגדיר 3 פונקציות המחזירות מחוון לצומת חדש: mknode(op,left,right)  מייצרת "צומת פעולה" עם תווית op ושני שדות מחוונים left ו-right mkleaf(id,entry)  מייצרת "צומת מזהה" עם תווית id ושדה entry המכיל מחוון לטבלת הסמלים mkleaf(num,val)  מייצרת "צומת מספר" עם תווית num ושדה val המכיל את הערך המספרי תורת הקומפילציה איתן אביאור

19 דוגמה לבנית עץ תחביר הקלט: a – 4 + c סדר הפעולות העץ הנוצר
סדר הפעולות העץ הנוצר + p1 = mkleaf(id, entry_a); p2 = mkleaf(num, 4); p3 = mknode( ‘‘, p1, p2); p4 = mkleaf(id, entry_c); p5 = mknode( ‘+‘ , p3, p4); id to entry for c id num 4 to entry for a תורת הקומפילציה איתן אביאור

20 הגדרות מונחות תחביר לבניית עץ תחביר
להלן הגדרה של תכונות-S, המתאימה לבניית עץ תחביר כללי גזירה חוקי משמעות E  E1 + T E.nptr := mknode( ‘+ ‘ , E1.nptr , T.nptr ) E  E1  T E.nptr := mknode( ‘‘ , E1.nptr , T.nptr ) E  T E.nptr := T.nptr T  ( E ) T.nptr := E.nptr T  id T.nptr := mkleaf(id, id.entry) T  num T.nptr := mkleaf(num, num.val) תורת הקומפילציה איתן אביאור

21 עץ הפריסה ועץ התחביר הקלט: a – 4 + c E.nptr E T.nptr + - id num 4
to entry for a to entry for c E T.nptr E.nptr תורת הקומפילציה איתן אביאור

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

23 חישוב מלמטה למעלה של הגדרות תכונות-S
נשתמש בחישוב מלמטה למעלה, ובכל בנית צומת בעץ הפריסה נחשב את התכונות שלו על סמך תכונות בניו את תכונות הצמתים נשמור בתוך המחסנית כשהפורס מבצע רדוקציה לפי כלל גזירה מסויים, נחשב את כללי המשמעות הנלווים לאותו כלל גזירה תורת הקומפילציה איתן אביאור

24 הפורס והמחסנית נשתמש בפורס LR(1) שיש לו טבלאות פריסה action ו-goto, וכן מחסנית לצורך הפריסה עצמה מספיק לשים במחסנית את מספר המצב של הפורס, מפני שהוא מעיד באופן חד-משמעי על סמל הדקדוק שהוא מכסה כניסה במחסנית תהיה מורכבת אם כן: state מצב (אינדקס או מצביע לטבלת הפריסה)  אנו נרשום את סמל הדקדוק במקום זה val ערכי התכונות של סמל הדקדוק תורת הקומפילציה איתן אביאור

25 רדוקציה וחישוב משמעות נניח תכונה יחידה לכל סמל המצב החדש רדוקציה
המחסנית val state Z.w Y.u X.v Z Y X top  . . . הפורס מחליט לעשות רדוקציה לפי כלל גזירה A  XYZ אשר לו מקושר כלל המשמעות A.t := f(X.v, Y.u, Z.w) val state A.t A top  . . . v, u ו-w יכולים להיות אותה תכונה או תכונות שונות לסמלים שונים תורת הקומפילציה איתן אביאור

26 דוגמה להגדרת חישוב המשמעות
כלל גזירה קטע קוד ליישום חוקי המשמעות L  E n print ( stack [top].val ); E  E1 + T stack[ntop].val = stack[top2].val + stack[top].val; E  T // stack[ntop].val = stack[top].val; T  T1  F stack[ntop].val = stack[top2].val  stack[top].val; T  F // stack[ntop].val = stack[top].val; F ( E ) stack[ntop].val = stack[top1].val; F  digit // stack[ntop].val = stack[top].val; תורת הקומפילציה איתן אביאור

27 סדר ביצוע הפעולות top מצביע לראש המחסנית הפורס מחליט לבצע רדוקציה
r הוא אורך הצד הימני של כלל הגזירה ntop = top – (r – 1) הפורס מחשב את הקוד של חוק המשמעות הפורס מציב את המצב והערך החדש בתא המוצבע ע"י ntop הפורס מעדכן top = ntop (שולף r – 1 ערכים מהמחסנית) תורת הקומפילציה איתן אביאור

28 דוגמה לביצוע הפריסה עם חישוב משמעות
קלט state val כלל גזירה 3  n  n 3 3  n F 3 F  digit הקלט: 3  n  n T 3 T  F 5 + 4 n T  3 _ + 4 n T  5 3 _ 5 + 4 n T  F 3 _ 5 F  digit + 4 n T 15 T  T  F + 4 n E 15 E  T 4 n E + 15 _ n E + 4 15 _ 4 n E + F 15 _ 4 F  digit n E + T 15 _ 4 T  F n E 19 E  E + T E n 19 _ תורת הקומפילציה איתן אביאור L 19 L  E n

29 מסקנות הגדרות תכונות-S מאפשרות לנו לבנות פורס הקושר ביצוע רדוקציה לחישוב משמעות פעולות חישוב המשמעות נעשות לפני שמבוצעת רדוקציה ע"מ להרחיב את אוסף ההגדרות מעבר להגדרות תכונות-S נרצה לשלב פעולות חישוב תוך כדי פריסת צד ימין של כלל הגזירה תורת הקומפילציה איתן אביאור

30 חישוב תכונות במעבר לעומק (Depth First)
void dfvisit (node n) { foreach child m of n, from left to right { evaluate inherited attributes of m; dfvisit (m); } evaluate synthesized attributes of n; שיטה זו הינה טבעית לחישוב התכונות אם לא מגבילים את ההגדרת המשמעות עשויות להיווצר תלויות שאינן מתאימות לסדר חישוב זה תורת הקומפילציה איתן אביאור

31 הגדרות תכונות-L (L-attributed Definitions)
לכל כלל גזירה A  X1X Xn ולכל j בתחום [1..n] התכונות הנורשות של Xj תלויות רק ב: התכונות של הסמלים X1X2. . .Xj-1 (הנמצאים מצד שמאל של Xj בכלל הגזירה) התכונות הנורשות של A אבחנה: הגדרת תכונות-S הינה גם הגדרת תכונות-L תורת הקומפילציה איתן אביאור

32 סכמת תרגום (Translation Scheme)
דקדוק חסר הקשר אשר בו קיימות תכונות לכל סמל דקדוק ואשר פעולות משמעות (המצויינות בתוך סוגריים מסולסלים { } ) משולבות בתוך הצד הימני של כללי הגזירה תורת הקומפילציה איתן אביאור

33 דוגמה לסכמת התרגום מתרגם ביטוי חיבור/חיסור מכתיב פנימי (infix) לכתוב סופיות (postfix) הדקדוק E  T R R  addop T { print(addop.lexeme)} R1 | ε T  num { print(num.val)} הקלט 9 – 5 + 2 הפלט הרצוי 9 5 – 2 + עץ הרצוי E R T 9 5 2 + ε { print( ‘ 9 ’ ) } { print( ‘ 5 ’ ) } { print( ‘  ’ ) } { print( ‘ 2 ’ ) } { print( ‘ + ’ ) } תורת הקומפילציה איתן אביאור

34 מגבלות על פעולות סכמת התרגום
מגבלות על פעולות סכמת התרגום על מנת להבטיח כי נעמוד במגבלות תכונות-L שהוגדרו לעיל נדרוש מספר מגבלות על הפעולות של סכמת התרגום: תכונה נורשת של סמל בצד ימין של כלל גזירה חייבת להיות מחושבת בפעולה לפני שהסמל מופיע לפעולה אסור לפנות לתכונה מורכבת של סמל הנמצא מימין לה תכונה מורכבת של נונטרמינל בצד ימין ניתן לחשב רק לאחר שכל התכונות עליהן היא מסתמכת כבר חושבו בדרך כלל פעולה כזאת תימצא בקצה הימני של הכלל תורת הקומפילציה איתן אביאור

35 המשך יבוא תורת הקומפילציה איתן אביאור

36 תום פרק 5 תורת הקומפילציה איתן אביאור


Download ppt "פרק 5 תרגום מונחה תחביר תורת הקומפילציה איתן אביאור."

Similar presentations


Ads by Google