Transcript
Page 1: פרק 4 ניתוח התחביר

1תורת הקומפילציהאיתן אביאור

Page 2: פרק 4 ניתוח התחביר

2תורת הקומפילציהאיתן אביאור

ניתוח(analysis)

חיבור(synthesis)

syntax analyserמנתח תחביר

semantic analyserמנתח משמעות

מייצר קוד ביניים intermediate code generator

code optimizerמייעל קוד

code generatorמייצר קוד

lexical analyserמנתח לקסיקאלי

ניתוח התחביר

syntax analyserמנתח תחביר

Page 3: פרק 4 ניתוח התחביר

3תורת הקומפילציהאיתן אביאור

של שפות (Syntax)תחביר מחשב

נוח לתאר את התחביר של שפת מחשב בעזרת דקדוק חסר הקשר

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

אוטומטי פורסים יעיליםבתהליך הבניה ניתן לגלות מצבים של רב-משמעות –

תחביריתדקדוק מתוכנן היטב מאפשר כתיבת תוכניות בעלות מבנה טוב •

המאפשר תרגומן לקוד מכונה נכון ויעילדקדוק מסודר מאפשר לעדכן את הגדרת השפה עם הזמן •

באופן נוח

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

4תורת הקומפילציהאיתן אביאור

היררכיה בהגדרת התחביר של שפה

הגדרת תמניות באמצעות ביטויים רגולרים ע"מ לפשט את •הגדרת השפה ובנית המהדר

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

הקשר כגון: "אין להשתמש במזהה לפני שהוצהר עליו"או הצורך בהתאמה בין הארגומנטים והפרמטרים של

פונקציה(179−181 עמ' ASU)ראה דיון ב-

Page 5: פרק 4 ניתוח התחביר

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

ניתוח התחביר ─ מטרה

קבלת זרם התמניות מהמנתח הלקסיקאלי1.

ניתוח זרם התמניות ע"פ כללי הגזירה ויצירת עץ 2.

הפריסה

מציאת שגיאות תחביר והיחלצות מהן3.

עדכון טבלת הסמלים4.

Page 6: פרק 4 ניתוח התחביר

6תורת הקומפילציהאיתן אביאור

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

stmt if ) expr ( stmt | if ) expr ( stmt else stmt | while ) expr ( stmt

if (id relop num) id;()

stmt

stmt

expr

expr args

if id relop num( ) id ( ) ; מנתח התחביר

Page 7: פרק 4 ניתוח התחביר

7תורת הקומפילציהאיתן אביאור

יחס גומלין של מנתח התחביר

תוכניתהמקור

מנתחלקסיקאלי

מנתחתחביר

טבלתסמלים

תמנית

דרישה לתמנית הבאה

שאר חלקיהצד הקדמי

עץ הפריסה קודביניים

Page 8: פרק 4 ניתוח התחביר

8תורת הקומפילציהאיתן אביאור

שיטות לביצוע פריסהקיימות שיטות לפריסה אוניברסלית של כל דקדוק נתון•

אינן יעילות לבנית מהדרים בפועל–קיימות שיטות לפריסה של דקדוקים בעלי תכונות מיוחדות•

(top-downפריסה מלמעלה למטה )–LLלמשל עבור דקדוקי •שימושית לבניה ידנית של פורס•

(bottom-upפריסה מלמטה למעלה )–LRלמשל עבור דקדוקי •שימושית לבניה אוטומטית של פורס•

Page 9: פרק 4 ניתוח התחביר

9תורת הקומפילציהאיתן אביאור

משימות נוספות המתבצעותתוך כדי הפריסה

הפורס

מפעיל את הסורק ע"מ לייצר עבורו את זרם התמניות•

מפעיל את "שאר חלקי הצד הקדמי"•

ניתוח המשמעות–

עדכון טבלת הסמלים–

יצירת קוד ביניים–

Page 10: פרק 4 ניתוח התחביר

10תורת הקומפילציהאיתן אביאור

טיפול בשגיאות

סוגי השגיאות•

יעדי מטפל השגיאות•

שיטות לטיפול בשגיאות•

Page 11: פרק 4 ניתוח התחביר

11תורת הקומפילציהאיתן אביאור

סוגי שגיאותלקסיקאליות ─ למשל: איות לא נכון של מזהה, מלת מפתח או •

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

חלק ניכר מהשגיאות המתגלות הן שגיאות תחביר:הרבה שגיאות הן אכן שגיאות תחביר•ניתן לגלות בקלות שגיאות תחביר ואף לתקן חלק מהן•קשה לגלות ולתקן שגיאות משמעות ושגיאות לוגיות•

Page 12: פרק 4 ניתוח התחביר

12תורת הקומפילציהאיתן אביאור

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

נוספותאסור שיאיט באופן משמעותי עיבוד של תוכניות נכונות•

Page 13: פרק 4 ניתוח התחביר

13תורת הקומפילציהאיתן אביאור

שיטות לטיפול בשגיאות(panic modeמצב פניקה )•

(phrase levelרמת הביטוי )•

(error productionsכללי גזירה לשגיאות )•

(global correctionתיקון גלובלי )•

Page 14: פרק 4 ניתוח התחביר

14תורת הקומפילציהאיתן אביאור

התאוששות ממצב פניקה(Panic Mode Recovery)

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

─ תמנית הבאה (synchronization tokenתמנית סינכרון )•בסוף מבנה )משפט, סדרת משפטים( והמציינת את סופו

נקודה-פסיק ; דוגמאות:סוגר מסולסל ימני }

endמלת מפתח שיטה טובה בהנחה שמשפט מכיל לרוב רק שגיאת תחביר •

אחתמונעת כניסה ללולאה אינסופית של הפורס•

Page 15: פרק 4 ניתוח התחביר

15תורת הקומפילציהאיתן אביאור

התאוששות ברמת הביטוי(Phrase Level Recovery)

בעת שהפורס מגלה שגיאה הוא מנסה לתקן אותה

ע"י החלפת הרישא של המשך הקלט במחרוזת אחרת

החלפת פסיק בנקודה-פסיקדוגמאות:מחיקת תו מיותר

הוספת סימן חסר

