תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (parsing) של...

27
הההה הההההההההה236360 ההההה4 ( ההההה ההההההParsing הה) ההההההLL)1( Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper and Torczon – Chapter 3

Post on 22-Dec-2015

255 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

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

( של דקדוקי Parsingניתוח תחבירי )LL)1(

Wilhelm, and Maurer – Chapter 8Aho, Sethi, and Ullman – Chapter 4Cooper and Torczon – Chapter 3

Page 2: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

שלב הניתוח front-endתזכורת:

תוכנית מקור

Back end

Lexical Analysis

syntax analysisParsing

semantic analysis

token string

parse tree

decorated syntax tree

symboltable

errormessages

Page 3: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

תוכנית מקור

Lexical analysis

parser

tokenget next token

parserהאינטרקציה בין המנתח לקסיקלי וה-

errormessagemanager

Page 4: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

תזכורת: סוגי הניתוח התחבירי

top-down – "מהשורש לעלים )נקרא גם – "ניתוח תחזית – predictive)

bottom-up מהעלים לשורש – מעבירים למחסנית, או מחליפים צד – (shift reduce)ימין בסימן מהצד השמאלי של חוק הדקדוק

x y

s

x y

s

Page 5: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

מתרגם דקדוק באופן הבא:Recursive Descentאלגוריתם :להתחיל במשתנה התחילי ולמצוא גזירה. מטרה( עבור כל משתנה בדקדוקnonterminal.מגדירים פונקציה )-המנתח מתחיל לפעול מהפונקציה המתאימה לnonterminal

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

terminal.מתורגם לקריאת האסימון המתאים מהקלט nonterminal.מתורגם להפעלת הפונקציה המתאימה לו

אם ישנם כמה חוקי גזירה עבור אותוnonterminal בוחרים ,.lookaheadביניהם בעזרת

הקבוצהfirst עבור כלל גזירה Ai → β מכילה את קבוצת

. βהטרמינלים שעשויים להופיע ראשונים בגזירה כלשהי של

תוך כדי הפעלת פונקציות:top-downניתוח Recursive Descent

Page 6: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

תזכורת: כתיבת פונקציות בהתאם לדקדוק

