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

Post on 10-Jan-2016

131 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

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

ניתוח(analysis)

חיבור(synthesis)

syntax analyserמנתח תחביר

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

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

code optimizerמייעל קוד

code generatorמייצר קוד

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

ניתוח התחביר

syntax analyserמנתח תחביר

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

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

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

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

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

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

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

באופן נוח

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

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

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

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

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

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

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

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

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

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

הפריסה

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

עדכון טבלת הסמלים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 ( ) ; מנתח התחביר

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 ( then stmt else stmt

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

מיותר

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

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

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

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

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

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

ברמת הביטוי

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) אוסף כל המחרוזות מעל האלף-בית ─ הניתנות ליצור ע"י הדקדוק )בהמשך הגדרה יותר מדוייקת(

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

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

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

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

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

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

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

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

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

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

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

ומבנים בשפה

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

. . .

A k

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

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

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

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

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

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

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

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

דוגמה:

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

-)E( -)id + id(

+

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

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

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

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

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

ההתחלה

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

+

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

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

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

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

שמאליים

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

דוגמאות:

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

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

lm

rm

lm

rm

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

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

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

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

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

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

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

E

− E

E( )

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

+E E

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

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

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

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

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

E

E

+E E

id id

E

id

E

+ E

E E

id id

E

id

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

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

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

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

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

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

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

מצב כזה,

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

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

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

A A’

A’ A’ | ε

+

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

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

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

A A1 | A2 | . . . | Am

| 1 | 2 | . . . | n

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

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

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

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

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סלק רקורסיה שמאלית מכללי

+

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כלומר נדחה את ההכרעה בין

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)

אתחול

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

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

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

Sפרוס את 4.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

הפריסה•

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

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

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

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

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

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

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

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

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

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

… xn

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

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’

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

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

$b+aקלט

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

$Mטבלת פריסה

Z

Y

Xמחסנית

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

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

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

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) אם פלט: שגיאהאחרת

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

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

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

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

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

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

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

X על פני כלל

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

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(

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

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

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משתנה כמו קודם

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 ( = { + , , ) , $ {

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 ” ;

{

{

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

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(לא תמיד ניתן למצוא כללי העדפה חיצוניים

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

rm rm

rm

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

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

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

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

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

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

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

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

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

מחסניתקלט

$$wאתחול

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

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)

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

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

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

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

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

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

הבא

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

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ה-לא תמיד ניתן למצוא כללים כאלה

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)

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

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

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

במצב •

מחסניתקלט

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

LRחסרון שיטת

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

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

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

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

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

sm

Xm

sm-1

Xm-1

. . .

s0

מחסנית פלט

action goto

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

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

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

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

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

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

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

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

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

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

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

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

במצבים

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

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הוא נונטרמינל

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 ) ( ;

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מצב

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)

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

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

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

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

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

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

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 הכלל

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

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

א. כלל הגזירה

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

המשמעות

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

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

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

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

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

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

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

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

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

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

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

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

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 ( ;

{

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

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

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

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

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

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

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

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

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

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

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

rm rm

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

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

משפט

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

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

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

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

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

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 )

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

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

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

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

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

המשך ....

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אם נוצרו קונפליקטים הדקדוק איננו

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

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

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

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

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

error

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

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

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

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

כנ"ל

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

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

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

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

בלבד

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

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

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

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

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

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

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”

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

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

S L = R

S R

L R

L id

R L

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

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

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אוסף הפריטים

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

a = $ w = או ש-

rm rm

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

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

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;

{

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

LR)1( gotoבנית פריטי

set goto )I, X(

{

set J;

foreach item [ A α · X β , a ] in I

J += [ A α X · β , a ] ;

return closure ) J ( ;

{

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( ;{

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אם נוצר קונפליקט הדקדוק איננו

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

הטבלהבנית המשך

כדלקמן:gotoד. בנה טבלת goto[ i , A ] = j אזי goto ) Ii, A ( = Ijאם

מסומנות goto ובטבלת actionכל הכניסות הריקות בטבלת ה.errorב-

המצב ההתחלתי של הפורס הוא זה שנבנה מתוך הקבוצה ו., $ ] S’ · S[ המכילה את הפריט

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

קאנונית)LR)1טבלת פריסה )LR)1טבלת פריסה הטבלה הנוצרת ע"י אלגוריתם זה נקראת •

קאנונית

קאנוני)LR)1פורס המשתמש בטבלה זאת נקרא LRפורס •

דקדוק אם הטבלה איננה מכילה קונפליקטים הדקדוק נקרא •LR)1(

LR( ואומרים דקדוק 1לעיתים משמיטים את ה-)•

אבחנה: אבל בהחלט לא להפך)1(LR הוא דקדוק )SLR)1כל דקדוק

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

4תום פרק

top related