יש להיזהר לא להגיע למצב של לולאה אינסופית

)למשל אם הטיפול בשגיאה הוא תמיד הוספת תו לפני שאר הקלט(

Page 16: פרק 4 ניתוח התחביר

16תורת הקומפילציהאיתן אביאור

התאוששות ע"י כללי גזירה לשגיאות

(Error Production Recovery)הדקדוק יכיל מראש כללי גזירה לשגיאות נפוצות•

בכללים האלה תשולבנה מראש הפעולות לביצוע•

בעת גילוי שגיאות אלה

דוגמה:

stmt if ( expr ( then stmt else stmt

thenשימוש בכלל הגזירה הזה מעיד על הימצאות

מיותר

Page 17: פרק 4 ניתוח התחביר

17תורת הקומפילציהאיתן אביאור

תיקון גלובלי(Global Correction)

מציאת התוכנית הנכונה הקרובה ביותר לתוכנית המקוריתיש להגדיר מטריקה בין תוכניות,•

למשל ע"י מספר השינויים הבסיסים שיש לבצע במעבר מתוכנית לתוכנית

שינוי בסיסי: החלפת תו, מחיקת תו, הוספת תו, היפוך –תווים

טכניקה יקרה מאוד ליישום באופן גלובלי על כל התוכנית•עשויה להיות שימושית כטכניקה מקומית בשיטת ההתאוששות •

ברמת הביטוי

Page 18: פרק 4 ניתוח התחביר

18תורת הקומפילציהאיתן אביאור

( Grammarדקדוק )(Languageושפה )

G ─ דקדוק ( grammar) ─ G = T, N, P, ST ─ ( קבוצת טרמינליםterminals)האלף-בית ─

N ─ ( קבוצת נונטרמינליםnonterminals) ─ T N = P ─ ( כללי גזירהproductions) מהצורה ─

הן מחרוזות של טרמינלים ו/או נונטרמינלים, ו-כאשר )המסמן את המחרוזת הריקה(ε הוא או ש-

S ─ ( סמל ההתחלהstart symbol) ─ S N

L(G) ─ ( שפהlanguage) אוסף כל המחרוזות מעל האלף-בית ─ הניתנות ליצור ע"י הדקדוק )בהמשך הגדרה יותר מדוייקת(

Page 19: פרק 4 ניתוח התחביר

19תורת הקומפילציהאיתן אביאור

חוסר הקשר(Context Freedom)

―(context free grammarדקדוק חסר הקשר )

A דקדוק בו כל כללי הגזירה הם מהצורה

כמו קודם( הינו נונטרמינל יחיד )Aכאשר

― (context free languageשפה חסרת הקשר )

שפה שעבורה קיים דקדוק חסר הקשר המייצר אותה

דקדוק חסר הקשר ניתן להכרה ע"י אוטומט מחסנית

רוב המבנים של שפות התכנות הקיימות ניתנים לתיאור באמצעות דקדוק חסר הקשר

Page 20: פרק 4 ניתוח התחביר

20תורת הקומפילציהאיתן אביאור

(Parserפורס )כלי המנתח את תוכניות המקור ע"פ דקדוק השפה•(scannerהטרמינלים ─ התמניות הנוצרות ע"י הסורק )•הנונטרמינלים ─ משתנים המתארים צורות שונות של פסוקים •

ומבנים בשפה

דוגמה:expr expr op exprexpr ( expr ) expr - exprexpr idop +op -op op /op

טרמינלים:id + - / ( )

נונטרמינלים:expr op

Page 21: פרק 4 ניתוח התחביר

21תורת הקומפילציהאיתן אביאור

קונבנציות סימוןטרמינלים1(

אותיות קטנות מתחילת האלף-בית הלטיניא.a b c . . .

סמלי פעולהב.+ - / . . .

סמלי פיסוקג.) ( , ; . . .

הספרותד.0 1 . . . 9

מחרוזות בגופן בולטה.id if . . .

Page 22: פרק 4 ניתוח התחביר

22תורת הקומפילציהאיתן אביאור

המשך סימוןנונטרמינלים2(. . . A B C אותיות גדולות מתחילת האלף-בית הלטיניא. S המסמנת את סמל ההתחלהSהאות ב. . . .stmt expr op מחרוזות של אותיות קטנות נוטותג.מטה-משתנים3( . . .X Y Zאותיות גדולות מסוף האלף-בית הלטיניא.

)כלומר טרמינלים או נונטרמינלים(סמלי דקדוקמסמנות u v . . . zאותיות קטנות מסוף האלף-בית הלטיניב.

מסמנות מחרוזות של טרמינלים . . . אותיות קטנות מתחילת האלף-בית היווניג.

מסמנות מחרוזות של סמלי דקדוק

Page 23: פרק 4 ניתוח התחביר

23תורת הקומפילציהאיתן אביאור

המשך סימוןאלטרנטיבה4(

A 1המשמש לקיצור | הסימן

A 1 | 2 | . . . | k A 2

. . .

A k

סמל ההתחלה5(סמל ההתחלה הינו הצד השמאלי של כלל הגזירה הראשון

)אלא אם ציון אחרת(דוגמה

E E A E | ( E ) | - E | idA + | - | | / |

Page 24: פרק 4 ניתוח התחביר

24תורת הקומפילציהאיתן אביאור

(Derivationגזירה )סדרה של צעדים על מחרוזת המורכבת מטרמינלים ונונטרמינלים

המופיע במחרוזתXבה בכל צעד מוחלף סמל

X , תוך שימוש בכלל גזירה בתת-מחרוזת צעד גזירה נסמן:

סדרת צעדי גזירה סדרה לא ריקה של צעדי גזירה

דוגמה:

-)E( -)E A E( -)E + E( -)E + id( -)id + id(

-)E( -)id + id(

+

Page 25: פרק 4 ניתוח התחביר

25תורת הקומפילציהאיתן אביאור

(Languageשפה ) היא אוסף כל המחרוזות של G הנוצרת ע"י דקדוק L(G) שפה•

טרמינלים הנגזרות מסמל ההתחלה של דקדוק

L(G) = { w | S w { בשפה(sentenceמשפט ) נקראת w המחרוזת • ─ שני דקדוקים המייצרים (equivalentשקולים )דקדוקים •

אותה שפה•sentential מחרוזת ─ של סמלי דקדוק הנגזרת מסמל

ההתחלה

S טרמינלים בלבדהמורכב מ sentential( הוא sentenceמשפט )•

+

Page 26: פרק 4 ניתוח התחביר

26תורת הקומפילציהאיתן אביאור

(Leftmostגזירה משמאל )(Rightmostוגזירה מימין )

בכל צעד גזירה יש לקבל שתי החלטות:•

איזה נונטרמינל לגזור1(

באיזה כלל גזירה )מבין כללי הגזירה של אותו נונטרמינל( 2(נשתמש

בוחרים את הנונטרמינל השמאלי ביותר 1כאשר בשלב • ומסומנת ע"י(leftmostגזירה שמאלית )במחרוזת הגזירה נקראת

A : w A w ) w T* ( בוחרים את הנונטרמינל הימני ביותר במחרוזת 1כאשר בשלב •

ומסומנת ע"י(rightmostגזירה ימנית )הגזירה נקראת

A : A u u ) u T* (

lm

lm

rm

rm

Page 27: פרק 4 ניתוח התחביר

27תורת הקומפילציהאיתן אביאור

גזירה משמאל ומימין ─ המשך

בסדרה של צעדי גזירה נגזרת מ- מדגיש כי הסימון

שמאליים

בסדרה של צעדי גזירה ימניים נגזרת מ- מדגיש כי הסימון

דוגמאות:

- ) E + E ( - ) id + E (

- ) E + E ( - ) E + id (

lm

rm

lm

rm

Page 28: פרק 4 ניתוח התחביר

28תורת הקומפילציהאיתן אביאור

גזירה ועץ פריסהבנית עץ פריסה שקולה לגזירה

B כלל הגזירה: B צעד הגזירה:

B ביצירת בנים לצומת המסומן ב-מתבטא בעץ:

והסדר שלהם הוא כסדרם אזי מספר הבנים הוא באורך εאם ב-

ε נוצר בן יחיד המסומן ב- = εאם E E + E: כלל הגזירה

) - ) E + E ( E - )צעד הגזירה:

E

− E

E( )

עדכון: עץ הפריסה

+E E

Page 29: פרק 4 ניתוח התחביר

29תורת הקומפילציהאיתן אביאור

(Ambiguityרב-משמעות ) ─ (ambigousדקדוק רב-משמעי )

דקדוק המייצר יותר מעץ פריסה יחיד למחרוזת כלשהי )איזה נונטרמינל 1הרב-משמעות עשויה לנבוע מהבחירה של צעד

לגזור(אבל גם אם מחליטים על גזירה שמאלית )או ימנית(

)באיזה כלל גזירה להשתמש(2 היא עשויה לנבוע מצעד דוגמה:

E E + E E 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

Page 30: פרק 4 ניתוח התחביר

30תורת הקומפילציהאיתן אביאור

רב-משמעות ─ המשך

דקדוק רב-משמעי עשוי להטעות אותנו במציאת המשמעות של המשפט ולכן רצוי להימנע מדקדוק רב-משמעות

הבוררים (disambiguating rulesכללי חדות )לחילופין ניתן לנסח אפשרייםפורסים האת עץ הפריסה הרצוי מתוך העצים ה

E

E

+E E

id id

E

id

E

+ E

E E

id id

E

id

Page 31: פרק 4 ניתוח התחביר

31תורת הקומפילציהאיתן אביאור

רב משמעות ─ דוגמה:(dangling else המתנדנד )elseבעית ה-

דקדוקstmt if expr then stmt

| if expr then stmt else stmt| other

המשפט

if E1 then S1 else if E2 then S2 else S3

נפרס ע"י עץ פריסה

stmt

E1 S1

E2 S2 S3

if expr then stmt else stmt

if expr then stmt else stmt

Page 32: פרק 4 ניתוח התחביר

32תורת הקומפילציהאיתן אביאור

רב משמעות ─ המשך דוגמהאולם המשפט

if E1 then if E2 then S1 else S2

נפרס ע"י שני עצים אפשריים:

stmt

E1

E2 S1 S2

if expr then stmt

if expr then stmt else stmt

stmt

E1 S2

if expr then stmt else stmt

E2 S1

if expr then stmt

Page 33: פרק 4 ניתוח התחביר

33תורת הקומפילציהאיתן אביאור

סילוק רב-משמעותשפות התכנות שבהם משפטי תנאי כנ"ל מעדיפות את עץ •

הפריסה השמאלי הקרוב אליו ביותרthen צריך להיות משויך ל-elseכלומר, ה-• אשר then המשויך לו יהיה else ו-thenכלומר, לא ייתכן שבין •

משויךelseאין לו הדקדוק הבא מאפשר היווצרות של העץ השמאלי בלבד

stmt matched_stmt | unmatched_stmt

matched_stmt if expr then matched_stmt else matched_stmt | other

unmatched_stmt if expr then stmt | if expr then matched_stmt else

unmatched_stmt

Page 34: פרק 4 ניתוח התחביר

34תורת הקומפילציהאיתן אביאור

רקורסיה שמאלית(Left Recursion)

A A גזירה: כאשר דקדוק מאפשר•(left recursionרקורסיה שמאלית )נאמר כי קיימת בו

פורסים העובדים מלמעלה למטה מתקשים להתמודד עם •

מצב כזה,

ועלולים להיכנס לרקורסיה אינסופית

A A : A A | רקורסיה שמאלית פשוטה•

ניתנת לסילוק ע"י החלפת הכלל בצמד כללים:

A A’

A’ A’ | ε

+

Page 35: פרק 4 ניתוח התחביר

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

דוגמה לסילוק רקורסיה שמאלית פשוטה

הדקדוק:

E E + T | T

T T F | F

F ) E ( | id

ניתן לכתיבה מחדש כך:

E T E’

E’ + T E’ | ε

T F T’

T’ F T’ | ε

F ) E ( | id

Page 36: פרק 4 ניתוח התחביר

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

רקורסיה שמאלית מיידיתהכלל:

A A1 | A2 | . . . | Am

| 1 | 2 | . . . | n

ε שונה מ-i וכל A לא מתחיל ב-iכאשר שום

ניתן להחלפה ע"י הכללים:

A 1A’ | 2 A’ | . . . | nA’

A’ 1A’ | 2A’ | . . . | mA’ | ε

Page 37: פרק 4 ניתוח התחביר

37תורת הקומפילציהאיתן אביאור

סילוק רקורסיה שמאלית כללית

(A A חסר מעגלים )לא מתקיים Gנניח כי

( A ε )אין כללים מהצורה εוכי אין בו כללי (4.22 ו-4.20 תרג' ASU)ניתן לסלק את אלה מראש, ראה

האלגוריתם הבא מסלק רקורסיה שמאלית כללית

A1, A2, . . . , Anסדר את הנונטרמינלים בסדר כלשהו •

Ai i [1 .. n]עבור כל •Aj j [1 .. i-1]ועבור כל

Ai Aj מהצורה Pאם קיים כלל Aj 1 | 2 | . . . | kוכן קיימים כללים

Ai 1 | 2 | . . . | n בכלל Pהחלף את Aiסלק רקורסיה שמאלית מכללי

+

Page 38: פרק 4 ניתוח התחביר

38תורת הקומפילציהאיתן אביאור

Leftפירוק שמאלי )Factoring)

הדקדוק

stmt if expr then stmt else stmt| if expr then stmt

מותיר במבוכה פורס מנבא מפני שכאשר הפורס רואה את ifהתמנית

איננו יודע באיזה משני כללי הגזירה להשתמש

A 1 | 2 באופן כללי אם קיים כלל:

’A A נחליף אותו בצמד הכללים:

A’ 1 | 2

לשלב מאוחר יותר בפריסה2 ו-1כלומר נדחה את ההכרעה בין

Page 39: פרק 4 ניתוח התחביר

39תורת הקומפילציהאיתן אביאור

פירוק שמאלי ─ המשךובאופן כללי:

:Aלכל נונטרמינל הארוכה ביותר המשותפת לשתים או יותר אלטרנטיבות מצא את הרישא •

Aשל אזי קיימת רישא משותפת אמיתית εאם • נראה מהצורהAכלל •

A 1 | 2 | . . . | n | 1 | 2 | . . . | m

i איננה רישא של אף כאשר

החלף את כלל הנ"ל בכללים הבאים:•

A A’ | 1 | 2 | . . . | m

A’ 1 | 2 | . . . | n

חזור על צעדים אלה עד שלא תהיה יותר רישא משותפת אמיתית •Aלאלטרנטיבות של

Page 40: פרק 4 ניתוח התחביר

40תורת הקומפילציהאיתן אביאור

פריסה מלמעלה למטהTop Down Parsing

שיטה לפריסה המתאימה לבניה ידנית של פורסים•

תשתמש בגזירה שמאלית•

Page 41: פרק 4 ניתוח התחביר

41תורת הקומפילציהאיתן אביאור

ירידה רקורסיבית(Recursive Descent)

אתחול

המקום הנוכחי בקלט: בהתחלה1.

בנה עץ פריסה ריק2.

כשורש העץSהכנס את 3.

Sפרוס את 4.

ודא שהגעת לסוף הקלט5.

Page 42: פרק 4 ניתוח התחביר

42תורת הקומפילציהאיתן אביאור

המשךירידה רקורסיבית פריסה רקורסיבית

Vהצומת לפריסה הוא 1.

Pסמן את המקום הנוכחי בקלט: 2.

בצע:V עבור כל הכללים 3.Pחזור בקלט למקום 1. )אם יש(Vבטל כל הבנים של 2. בנים לפי Vהוסף ל-3. )משמאל לימין(:Vלכל בן של 4.

.a אם הבן הוא נונטרמינלפרוס אותו

.b אחרת )טרמינל( אם הוא זהה לקלט הבא התקדם בקלט

.c )אחרת )נסיגה 3 חזור לצעד.5V נפרס היטב חזור מהרקורסיה

Page 43: פרק 4 ניתוח התחביר

43תורת הקומפילציהאיתן אביאור

דוגמהירידה רקורסיבית S cAdהדקדוק:

A ab a

cadהקלט:

cadS

Ac d

a

cad Scad S

Ac d

cadS

Ac d

cad S

Ac d

a b

cad S

Ac d

a b

cad S

Ac d

a

cadS

Ac d

cad S

Ac d

a

Page 44: פרק 4 ניתוח התחביר

44תורת הקומפילציהאיתן אביאור

(Backtrackingנסיגה )הפורס בחר כלל גזירה שגוי, ונאלץ לחזור אחורה:•

לבטל צמתים בעץ–לחזור אחורה בקלט–

ישנם דקדוקים חסרי הקשר שלא ניתן לפרוס אותם מלמעלה •למטה ללא נסיגות

ישנן שפות חסרות הקשר שעבורן אין דקדוק שניתן לפריסה •מלמעלה למטה ללא נסיגות

ישנן שפות שעבורן ניתן לכתוב דקדוק הניתן לפריסה מלמעלה •למטה ללא נסיגות

Page 45: פרק 4 ניתוח התחביר

45תורת הקומפילציהאיתן אביאור

פורס מנבא(Predictive Parser)

פורס יורד רקורסיבית ללא ― (Predictive Parserפורס מנבא )

נסיגות

מתאים בד"כ להוראות הבקרה של רוב שפות התכנות•

stmt if expr then stmt else stmt

while expr do stmt

begin stmt_list end

stmt_list stmt stmt_list

ע"פ הקלט הבא ניתן תמיד לבחור באופן חד-משמעי את כלל •

, ועל כן אין צורך בנסיגותהגזירה המתאים

Page 46: פרק 4 ניתוח התחביר

46תורת הקומפילציהאיתן אביאור

דיאגרמת מעבר(Transition Diagrams)

לפורסים מנבאיםדיאגרמה אחת לכל נונטרמינל•

תוויות הקשתות הן טרמינלים ונונטרמינלים•

הפריסה•

מתחילים בדיאגרמה של סמל ההתחלה–

ניתן לעבור בקשת זו אם הקלט מעבר ע"פ קשת טרמינל –הבא הוא התמנית המתאימה

קריאה לנוהל שיפרוס את מעבר ע"פ קשת נונטרמינל –הנונטרמינל ע"פ הדיאגרמה שלו

Page 47: פרק 4 ניתוח התחביר

47תורת הקומפילציהאיתן אביאור

בנית דיאגרמת מעברסלק רקורסיה שמאלית מהדקדוק1.

בצע פירוק שמאלי של הדקדוק2.

:Aלכל נונטרמינל 3.

ייצר מצב התחלה ומצב סיום )חזרה(1.

ייצר מסלול ממצב ההתחלה A x1x2…xnלכל כלל 2.

,x1, x2למצב הסיום כך שהקשתות על המסלול מסומנות:

… xn

Page 48: פרק 4 ניתוח התחביר

48תורת הקומפילציהאיתן אביאור

דיאגרמת מעבר לפריסה דוגמה

הדיאגרמות:הדקדוק:

E T E’

E’ + T E’ | ε

T F T’

T’ F T’ | ε

F’ ( E ) | id

0 1 2T E’

E :

3 4+ T

E ’: 5 6E’

7 8 9F T’

T :

T ’: 10 11 F

12 13T’

F : 14 15( E

16 17)

id

Page 49: פרק 4 ניתוח התחביר

49תורת הקומפילציהאיתן אביאור

פישוט דיאגרמות מעבר לפריסה

0 1 2T E’

E :

3 4+ T

E’ : 5

6

3 4+

T

E’ :

6

0 3+T

E : 5

6

T

0 3

+

TE :

6

3 4+ T

E ’: 5 6E’

Page 50: פרק 4 ניתוח התחביר

50תורת הקומפילציהאיתן אביאור

פריסה מנבאת לא-רקורסיבית

$b+aקלט

תוכנית פריסה מנבאת פלט

$Mטבלת פריסה

Z

Y

Xמחסנית

טבלת הפריסה שורה לכל נונטרמינל• עמודה לכל טרמינל ועמודה ל-$• מכילה את כלל)י( הגזירה שניתןM[X,a] הכניסה •

aוהקלט הבא הוא X ליישם כאשר יש לגזור את

כיצד בונים ? בינתיים תעלומה

Page 51: פרק 4 ניתוח התחביר

51תורת הקומפילציהאיתן אביאור

append $ to w ;push ) $ (;push ) S (;i = 0;do { X = top )( ; a = wi ; if ) X is terminal or $ ( { if ) X == a ( {

pop )( ;i ++ ;

{ else error )( ; { else /* X is nonterminal */ if ) M[X, a] == “X Y1Y2…Yk” ( { pop )( ; push ) Yk, Yk-1, ... Y1 ( ; output “X Y1 Y2 … Yk ” ; { else error )( ;{ while ) X != $ ( ;

אלגוריתם לפריסהמנבאת לא-רקורסיבית

wמחרוזת קלט: G עבור הדקדוק Mוטבלת פריסה

; w גזירה שמאלית של w L(G) אם פלט: שגיאהאחרת

Page 52: פרק 4 ניתוח התחביר

52תורת הקומפילציהאיתן אביאור

רב-משמעות בטבלת מעברים

אם כניסה בטבלה מכילה יותר מאשר כלל אחד•

נוצרת רב-משמעות, והאלגוריתם הופך

לאי-דטרמיניסטי

ניתן לקבוע כללים צדדים ליישוב רב-משמעות, כגון:•

)X ) ≠ יש להעדיף כלל –

X על פני כלל

Page 53: פרק 4 ניתוח התחביר

53תורת הקומפילציהאיתן אביאור

דוגמהטבלת מעברים Non-

terminalInput Symbol

id+)($

EE T E’E T E’

E’E’ +T E’E’ E’

TT F T’T F T’

T’T’ T’ F T’T’ T’

FF idF ) E (STACK INPUT OUTPUT

$E id + id id$$E’ T id + id id$ E T E’

$E’ T’ F id + id id$ T F T’ $E’ T’ id id + id id$ F id

$E’ T’ +id id$$E’ + id id$ T’

$E’ T + + id id$ E’ + T E’ $E’ T id id$

$E’ T’ F id id$ T F T’

$E’ T’ id id id$ F id

STACK INPUT OUTPUT

$E’ T’ id$$E’ T F id$ T’ F T’

$E’ T’ F id$$E’ T’ id id$ F id

$E’ T’ $$E’ $ T’

$ $ E’ END

Page 54: פרק 4 ניתוח התחביר

54תורת הקומפילציהאיתן אביאור

First-ו Follow•First)(-קבוצת הטרמינלים שמתחילים מחרוזות הנגזרות מ — )ε First) אז גם εאם ••Follow)A(-קבוצת הטרמינלים שיכולים להופיע בצמוד ל — A

S Aa אם )a Follow)Aמימין בנגזרת כלשהי, כלומר: ) Follow)A אז גם $ S Aאם •

שים לבS Aa ε S Aa a Follow)A( S A ε S A $ Follow)A(

Page 55: פרק 4 ניתוח התחביר

55תורת הקומפילציהאיתן אביאור

Firstאלגוריתם לחישוב של טרמינלים ונונטרמינלים

for each terminal tFirst )t( = { t {;

while ) ! done ( {if ) “X ” is a production ( First )X( = { { ;if ) “X Y1 Y2 … Yk“ is a production ( {

First )X( = First )Y1( - { {;for ) i=1; i < k; i ++ ( if ) First )Yi( ( First )X( = First )Yi+1( - { {; else break ;if ) i == k First )Yk(( First )X( = { { ;

{{

המשנה = כל ביצוע Firstאת קבוצת ה-

done = 0גורם ל-

בהתחלת הלולאה)מיד לאחר הבדיקה(מציבים באופטימיות

done = 1

המשנה = כל ביצוע Firstאת קבוצת ה-

done = 0גורם ל-

בהתחלת הלולאה)מיד לאחר הבדיקה(מציבים באופטימיות

done = 1

Page 56: פרק 4 ניתוח התחביר

56תורת הקומפילציהאיתן אביאור

First )( = First )X1( { { ;for ) i = 1; i < n; i ++ ( { if ) First )Xi( ( First )( = First )Xi+1( { { else break ;if ) i == n First )Xn( ( First )( = { { ;

של סדרת Firstחישוב הסמלים X1 X2 . . . Xn X1 X2 . . . Xn

Page 57: פרק 4 ניתוח התחביר

57תורת הקומפילציהאיתן אביאור

Followאלגוריתם לחישוב

Follow )S( = { $ { ;while ) !done ( {

if ) “A B” is a production ( Follow )B( = First )( { { ;if ) “A B” is a production ) “A B” is a production First )( ( ( Follow )B( = Follow )A(;

{

β

doneמשתנה כמו קודם doneמשתנה כמו קודם

Page 58: פרק 4 ניתוח התחביר

58תורת הקומפילציהאיתן אביאור

דוגמההדקדוק

E T E’E’ + T E’ | εT F T’T’ F T’ | εF ( E ) | id

FirstFirst ) E ( = { ( , id {First )E’ ( = { + , ε {First ) T ( = { ( , id {First )T’ ( = { , ε {First ) F ( = { ( , id {

FollowFollow ) E ( = { ) , $ {Follow )E’ ( = { ) , $ {Follow ) T ( = { + , ) , $ {Follow )T’ ( = { + , ) , $ {Follow ) F ( = { + , , ) , $ {

Page 59: פרק 4 ניתוח התחביר

59תורת הקומפילציהאיתן אביאור

אלגוריתם לבנית טבלת פריסה

foreach ) production “A ” ( {

foreach ) terminal a First )( (

M [A, a] += “A ” ;

if ) First )( ( {

foreach ) terminal b Follow )A(

M [A, b] += “A ” ;

if ) $ Follow )A( (

M[A, $] += “A ” ;

{

{

Page 60: פרק 4 ניתוח התחביר

60תורת הקומפילציהאיתן אביאור

רב משמעות בטבלה

S i E t S S’ | aדקדוק:הS’ e S | εE b

הטבלה:

S’ ε על הכלל S’ eSפתרון הרב-משמעות אפשרי במקרה זה ע"י העדפת הכלל הקרוב אליו ביותרthen משוייך ל-elseבהתאם למוסכמה ש-

לעולם לא יוכנס למחסנית ולא יוצא eתגרום לכך שהסמל S’ εבחירת הכלל מהקלט

דקדוק רקורסיבי שמאלי או דקדוק רב-משמעימייצרים לפחות כניסה אחת רב-משמעית בטבלה

Nonterminal

Input Symbol

abeit$

SS aS i E t S S’

S’S’ εS’ eSS’

EE b

Page 61: פרק 4 ניתוח התחביר

61תורת הקומפילציהאיתן אביאור

)LL)1דקדוקי :)LL)1דקדוק הניתן לפריסה בתנאים הבאים נקרא

L קריאת הקלט משמאל לימין (Left to right scan) L גזירה שמאלית (Left most derivation)

1 ראית סמל אחד קדימה בלבד (1 lookahead symbol) משפט

ניתן לבנות טבלת פריסה ללא כניסות רב-משמעותיות)LL)1לדקדוק משפט

A A אם"ם לכל שני כללים )LL)1דקדוק הוא a T : a β a ( )–if ( a ( then a Follow )A(

לצערנו לא כל דקדוק ניתן להבאה למצבLL)1(לא תמיד ניתן למצוא כללי העדפה חיצוניים

Page 62: פרק 4 ניתוח התחביר

62תורת הקומפילציהאיתן אביאור

פריסה מלמטה למעלה(Bottom-Up Parsing)

שיטה לפריסה המתאימה לבניה •

אוטומטית של פורסים

תשתמש בגזירה ימנית•

Page 63: פרק 4 ניתוח התחביר

63תורת הקומפילציהאיתן אביאור

דוגמה לגזירה מלמטה למעלה

הדקדוקS a A B eA A b c bB d

משפט הקלטa b b c d e

נגזר ע"יa b b c d ea A b c d ea A d e a A B e S’

rm rm rm rm

Page 64: פרק 4 ניתוח התחביר

64תורת הקומפילציהאיתן אביאור

(Handlerמטפל ) A β הוא כלל של נגזרת ימנית (handlerמטפל )

A נמצאת וניתן להחליפה ב-β בו ומקום בתוך

בגזירה ימנית של ע"מ לייצר את הנגזרת הקודמת ל- S αAw αβwכלומר, אם •

αβwהוא מטפל של המחרוזת α במקום שאחרי A βאזי (w)מכילה רק טרמינלים מפני שמדובר בגזירה ימנית

נאמר מטפל ולא ה-מטפל מפני שבדקדוק רב-משמעי עשויות להיות שתי •S αβwגזירות ימניות

בדקדוק חד-משמעי לכל נגזרת ימנית יש רק מטפל אחד• מתאימה להחלפה מפני השמאלית ביותר בנגזרת βלא תמיד ה-•

עשויה להביא למשהו שלא ניתן לגזור מסמל A ב-βשהחלפת אותה ההתחלה

)מזכיר לנו את בעיית הנסיגות בגזירה יורדת(

rm rm

rm

Page 65: פרק 4 ניתוח התחביר

65תורת הקומפילציהאיתן אביאור

דוגמה ל"מטפל" שגויהדקדוק

S a A B eA A b c bB d

משפט הקלטa b b c d e

נגזר ע"יa b b c d ea A b c d ea A A c d e a A A c B e

rm rm rm rm ERROR

Page 66: פרק 4 ניתוח התחביר

66תורת הקומפילציהאיתן אביאור

דוגמה לפריסה מלמטה למעלה

הדקדוקE E + EE E EE ( E )E id

הקלטid1 + id2 id3

כלל הגזירהטיפולנגזרת ימנית

id1 + id2 id3id1E id

E + id2 id3id2E id

E + E id3id3E id

E + E E E EE E E

E + E E + EE E + E

E

Page 67: פרק 4 ניתוח התחביר

67תורת הקומפילציהאיתן אביאור

דוגמה לפריסה מלמטה למעלההמשך

הדקדוקE E + EE E EE ( E )E id

הקלטid1 + id2 id3

כלל הגזירהטיפולנגזרת ימנית

id1 + id2 id3id1E id

E + id2 id3id2E id

E + E id3E + EE E + E

E id3id3E id

E E E EE E E

E

מאחר והדקדוק רב-משמעיניתן לגזור גם באופן זה:

Page 68: פרק 4 ניתוח התחביר

68תורת הקומפילציהאיתן אביאור

פריסת "הזזה ורדוקציה"(Shift-Reduce)

לרשות הפורס נתונה מחסנית שלתוכה ניתן להכניס סמלי דקדוק

הפעולות:4הפורס פועל באמצעות •shift סמל הקלט מוזז ונדחף למחסנית•reduce החלפת תת-מחרוזת )של סמלי הדקדוק( שבראש

המחסנית במטפל שלה•accept עצירה במצב מקבל•error גילוי שגיאות תחביר

מחסניתקלט

$$wאתחול

S$$סיום מוצלח

Page 69: פרק 4 ניתוח התחביר

69תורת הקומפילציהאיתן אביאור

דוגמה להפעלת שיטתShift-Reduce

מחסנית קלט פעולה

$E + E reduce by E E + E$(10)

$E accept$(11)

$E + E id3 reduce by E id$(8)

$E + E E reduce by E E E$(9)

$E + E shift id3$(6)

$E + E shiftid3$(7)

$E + shiftid2 id3$(4)

$E + id2 reduce by E id id3$(5)

$id1 +id2 id3$ reduce by E id(2)

$E shift +id2 id3$(3)

$ id1 + id2 id3$ shift(1)

Page 70: פרק 4 ניתוח התחביר

70תורת הקומפילציהאיתן אביאור

קונפליקטים shift/reduceקונפליקט 1.

הפורס מתלבט מה לעשות בצעד הבא

reduce או פעולת shiftפעולת

reduce/reduceקונפליקט 2.

הפורס מתלבט באיזה רדוקציה כדאי לו לבחור בצעד

הבא

)יוגדר בהמשך()LR)kדקדוק שנוצרים בו קונפליקטים איננו

Page 71: פרק 4 ניתוח התחביר

71תורת הקומפילציהאיתן אביאור

דוגמה לקונפליקט Shift/Reduce

LRדקדוק רב-משמעי איננו יכול להיות הדקדוק

stmt if expr then stmt if expr then stmt else stmt other

מחסניתקלטהמצב . . . if expr then stmt else . . . $

זהו קונפליקטshift/reduce האם לבצע רדוקציה ע"פ הכלל ם ואח"כ רדוקציה לפי הכלל השנייהראשון או הזזה פעמי

במקרה זה ניתן לפתור את הקונפליקט ע"י כלל צדדי הקובע כיע"מ לשייך את shiftבמצב כזה יש להעדיף את פעולת ה-

הקרוב אליוthenל- elseה-לא תמיד ניתן למצוא כללים כאלה

Page 72: פרק 4 ניתוח התחביר

72תורת הקומפילציהאיתן אביאור

דוגמה לקונפליקטReduce/Reduce

נניח כי קריאה לשגרה וכן פניה למערך נכתבים בתחביר דומה •)I, J( ARR וכן )FUNC )A, B תוך שימוש בסוגריים ופסיקים:

לכל מזההidהסורק מייצר תמנית •

הדקדוקstmt expr := expr(2)

stmt id ( parameter_list )(1)

parameter_list parameter(4) parameter_list parameter_list , parameter(3)

expr id ( expr_list )(6) parameter id(5)

expr_list expr_list , expr(8) expr id(7)

expr_list expr(9)

Page 73: פרק 4 ניתוח התחביר

73תורת הקומפילציהאיתן אביאור

המשךדוגמה A(I, J)אם הקלט הוא: •

id ( id , id )זרם התמניות יהיה: •

במצב •

מחסניתקלט

. . . id ( id , id ) . . .

(7 או 5 לא ברור באיזה כלל צריך להשתמש לצורך הרדוקציה )

הסורק יבדיל בין שמות שגרות ומערכיםפתרון אפשרי •

תוך שימוש בטבלת סמלים וייצר תמנית שונה לכל מקרה

Page 74: פרק 4 ניתוח התחביר

74תורת הקומפילציהאיתן אביאור

Viable)רישא בת-קימא Prefix)

(viable prefixרישא בת-קימא )רישא של נגזרת ימנית שעשויה להופיע במחסנית

של פורס הזזה ורדוקציה

כלומר:רישא של נגזרת ימנית שאיננה ממשיכה

מעבר למטפל הימני ביותר בנגזרת

מכאןתמיד ניתן להוסיף טרמינלים לסופה של רישא בת-קימא

ע"מ לקבל נגזרת ימנית שלמה

Page 75: פרק 4 ניתוח התחביר

75תורת הקומפילציהאיתן אביאור

LRפורס :)LR)kפורס

L קריאת הקלט משמאל לימין (Left to right scan)

R גזירה ימנית (Rightmost derivation)

k ראית k סמלים קדימה (k lookahead symbol)

)LR)1 הכוונה ל-kכאשר משמיטים את

Page 76: פרק 4 ניתוח התחביר

76תורת הקומפילציהאיתן אביאור

LRיתרונות פורסי ניתן לזהות באמצעותם כמעט את כל המבנים של שפות •

תכנות הניתנים לתיאור באמצעות דקדוק חסר הקשר

השיטה המוכרת הכללית ביותר לפריסה בהזזה ורדוקציה ללא •נסיגות ואשר ניתנת למימוש יעיל

אוסף הדקדוקים הניתנים לפריסה בשיטה זו מכיל ממש את •אוסף הדקדוקים הניתנים לפריסה ע"י פורס מנבא

יכול למצוא שגיאות תחביר מוקדם ככל שניתן בזמן LRפורס •סריקה של הקלט משמאל לימין

Page 77: פרק 4 ניתוח התחביר

77תורת הקומפילציהאיתן אביאור

LRחסרון שיטת

השיטה מסובכת מדי כדי לבנות פורס באופן ידני

יש להשתמש בכלי מיוחד לבנית פורס

Page 78: פרק 4 ניתוח התחביר

78תורת הקומפילציהאיתן אביאור

LRמודל פורס a1 . . . ai . . . an קלט$

תוכנית פריסהLR

sm

Xm

sm-1

Xm-1

. . .

s0

מחסנית פלט

action goto

Page 79: פרק 4 ניתוח התחביר

79תורת הקומפילציהאיתן אביאור

תוכנית הפריסה בשיטת LR

לרשות תוכניות הפריסה:

זרם התמניות קלט

כללי הגזירה בסדר הפוך לגזירה פלט )מלמטה למעלה(

המכילה סמלי דקדוק ומצבים מחסנית

goto ו- actionטבלאות פריסה

Page 80: פרק 4 ניתוח התחביר

80תורת הקומפילציהאיתן אביאור

LRתוכנית הפריסה בשיטת המשך

המחסניתבמחסנית קיימים לסירוגין סמלי דקדוק ומצבים•המצב שנמצא בראש המחסנית הוא המצב בו נמצאת התוכנית •

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

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

במצבים

זוג הסדרות המייצגות את תוכן המחסנית (configurationתצורה ) s0X1s1X2s2 . . . Xms m , aiai+1 . . . an$ והקלט שנותר

Page 81: פרק 4 ניתוח התחביר

81תורת הקומפילציהאיתן אביאור

LRטבלאות הפריסה בשיטת actionטבלת

, ai וסמל הקלט הבא הינוsmכאשר המצב בראש המחסנית הינו יכולה להכיל אחד מארבעה ערכים:action [sm, ai]הכניסה

shift s הינו שם המצבs( s)הזז 1.

A α A α reduce בצע רדוקציה ע"פ כלל2.

acceptקבל3.

errorשגיאה4.

gotoטבלת

בטבלה זו מכילה מצב )או שהיא ריקה(goto [s, A]כניסה

s-הינו מצב ו Aהוא נונטרמינל

Page 82: פרק 4 ניתוח התחביר

82תורת הקומפילציהאיתן אביאור

אלגוריתם הפריסה בשיטת LR

input is w$ ;i = 1; while ) 1 ( {

{

t = top ) (;a = wi;if ) action [ t, a ] == “shift s” ( {

push ) a ( ;push ) s (;i ++ ;

{ elseif ) action [ t, a ] == “reduce A β“( {pop ) 2 * | β | ( ;t = top ) ( ;push ) A ( ;push ) goto [ t, A ]( ;output “A β” ;

{ elseif ) action [ t, a ] == “accept” ( {return ;

{ else error ) ( ;

Page 83: פרק 4 ניתוח התחביר

83תורת הקומפילציהאיתן אביאור

דוגמה לפריסה בשיטת LR

הדקדוק)1( E E + T)2( E T )3( T T F)4( T F )5( F ( E ))6( F id

הערות פירושו הזזsiא.

i למחסנית מצב פירושו רדוקציה rjב.

j לפי כלל גזירה פירושו לקבלaccג.

ד. כניסה ריקה היא שגיאה

טבלת הפריסה

E T

9

2

2

103

3

3F$()+id

r5r3s7

r6

r4s7

r5r3r1s6

r6

r4r2s6

s5s5

s5

s5

r5r3r1

r6

r4r2

acc

s4s4

s4

s4

r6584

r43r22

110

s11876

r511 r310 r19

gotoactionמצב

Page 84: פרק 4 ניתוח התחביר

84תורת הקומפילציהאיתן אביאור

המשך

דוגמה

הקלטid id + id

תצורת הפורס עד לקבלה

מחסנית קלט פעולה

0 E 1 + 6 shiftid $(10)

0 E 1 + 6 id 5 reduce by F id$(11)

0 T 2 reduce by E T+ id $)8(

0 E 1 shift+ id $)9(

0 T 2 7 id 5 reduce by F id +id$ (6)

0 T 2 7 F 10 reduce by T T F+ id$ (7)

0 T 2 shift id + id$ (4)

0 T 2 7 shiftid + id$ (5)

0 id 5 id + id$ reduce by F id(2)

0 F 3 reduce by T F id + id$ (3)

0 id id + id$ shift(1)

0 E 1 + 6 F 3 reduce by T F$(12)

0 E 1 + 6 T 9 E E + F$(13)

0 E 1 accept$(14)

Page 85: פרק 4 ניתוח התחביר

85תורת הקומפילציהאיתן אביאור

LRבנית טבלת הפריסה

שלוש שיטות מוכרות:

•SLR פשוטה למימוש אבל פחות חזקה

•LR קאנוני הכי חזקה אבל גם הכי יקרה

•LALR ,באמצע מבחינת המחיר והחוזק מתאימה לרוב שפות התכנות

Page 86: פרק 4 ניתוח התחביר

86תורת הקומפילציהאיתן אביאור

(Itemפריט ) LR)0( )LR)0( item( פריט

כלל גזירה שנעוצה בו נקודה במקום כלשהו בצידו הימנידוגמה

A x y zהכלל:

A · x y zהפריטים: A x · y z

A x y · z A x y z ·

· A מייצר רק פריט אחד: A הכלל

Page 87: פרק 4 ניתוח התחביר

87תורת הקומפילציהאיתן אביאור

המשךפריט – :ניתן לייצג פריט ע"י שני מספרים

א. כלל הגזירה

ב. מקום הנקודה

משמעות הפריט:

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

לנקודה המזהה NFAהפריטים הם מצבים אפשריים של אוטומט •

רישאות בנות-קיימא. שנוצר ע"י אלגוריתם DFAקבוצות פריטים הן מצבי אוטומט •

"בנית תת-קבוצות"

Page 88: פרק 4 ניתוח התחביר

88תורת הקומפילציהאיתן אביאור

SLR הגדרות S’ S דקדוק שהוסף לו כלל (augmentedדקדוק מורחב )

•S-הינו סמל ההתחלה הישן ו S’הינו סמל ההתחלה החדש

לוודא שיש רק כלל גזירה אחד פשוט שכאשר התכלית•

משתמשים בו יודעים שהגזירה מלמטה למעלה הצליחה

תוגדר להלן (closureפעולת סגור )

תוגדר להלןgoto פעולת

Page 89: פרק 4 ניתוח התחביר

89תורת הקומפילציהאיתן אביאור

SLR פעולת סגור (Closure)G’ דקדוק חסר הקשר מורחב

I קבוצת פריטים של G’

closure ) I ( :קבוצת הפריטים המכילה את

עצמהIא. כל מה שקיים ב-

) A α · B β closure ) I ב. אם הוא כלל גזירה B ואם ) B · closure ) I אזי גם

המשמעות

B β ואנו מצפים עתה לראות αכאשר ראינו בקלט (β )ואח"כ ניתן גם לומר כי אנו מצפים לראות עתה בקלט

Page 90: פרק 4 ניתוח התחביר

90תורת הקומפילציהאיתן אביאור

SLR סגורדוגמה

E’ · EE · E + TE · TT · T F T · F F · ( E )F · id

closure { [ E’ · E ] { כולל:

הדקדוק

E’ E

E E + T | T

T T F | F

F ( E ) | id

Page 91: פרק 4 ניתוח התחביר

91תורת הקומפילציהאיתן אביאור

SLR סגור המשך הפריטים בתוך סגור מתחלקים לשני תת-קבוצות:

כוללים את: (kernelפריטי גרעין )• S’ · S פריט ההתחלה –כל הפריטים בהם הנקודה איננה בצד שמאל לגמרי–

כוללים את כל הפריטים בהם הנקודה בצד שמאל (nonkernelפריטי חוץ )•לגמרי, מלבד פריט ההתחלה

לקבוצה B · מאחר וכאשר מוסיפים פריט חוץ

, B פריטי החוץ הנוצרים מכללי כלמוסיפים בעצם את

אין למעשה צורך לשמור בקבוצה את כל הפריטים עצמם,

אלא רק את רשימת הנונטרמינלים

שמכללי הגזירה שלהם נוצרים הפריטים המעניינים אותנו

Page 92: פרק 4 ניתוח התחביר

92תורת הקומפילציהאיתן אביאור

SLR פעולת gotoI קבוצת הפריטים

X סמל דקדוק goto ) I , X ( הסגור של קבוצת כל הפריטים מהצורה ]A α X ·

β] Iהשייכים ל- [A α · X β[ וזאת עבור כל הפריטים מהצורה

} I = { [ E’ E · ] , [ E’ E · + T ] דוגמה

goto ) I , + ( :מכיל אתE E + · T T · T F

T · F F · ( E )

F · id

Page 93: פרק 4 ניתוח התחביר

93תורת הקומפילציהאיתן אביאור

SLR בנית קבוצות פריטים void items ) G (

{

C = { closure ) { [ S’ · S ] { ( { ; /* אוסף של קבוצות פריטים */

done = 1;

do

foreach set I C

foreach X T N /* סמל דקדוק */

if ) goto ) I , X ( != (

C += goto ) I, X (; /* עשוי להשתנות done */

while ) !done ( ;

{

Page 94: פרק 4 ניתוח התחביר

94תורת הקומפילציהאיתן אביאור

דוגמה לבנית קבוצות פריטים

הפריטיםהדקדוק

E’ E

E E + T | T

T T F | F

F ( E ) | id

E’ · EE · E + TE · TT · T FT · FF · ) E (F · id

I0

E’ E · E E · + T

I1

E T · T T · F

I2

F ) · E ( E · E + TE · TT · T FT · FF · ) E (F · id

I4

T F · I3

F id · I5

E E + · TT · T FT · FF · ) E (F · id

I6

T T · FF · ) E (F · id

I7

F ) E · (E E · + T

I8

E E + T · T T · F

I9

T T F · I10

F ) E · ( I11

Page 95: פרק 4 ניתוח התחביר

95תורת הקומפילציהאיתן אביאור

המשךהדוגמה

הפריטים מייצגים את המצבים • המכיר את הרישות NFAשל

בנות-הקיימא של הדקדוק A α · X βקשת מעבר מפריט –

ע"ימסומנת A α X · β לפריטX

A α · B βקשת המעבר מפריט – מסומנת ע"י B · לפריט

קבוצות הפריטים מייצגות את מצבי• NFA הנוצר מה-DFAה-

I0 I1

+EI6 I9

T to I7

to I3

to I4

to I5

I2 I7 I10

F

to I4

to I5I3

I4 I8 I11

to I6

to I4

to I5

I3

F(id

T

F

(

id

(

E

T

Fid

)

+

(

id

Page 96: פרק 4 ניתוח התחביר

96תורת הקומפילציהאיתן אביאור

SLR פריטים תקפים תקף עבור רישא בת-קיימא A β1 · β2 פריט (validפריט תקף )

αβ1 אם קיימת גזירה S’ Aw β1β2w

פריט עשוי להיות תקף להרבה רישות•

הנמצאת על המחסנית אזי: αβ1 תקף עבור רישא A β1 · β2אם •

הפריט מציע שלא ראינו עדיין את כל המטפל, β2 ≠ אם –ועלינו לבצע פעולת הזזה

הפריט מציע שראינו מטפל שלם במחסנית וניתן β2 = אם –לבצע פעולת רדוקציה

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

חלק מהקונפליקטים ניתן לפתור ע"י הסתכלות בסמל הקלט הבא•

rm rm

Page 97: פרק 4 ניתוח התחביר

97תורת הקומפילציהאיתן אביאור

SLR פריטים תקפים המשך

משפט

אוסף הפריטים התקפים עבור רישא בת-קיימא

הוא בדיוק קבוצת הפריטים אליהם ניתן להגיע

מהמצב התחלתי לאורך מסלול המסומן ע"י

הנוצר מהבניה הקאנונית של קבוצות DFAבאוטומט

.gotoפריטים עם מעברים המוגדרים ע"י פעולת ה-

Page 98: פרק 4 ניתוח התחביר

98תורת הקומפילציהאיתן אביאור

דוגמה על פי הדוגמה דלעילgotoהדקדוק ופעולת ה-• היא רישא בת-קיימאE + T המחרוזת •

E + T אחרי שהוא קוראI7האוטומט הנ"ל נמצא במצב •

כולל את הפריטים:I7מצב •T T · F F · ( E )F · id

:הפריטים מתאימים כל אחד לגזירות הבאותT T · FE’ E

E + T E + T F

F · idE’ E

E + T E + T F

E + T id

F · ( E )E’ E

E + T E + T F

E + T ( E )

Page 99: פרק 4 ניתוח התחביר

99תורת הקומפילציהאיתן אביאור

SLRבנית טבלת פריסה

S’ S מרחיבים את הדקדוק ע"י כללא.

לדקדוק Cנוני של קבוצות פריטים אמייצרים את האוסף הקב. המורחב

לכל נונטרמינל)Follow)Aמחשבים את ג.

המשך ....

Page 100: פרק 4 ניתוח התחביר

100תורת הקומפילציהאיתן אביאור

בנית טבלת פריסה המשך SLR

באופן הבא:actionבונים את טבלת ד. .1C = { I0, I1, . . . In { היא אוסף קבוצות הפריטים LR)0( נקבעות כדלקמן:i― הפעולות למצב Ii נוצר מקבוצה i מצב2.

goto(Ii , a) = Ij וכן A α · a β ] Ii[ אם 1.) חייב להיות טרמינלaction] i , a ] = “shift j” )a אזי

A α [· Ii[ אם 2.

”action[ i, a ] = “reduce A αאזי (’S הוא כל נונטרמינל מלבד A ))Follow)A ב-aלכל

S’ S [ · Ii[ אם 3.

”action[ i, $ ] = “acceptאזי

המשך ....) SLR ) 1אם נוצרו קונפליקטים הדקדוק איננו

Page 101: פרק 4 ניתוח התחביר

101תורת הקומפילציהאיתן אביאור

בנית טבלת פריסה המשך SLR

באופן הבא:gotoבונים את טבלת ה.

goto [ i, A ] = j אזי goto)Ii, A( = Ij אם

מסומנות ע"י goto ו-actionו. כל הכניסות שלא הוגדרו בטבלאות

error

ז. מצב ההתחלה של הפורס הוא זה שנבנה מתוך קבוצת הפריטים

] S’ · Sהמכילה את הפריט [

Page 102: פרק 4 ניתוח התחביר

102תורת הקומפילציהאיתן אביאור

הגדרות שנבנו goto ו-action טבלאות G עבור דקדוק )SLR)1טבלת

כנ"ל

)1(SLR פורס המשתמש בטבלאות )SLR)1פורס

)1(SLR דקדוק שניתן לבנות עבורו טבלאות )SLR)1דקדוק

SLR( ואומרים 1בדרך כלל משמיטים את ה-)

מפני שלרוב מדובר בהסתכלות קדימה רק על סמל קלט אחד

בלבד

Page 103: פרק 4 ניתוח התחביר

103תורת הקומפילציהאיתן אביאור

SLRחסרונות SLRניתן להראות דוגמה של דקדוק חד-משמעי שעבורו שיטת •

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

הקשר שמאלי ע"מ להחליט באיזה פעולה לנקוט מתאימות למגוון רחב יותר של LALR קאנוני ו-LRשיטות •

SLRדקדוקים מאשר כלל ולכן גם שיטות אלה נכשלות LRישנם דקדוקים שאינם •

בהםLALRלמרבית שפות התכנות מתאימה שיטת הביניים •

Page 104: פרק 4 ניתוח התחביר

104תורת הקומפילציהאיתן אביאור

SLRדוגמה לבנית טבלת

I0הקבוצה

E’ · E //E · E + T //E · T //T · T F //T · F //F · ( E ) : action [0, ( ] = “shift 4”F · id : action [0, id] = “shift 5”

I1הקבוצה

E’ E · : action [1, $] = “accept”

E E · + T : action [1, +] = “shift 6”

הדקדוק וקבוצות הפריטים שהוגדרו קודם

I2הקבוצה

E T ·T T · FFollow( E ) = { $ , + , ) }

ולכןaction [2, $] =action [2, +] = action [2, ] = “shift 7”

Page 105: פרק 4 ניתוח התחביר

105תורת הקומפילציהאיתן אביאור

SLR לבנית טבלת 2דוגמה דקדוק

S L = R

S R

L R

L id

R L

זהו דקדוק המפריד )מקומות l-valueבין ו )ערכים(r-valueבין

אחסון(לצורך הגדרת פעולת ההצבה

Page 106: פרק 4 ניתוח התחביר

106תורת הקומפילציהאיתן אביאור

2המשך דוגמה הדקדוק

S L = R S R L R L idR L

S’ · SS · L = RS · RL · RL · id R · L

I0

S’ S · I1

S L · = RR L ·

I2

L · RR · LL · RL · id

I4

S R · I3

L id · I5

S L = · RR · L L · RF · id

I6

L R · I7

R L · I8

S L = R · T T · F

I9

הקנוני של הדקדוק)LR)0אוסף הפריטים

Page 107: פרק 4 ניתוח התחביר

107תורת הקומפילציהאיתן אביאור

2המשך דוגמה I2נתבונן בקבוצה •

”shift 6 להיות "action[ 2, = ]הפריט הראשון גורם לכניסה • = מכילה את הטרמינל ) Follow) Rמאחר וקבוצת •

(S L = R R = R ) reduce R להיות “ action[ 2, = ]הפריט השני גורם לכניסה

L” הדקדוק הוא חד-משמעי אבל טבלת הפריסה רב-משמעית •

מכילה קונפליקט ולא Lהטבלה איננה זוכרת את ההקשר שבו התגלה הסמל •

Rיודעת האם מותר לעשות לו רדוקציה לסמל

S L · = RR L ·

I2

Page 108: פרק 4 ניתוח התחביר

108תורת הקומפילציהאיתן אביאור

2המשך דוגמה L מייצג את הרישא 2מצב •

= . . .Rמאחר ואין שום נגזרת המתחילה ברישא • כאשר רואים בקלט את הסימן =2במצב

R )אסור להשתמש בכלל R ל-Lאסור לבצע את הרדוקציה מ- L)

= עם סימן קלט 2לכן במצב •יש לבצע פעולת הזזה ע"פ ההצעה של הפריט הראשון

Page 109: פרק 4 ניתוח התחביר

109תורת הקומפילציהאיתן אביאור

SLRהחולשה של שיטת מציע את a עם סמל קלט i מצב SLRבאופן כללי בשיטת

כאשר:A הרדוקציה

· ]A [ מכילה את הפריט Iiקבוצת הפריטים –

)Follow)A- שייך ל aסמל הקלט –

אולם, מופיע במחסנית שבה קיימת רישא בת-קיימא iייתכן כי מצב

β ואילו β איננו מופיעה לפני a ,בשום נגזרת ימנית a איננה תקיפה כשהקלט הבא הוא A ועל כן הרדוקציה

Page 110: פרק 4 ניתוח התחביר

110תורת הקומפילציהאיתן אביאור

LRקאנוני הרעיון המרכזי הוא לפצל את המצבים )קבוצת הפריטים( ע"פ סימן הקלט הבא,

SLRוכך לאפשר פתרון הקונפליקטים הנוצרים בשל קוצר הראות של שיטת

LR)1( [ A α · β , a ]פריט זוג המורכב מ:

כלל גזירה שבצידו הימני נעוצה במקום מסוים נקודה–

מטרמינל )או סימן סוף הקלט $(–

בקלט1( מסמן שמדובר בהסתכלות קדימה על סמל 1הציון )• כאשר] A α · β , a [ וכן β ≠ -אין חשיבות לa כאשר ] A α · , a[ ניתן לבצע רדוקציה בעזרת A

aרק אם סמל הקלט הבא הוא כלומר ניתן לבצע רדוקציהA רק אם סמל הקלט הבא הוא a

בתוך המצב שבראש המחסנית ]A α · , a[וקיים פריט

Page 111: פרק 4 ניתוח התחביר

111תורת הקומפילציהאיתן אביאור

LR קאנוני המשך קבוצת כל הסמלים a העומדים בתנאי זה הינה תת-קבוצה

)A(Follow)ולעיתים תת-קבוצה ממש( של

הגדרה פורמלית

לרישא( valid תקף )הוא LR)1( [ A α · β , a ]פריט S Aw βw אם ישנה נגזרת בת-קיימא

כאשר = -או שa הינו הסמל הראשון של w

a = $ w = או ש-

rm rm

Page 112: פרק 4 ניתוח התחביר

112תורת הקומפילציהאיתן אביאור

דוגמה S BB דקדוק

B a B | b

S aaBab aaaBabמאחר וקיים

= aaa תקף עבור הרישא ]B a · B , a[ על כן הפריט

( = aa, A = B, w = ab, = a, β = B)בהגדרה דלעיל

S BaB BaaBכמו כן קיים

Baa תקף עבור הרישא , $ ] B a · B[ ועל כן הפריט

rm rm

rm rm

Page 113: פרק 4 ניתוח התחביר

113תורת הקומפילציהאיתן אביאור

ניתוח מחדש של סגור ] בקבוצת הפריטים של A α · B β , aנניח כי קיים פריט [•

רישא בת-קיימא S Aax Bβaxעל כן קיימת גזירה •

= כאשר by נגזרת מחרוזת הטרמינלים βaxנניח כי מתוך • כלשהו( )עבור B לכן, לכל כלל גזירה מהצורה •

S Bby byקיימת הגזירה

] תקף עבור B · , bומכאן ש- [ ••b יכול להיווצר מתוך β או אם ,β-נגזרת ל אזי b = a)First)βax יכול להיות טרמינל כלשהו מתוך bבאופן כללי •

rm rm

rm rm

Page 114: פרק 4 ניתוח התחביר

114תורת הקומפילציהאיתן אביאור

סגורLR)1( בנית פריטי set closure ) I ({

done = 1;do

foreach item [ A α · B β , a ] in I foreach production “B ” in G

foreach terminal b in First )βa(I += [ B · , b ] ; /* => done = 0

*/while ) ! done ( ;return I;

{

Page 115: פרק 4 ניתוח התחביר

115תורת הקומפילציהאיתן אביאור

LR)1( gotoבנית פריטי

set goto )I, X(

{

set J;

foreach item [ A α · X β , a ] in I

J += [ A α X · β , a ] ;

return closure ) J ( ;

{

Page 116: פרק 4 ניתוח התחביר

116תורת הקומפילציהאיתן אביאור

)LR)1בנית פריטי void items ) G ({

C = { closure ) { [ S’ · S , $ ] { ( {;done = 1;do

foreach set I in C foreach grammar symbol X

if ) goto ) I, X ( != ( C += goto )I, X(; /* => done = 0 */

while ) !done( ;{

Page 117: פרק 4 ניתוח התחביר

117תורת הקומפילציהאיתן אביאור

LRבנית טבלת פריסה קנונית

S’ Sהרחב את הדקדוק ע"י הכלל א. ע"פ האלג' דלעיל)LR)1 קבוצת כל קבוצות הפריטים Cבנה את ב. כדלקמן:actionבנה טבלת ג.

– C = { I0, I1, . . . In {, והפעולות של מצב זה Ii של הפורס מיוצר מתוך iמצב –

נקבעות כדלקמן: goto)Ii, a( = Ij [ A α · a β , b ] Ii אם –

חייב להיות טרמינלaction[ i, a ] = “shift j ” (a) אזיA ≠ S’ [ A α · , a ] Ii אם –

”action[ i, a ] = “reduce A אזי action[ i , $ ] = accept אזי S S [ $ , · Ii[ אם –

והאלגוריתם נכשל)LR)1אם נוצר קונפליקט הדקדוק איננו

Page 118: פרק 4 ניתוח התחביר

118תורת הקומפילציהאיתן אביאור

הטבלהבנית המשך

כדלקמן:gotoד. בנה טבלת goto[ i , A ] = j אזי goto ) Ii, A ( = Ijאם

מסומנות goto ובטבלת actionכל הכניסות הריקות בטבלת ה.errorב-

המצב ההתחלתי של הפורס הוא זה שנבנה מתוך הקבוצה ו., $ ] S’ · S[ המכילה את הפריט

Page 119: פרק 4 ניתוח התחביר

119תורת הקומפילציהאיתן אביאור

קאנונית)LR)1טבלת פריסה )LR)1טבלת פריסה הטבלה הנוצרת ע"י אלגוריתם זה נקראת •

קאנונית

קאנוני)LR)1פורס המשתמש בטבלה זאת נקרא LRפורס •

דקדוק אם הטבלה איננה מכילה קונפליקטים הדקדוק נקרא •LR)1(

LR( ואומרים דקדוק 1לעיתים משמיטים את ה-)•

אבחנה: אבל בהחלט לא להפך)1(LR הוא דקדוק )SLR)1כל דקדוק

Page 120: פרק 4 ניתוח התחביר

120תורת הקומפילציהאיתן אביאור

4תום פרק


Recommended