E → LIT | ) E OP E ( | not ELIT → true | falseOP → and | or | xor

void E)( {if )lookahead {TRUE, FALSE}( LIT)(;else if )lookahead = LPAREN( match)LPARENT(;

E)(; OP)(; E)(;match)RPAREN(;

else if )lookahead = NOT( match)NOT(; E)(;else error;

}

void LIT)( {if )lookahead = TRUE( match)TRUE(;else if )lookahead = FALSE( match)FALSE(;else error;

}

void OP)( {if )lookahead = AND( match)AND(;else if )lookahead = OR( match)OR(;else if )lookahead = XOR( match)XOR(;else error;

}

Page 7: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

Recursiveהתאמת הדקדוק ל-Descent

. כאשר הדקדוק לא top-downלא כל דקדוק ניתן לגזירה יעילה מתאים מנסים לתקן אותו.

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

נחליף את הכללים ביטול רקורסיה ישירה:

A → Aα1 | Aα2 | ··· | Aαn | β1 | β2 | ··· | βn

בכללים

A → β1A’ | β2A’ | ··· | βnA’

A’ → α1A’ | α2A’| ··· | αnA’ | Є אבל יש גם רקורסיה עקיפה. למשל:

S → Aa | b

A → Ac | Sd | Є ועבורה האלגוריתם מעט יותר מורכב.

Page 8: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

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

שאולי יש בו רקורסיה שמאלית, ללא מעגלים, וללא Gדקדוק קלט:.εכללי דקדוק שקול ללא רקורסיה שמאלית. פלט:

. A → Є דוגמא לכלל אפסילון:

. ;A → B; B → A דוגמא למעגל: ניתן לבטל כללי אפסילון ומעגלים בדקדוק )באופן אוטומטי(.

נסדר את המשתנים לפי רעיון האלגוריתם לסילוק רקורסיה שמאלית:A1, A2, …, An סדר כלשהו:

נדאג שכל כלל שלו יהיה Aiנעבור על המשתנים לפי הסדר, ולכל מהצורה

Ai → Ajβ with i > j . מדוע זה מספיק?

Page 9: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

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

Input: Grammar G possibly left-recursive, no cycles, no ε productions.Output: An equivalent grammar with no left-recursionMethod: Arrange the nonterminals in some order A1, A2, …, An

for i:=1 to n do begin for s:=1 to i-1 do begin replace each production of the form Ai → Asβ

by the productions Ai → d1β |d2β|…|dkβ

where As -> d1 | d2 | …| dk are all the current As-productions;

end eliminate immediate left recursion among the Ai-productions

end

Page 10: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

ניתוח האלגוריתם

t מקיים Ak → Atβנראה שבסיום האלגוריתם כל חוק גזירה מהצורה > k .

Ai כלשהו )עם s: כשגומרים את הלולאה הפנימית עבור 1שמורה מתחילים בטרמינלים, או Aiבלולאה החיצונית( אז כל כללי הגזירה של

. j>s עבורם Ajבמשתנים

, כל כללי הגזירה שלו מתחילים Aiכשמסיימים עם המשתנה :2שמורה או בטרמינלים. j>i עבורם Ajבמשתנים

. s ו-iהוכחת שתי השמורות יחד באינדוקציה על בסיום האלגוריתם אין רקורסיה שמאלית )ישירה או עקיפה(. :מסקנה

. 2נובע משמורה

Page 11: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

הערות

?εמדוע לא עובד אם יש כלל ייעלם מהתחלת הכלל A4 אז אנו דואגים שה-A5 → A4A3 כי אם יש:

. A5 → A6A3, ואז יכול להתקבל A6ויוחלף, למשל ב- ואז השמורות לא A5 → A3, אז בעצם ניתן לגזור A6 → εאבל אם

תקיפות ועלולים לקבל רקורסיה שמאלית עקיפה. בעיקרון, טיפלנו רק במשתנה השמאלי ואסור לו להיעלם!

Page 12: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

Left בעזרת lookaheadהקטנת הצורך ב-Factoring

של FIRST היא התנגשויות ב-Recursive Descentבעיה נוספת של כללי גזירה שונים לאותו משתנה.

, אלגוריתם המפיק דקדוק פירוק שמאלי – Left Factoringהפתרון: חלופי ללא הבעיה.

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

S → if E then S else S | if E then S | T

S → if E then S S’ | TS’→ else S | ε

Page 13: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

Left Factoring אלגוריתם

Input: Grammar G Output: An equivalent left-factored grammar

Method: For each nonterminal A find the longest )non empty( prefix a common to two or more of its production rules. Namely: A → α b1 | α b2 | …| α bn. Replace all the A productions

A → α b1 | α b2 | …| α bn

byA → α A’A’ → b1 | b2 | … | bn )A’ is a new nonterminal(

Repeatedly apply this transformation until no such common prefix exists.

Page 14: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

עוד טרנספורמציות ?

קיימות עוד טרנספורמציות שמטרתן לייצר דקדוק ללא התנגשויות . FIRSTב-

של שפות רבות.top-downהטרנספורמציות הללו מאפשרות גזירת אפשר לגזור כל דקדוק שעבר "טיפול" כזה בהצלחה בעזרת

Recursive Descent.

ישנן תכונות של שפות שלא ניתנות לזיהוי ע"י שום דקדוק חסר הקשר. שכל משתנה יוגדר לפני השימוש בו. Java ו-Cלמשל, הדרישה של

w2w | w is in )0|1(* אבסטרקציה של הבעיה: בדיקת דרישות כאלו תיכלל בניתוח הסמנטי.

Page 15: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

)LL)1אלגוריתם

Page 16: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

)LL)kמחלקת הדקדוקים

אם הוא ניתן לגזירה:)LL)kדקדוק הוא במחלקה top-down,( סורקת את הקלט משמאלL,לימין )( מניבה את הגזירה השמאליתL,ביותר )-וזקוקה לlookahead בגודל k.

. )k(LLאם יש לה דקדוק )LL)kשפה היא .)LL)1המקרה הפשוט ביותר הוא אלגוריתם

Page 17: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

אלגוריתם הגזירה

Recursive באמצעות )LL)1ניתן למצוא גזירת מילה לדקדוק Descent שהוא האלגוריתם הכללי לגזירת top-down .

אבל בד"כ משתדלים להשתמש באלגוריתם ישיר מבוסס טבלה:."מאפשר לעבוד עם "טבלת דקדוק .מסיר רקורסיה מהמערכת

הרקורסיה מוחלפת במחסנית המכילה את התבנית שנותר לגזור. )k(LL ידועים בשם )LL)kאלגוריתמים מבוססי-טבלה לניתוח שפות

parsers.

Page 18: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

טבלת המעברים

משתמשים בטבלה המכתיבה, עבור כל מצב נתון, באיזה כלל )LL)1ב-גזירה להשתמש.

שורות הטבלה: משתנים.עמודות הטבלה: אסימונים אפשריים בקלט.

תוכן הטבלה: חוקי גזירה.

Page 19: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

...למשל

) ( not truefalse

and or xor $

E 2 3 1 1

LIT 4 5

OP 6 7 8

)1( E → LIT)2( E → ) E OP E ( )3( E → not E)4( LIT → true)5( LIT → false)6( OP → and)7( OP → or)8( OP → xor

Page 20: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

משתמש בטבלה ומחסנית)LL)1אלגוריתם

מחסנית

Parser

קלט

פלט

טבלת מעברים

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

הפסוקית שעוד נותר לגזור.

a * c + b $

Page 21: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

מבנה נתונים בזמן ריצת האלגוריתם:

if ) E ( then Stmt else Stmt ; Stmt … ; $

מחסנית:

top

if ) id < id ( then id = id + num else break; id = id * id;

Remaining Input:

Page 22: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

האלגוריתם

( התחילי, ו-$ )סימן לסוף nonterminalאתחול המחסנית: המשתנה )הקלט(.

( המחסנית יכולה להכיל אסימוניםterminals "$" .או משתנים )הוא אסימון מיוחד, לצורך סימון סוף הקלט.

אם בראש המחסנית יש אסימון:.אם האסימון הבא בקלט אינו זהה: שגיאה אם הוא תואם את הקלט: עבור לאסימון הקלט הבא; הסר את

האסימון מהמחסנית. )אם האסימון הוא $, סיימנו(.אם בראש המחסנית יש משתנה:

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

צד ימין של כלל הגזירה שנמצא בטבלה, לפי סדר – החל באסימון/משתנה הימני ביותר וכלה באסימון/משתנה השמאלי ביותר

)הוא ישאר בראש המחסנית(.

Page 23: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

בניית הטבלה

, והם ישמשו לבניית follows ו-Firstבתרגול ראיתם איך בונים את הטבלה.

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

Page 24: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

דוגמא טריביאלית )בתרגול דוגמאות רבות(

:דקדוקA → aAb | c

a b c

A A → aAb )error( A → cטבלה:

:aacbbנריץ את האלגוריתם על המילה , ומתחילים מאות הקלט הראשונה. $Aאיתחול מחסנית: •

שארית הקלט המחסנית כלל מתאים

aacbb$ A$ A → aAb

aacbb$ aAb$ התאמת טרמינל

acbb$ Ab$ A → aAb

acbb$ aAbb$ התאמת טרמינל

cbb$ Abb$ A → c

cbb$ cbb$ התאמת טרמינל

Page 25: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

)LL)kאלגוריתמים

היא )במקרה הגרוע( )LL)k, הטבלה הנדרשת לאלגוריתם k>1עבור .kבעלת סיבוכיות אקספוננציאלית ב-

מעשיים parsersלכן, עד לא מזמן האמינו שלא יהיה מעשי לבנות -ים יותר גדולים. k עבור )LL)kלדקדוקי ,

Purdueבתחילת שנות התשעים הדגימו חוקרים מאוניברסיטת parsers)ארה"ב( שהמקרה הגרוע הוא למעשה נדיר, וניתן לבנות

.)LL)kפרקטיים עם הכלי שפיתחו נקרא כיוםANTLR. כלים אחרים המבוססים עלLL)k(: JavaCC משמש לבניית(

)גם הוא SableCC עצמו(, javac, כולל מהדר Javaמהדרים ב-(, ואחרים.Javaב-

Page 26: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

LL)k( or not LL)k(? ; LL(1היא שפה ב-) an)b|c(nהשפה

"דקדוק טבעי":

: ונקבל את הדקדוקleft-factoringנבצע

a|b(n(anbn|ancn ?an?)*( מה לגבי השפות

:)LL)kדקדוק/שפה שאינם

S1 → aS1b | aS1c | ε

S1 → aS1X | εX → b|c

S → A | BA → aAb | cB → aBbb | d ancbn | andb2n

Page 27: תורת הקומפילציה 236360 הרצאה 4 ניתוח תחבירי (Parsing) של דקדוקי LL(1) Wilhelm, and Maurer – Chapter 8 Aho, Sethi, and Ullman – Chapter 4 Cooper

LL)k( or not LL)k(?

:k(LL שאיננו ב-))LL)k+1 ב-דקדוק

left-factoring(-יניב דקדוק שקול ב LL)1().

:)k(LL שאיננה ב-)LL)k+1דקדוק/שפה ב-

יודעים שצריך להפעיל את המעבר של c או bרק כשרואים S-ל ε.

S → aSA | ε A → akbS | c

S → akb | akc