Top-Downניתוח תחבירי
sakogan@cs)נכתב ע"י אלכס קוגן )סמסטר חורף, תשס"ח
1
תזכורת מתרגול אחרון
ראינו מהו המבנה הסכמתי של קומפיילר•
לקסמות, אסימונים, וביטויים רגולריים.•דנו בתכונות המנתח הלקסיקלי.•.Flexראינו את הכלי •
ניתוחלקסיקלי
ניתוחתחבירי
ניתוחסמנטי
backend
2
ניתוח תחביריהיום נתרכז בשלב הניתוח התחבירי•
ניתוחתחבירי
רצף אסימונים
עץ גזירה או הודעת (syntax error)שגיאה
שפת כל התכניות החוקיות מוגדרת ע"י דקדוק חופשי הקשר:•
3
G=)V,T,P,S(
V ,קבוצת המשתנים – T קבוצת הטרמינלים )א"ב השפה(: האסימונים –
המתקבלים מהניתוח הלקסיקלי,P ,קבוצת כללי הגזירה – S.משתנה התחלתי –
חוקית )נכתבה שלמהרצף האסימונים המתאים לתוכנית •באופן חוקי על פי כללי הדקדוק( מהווה מילה שצריכה
להתקבל בשפה.
דרישת מהמנתח התחבירי
מילה בשפה:כל המנתח צריך לזהות שלמות:•אם התכנית היא חוקית,–
עץ גזירה.המנתח יצליח לזהות אותה ויבנה
: אסור למנתח לקבל מילים שאינן נאותות•בשפה:
אם התכנית אינה חוקית,–שגיאה.המנתח לא יצליח לזהותה ויודיע על
4
Top-Downניתוח
(.Sהניתוח מתחיל מהמשתנה התחילי ) •מפעילים רצף של כללי גזירה.•עוצרים כאשר:•
המילה מגיעים למילת הקלט )התוכנית כולה( –בשפה.
המילה )לא ניתן להפעיל אף כלל גזירה( נתקעים–אינה בשפה.
5
דוגמה
+ x = yבקוד המקור: •1
id assign id opאחרי ניתוח לקסיקלי: •num
Top-Down:Eניתוח תחבירי •
id assign id op num
S
6
שימוש בכללS id assign E
טרמינל טרמינל משתנה
דוגמה
+ x = yבקוד המקור: •1
id assign id opאחרי ניתוח לקסיקלי: •num
Top-Down:Eניתוח תחבירי •
EE
id assign id op num
שימוש בכללE E op E
7
S
דוגמה
+ x = yבקוד המקור: •1
id assign id opאחרי ניתוח לקסיקלי: •num
Top-Down:Eניתוח תחבירי •
EE
id assign id op num
E idE num
8
Sשימוש בכללים
Top-Downניתוח
הבעיה העיקרית: איזה כלל להפעיל בכל צעד?•
S
A
A αA β ?
הסיטואציה: •(, Aיודעים איזה משתנה רוצים לגזור )
להשתמש.A כלל של באיזהאבל השאלה היא
9
Recursive Descentשיטת
נכתוב לכל משתנה פונקציה שיודעת הרעיון: •"לגזור" את כל המילים שניתן לקבל ממנו.
נבחר את כלל הגזירה לפי הסדר הבא:•, tכאשר הטרמינל הבא בקלט הוא –
:Aמבין כל הכללים של המשתנה , בחר בו.t יש כלל שמתחיל גם כן ב-Aאם ל-•, בחר בו.משתנה יש כלל יחיד שמתחיל בAאחרת, אם ל-•שגיאה.אחרת, החזר הודעת •
זאת רק דוגמה אפשרית לקביעת סדר שימו לב: •הכללים.
10
Recursive Descent דוגמה -
נתון הדקדוק:•
S aSa | B
B dB | e
דוגמה - המשך} ()S:function Sפונקציה ל"גזירת" המשתנה •
if (lookahead == ‘a’) {// S aSa
match(‘a’);S();match(‘a’);
} else {// S B
B();}
}
12
S aSa | B
B dB | e
משתנה עזר שמחזיקאת הטרמינל הבא
בקלט
function match (token t) {if (lookahead == t)
lookahead = next_token();else
error();}
פונקצית עזר:•
דוגמה - המשךפונקציה ל"גזירת" המשתנה •
B:
function B() {if (lookahead == ‘d’) {
// B dB
match(‘d’); B();} else if (lookahead == ‘e’) {
// B e
match(‘e’);} else
error();} מדוע כאן יש קריאה מפורשת
)( אין?S)( ובפונקציה errorל-13
S aSa | B
B dB | e
RDבעיות בשיטת לא ניתן לטפל בכל הדקדוקים•
( אם יש שני כללים או יותר שמתחילים במשתנה כלשהו.1 טרמינל.אותו( אם יש שני כללים או יותר שמתחילים ב2
המנתח לא שלם - הוא לא מזהה את כל המילים •בשפה
, Sa | Bb, Ba: עבור דקדוק עם כללי הגזירה: דוגמה–”, נשמח אם המנתח יבחר בכלל abעבור מילת קלט “
SBb , וייתקע.Saאבל לצערנו הוא יבחר בכלל
רקורסיה שמאלית תגרום לריצה אינסופית•b.14 , כאשר התו הבא בקלט אינו S Sa | b: דוגמה–
פתרונות אפשרייםשינוי הדקדוק לדקדוק שקול:1.
אם יש שני כללים המתחילים באותו טרמינל ניתן לבטל –A αβ1 | αβ2 | … | αβnרישות משותפות:
A αA’
A’ β1 | β2 | … | βn
ביטול רקורסיה שמאלית:–למדנו בקורס אוטומטים.•
15
A Aα | β
A βB
B αB | α
.RDבחירת שיטה אחרת מאשר 2.
1חסרונות של פתרון
לא מובטח שהבעיות ייפתרו:• במשתנהלא נותן מענה לשני כללים המתחילים –
שונה.
קיבלנו דקדוק "מכוער" ולא אינטואיטיבי.•
16
שיפור מנגנון ההחלטה לבחירת כלל
select: P 2Tנגדיר פונקציה: •קבוצת , איזו P ב כללשמגדירה לכל
)ליטרלים( בקלט יגרמו לבחירת טרמינליםהכלל הזה.
?Aαאז מתי ייבחר הכלל
17
: A tβ [ tT, β)VT(* ]א( אם זהו כלל מהצורה
הוא הטרמינל הבא בקלט:tהכלל ייבחר כאשר S
A
t...
:A Bβ [ BV, β)VT(* ]אם זהו כלל מהצורה ב( יכול לגזור B , מקיים שהמשתנה t( כאשר הטרמינל הבא בקלט - 1
(:B* tαמילה המתחילה בו )כלומר,
, עבור כל משתנה בדקדוק:firstנגדיר פונקצית עזר –
קבוצת הטרמינלים שיכולים להופיע בתחילת
גוזרBמילה ש-t first)B( =
נבחר בכלל הזה כאשר התבנית (: B*ε אפיס )Bאם ) 2 יכולה לגזור מילה המתחילה בטרמינל הבא בקלט βהפסוקית
-t:β)VT(: [ *A גם לתבניות פסוקיות [first– נגדיר
B β
t …
S
ε
AB β
t …
S
18
?Aαמתי ייבחר הכלל
קבוצת הטרמינלים שיכולים להופיע בתחילת
גוזרתβמילה שהתבניתt first)β( =
: (Bβ*ε אפיס )כולואם הכלל (3, יכול tנבחר בכלל הזה כאשר רואים שהטרמינל הבא בקלט -
:Aאחרי להופיע מיד
:, עבור כל משתנה בדקדוק followנגדיר פונקצית עזר נוספת –
כל הטרמינלים שיכולים A להופיע מיד לאחר
בגזירה כלשהיt follow)A( =
AB β
ε t …
C
19
?Aαמתי ייבחר הכלל
:A Bβ [ BV, β)VT(* ]אם זהו כלל מהצורה ב(
הגדרות פורמאליות•First: )VT(* 2T –
גוזרת:αתבנית כל הטרמינלים שיכולים להופיע בתחילת מילה ש
First )α( = { t T | α * tβ }•Follow: V 2T –
:כלשהי בגזירה Aכל הטרמינלים שיכולים להופיע מיד לאחר המשתנה
Follow )A( = { t T{$} | S$ * αAtβ }S( אינו - משתנה תחילי של הדקדוק, $ - סימן סוף קלט.)חלק מאוסף הטרמינלים
α,β )VT(. *
•select: P 2T – לכל כלל בדקדוק, זו קבוצת הטרמינלים )אסימונים( האפשריים שיגרמו לכלל •
: להיבחר, אם האסימון נמצא בראש הקלט כרגע
Select )Aα(=
first)α( follow)A( α * ε
first)α( otherwise 20
firstאלגוריתם לחישוב פונקצית – בודקים אילו משתנים הם אפיסים.0שלב • בדקדוק )X)VT עבור כל סימן first – חישוב 1שלב •
ע"פ האלגוריתם הבא:
אתחול:•first)t( := {t} בצע: tTלכל טרמינל –first)A( := Ø בצע: AVלכל משתנה –
AY1Y2…Ykצעד: כל עוד יש שינויים, לכל כלל • ]Yi )VT( עבורk ≥ i ≥ 1 :בצע ,[
–first)A( := first)A( first)Y1(
, בצע: Y1Y2…Yi -1*ε עבורו i > 1לכל –
first)A( := first)A( first)Yi(
יש כאן תלות מעגלית!: שימו לבהאלגוריתם הוא איטרטיבי
ופועל עד שאין יותר שינויים.
תבנית פסוקית עבור first – חישוב 2שלב •x1x2…xk=α:
כלומר:•–first)x1(איחוד עם ,
–first)x2(-במקרה ש x1אפיס, איחוד עם
–first)x3(-במקרה ש x1-ו x2... אפיסים, איחוד עם
x1x2…xj -1*εfirst)α( := first)xj(
22
firstאלגוריתם לחישוב פונקצית
firstדוגמה - חישוב
נתון דקדוק:•
.S,C,B – המשתנים האפיסים: 0שלב •
S aB | BC | CBdB b | εC c | ε
עבור המשתנים:first - חישוב 1שלב •
C B S
Ø Ø Ø 1
23
] , בצע:k ≥ i ≥ 1עבור )AY1Y2…Yk ]Yi)VTצעד: כל עוד יש שינויים, לכל כלל -first)A( := first)A( first)Y1(
)first)A( := first)A( first)Yi, בצע: Y1Y2…Yi -1 *ε עבורו i > 1- לכל
S aB | BC | CBdB b | εC c | ε
עבור המשתנים:first - חישוב 1שלב •
C B S
Ø Ø Ø 1
{c} {b} {a,d} 2
24
נתון דקדוק:•
.S,C,B – המשתנים האפיסים: 0שלב •
] , בצע:k ≥ i ≥ 1עבור )AY1Y2…Yk ]Yi)VTצעד: כל עוד יש שינויים, לכל כלל -first)A( := first)A( first)Y1(
)first)A( := first)A( first)Yi, בצע: Y1Y2…Yi -1 *ε עבורו i > 1- לכל
firstדוגמה - חישוב
S aB | BC | CBdB b | εC c | ε
עבור המשתנים:first - חישוב 1שלב •
C B S
Ø Ø Ø 1
{c} {b} {a,d} 2
{c} {b} {a,d,b,c} 3
25
נתון דקדוק:•
.S,C,B – המשתנים האפיסים: 0שלב •
firstדוגמה - חישוב
S aB | BC | CBdB b | εC c | ε
עבור המשתנים:first - חישוב 1שלב •
C B S
Ø Ø Ø 1
{c} {b} {a,d} 2
{c} {b} {a,d,b,c} 3
{c} {b} {a,d,b,c} 4
נתון דקדוק:•
.S,C,B – המשתנים האפיסים: 0שלב •
firstדוגמה - חישוב
:אגפי ימין לfirst - חישוב 2שלב •
first)aB( = {a}
first)BC( = first)B(first)C( = {b,c}
first)CBd( = first)C(first)B(first)d( = {c,b,d}
27
S aB | BC | CBdB b | εC c | ε
x1x2…xj-1*ε
first)α( := first)xj(
firstדוגמה - חישוב
followאלגוריתם לחישוב פונקצית
follow)A( = { t T{$} | S$ * αAtβ }רוצים לחשב •
אתחול:•:= {$})S: follow)Sלמשתנה התחילי –A ≠ S: follow)A(:= Øלכל משתנה –
בצע:AVצעד: כל עוד יש שינויים, לכל משתנה •בצע: מופיע איפשהו באגף ימין( A)כל כלל בו בדקדוק Y αAלכל כלל –
•follow)A( := follow)A( first)β()follow)A( := follow)A( follow)Y, בצע גם: β*εואם •
. αAβ, אזי הוא יכול להופיע גם אחרי Y’ יכול להופיע אחרי t[ אם ... ]A’ בעצם יכול להופיע גם אחרי t אפיס, אזי βאבל אם
28
S aB | BC | CBdנתון דקדוק:•B b | εC c | ε
(:לכל משתנה דקדוק )followחישוב •
C B S
Ø Ø {$} 1
29בדקדוק בצע: Y αAלכל כלל
follow)A( := follow)A( first)β()follow)A( := follow)A( follow)Y, בצע גם: β*εואם
followהמשך דוגמה - חישוב
S aB | BC | CBdנתון דקדוק:•B b | εC c | ε
C B S
Ø Ø {$} 1
{b,d,$} {c,$,d} {$} 2
לא מופיעSמשתנה בצד ימין של אף כלל גזירה
SBCמתוך SCBdמתוך
30
(:לכל משתנה דקדוק )followחישוב •
בדקדוק בצע: Y αAלכל כלל follow)A( := follow)A( first)β(
)follow)A( := follow)A( follow)Y, בצע גם: β*εואם
followהמשך דוגמה - חישוב
S aB | BC | CBdנתון דקדוק:•B b | εC c | ε
C B S
Ø Ø {$} 1
{b,d,$} {c,$,d} {$} 2
{b,d,$} {c,$,d} {$} 3
31
(:לכל משתנה דקדוק )followחישוב •
followהמשך דוגמה - חישוב
נתון דקדוק:•
:לכל כלל בדקדוק selectחישוב קבוצת הטרמינלים •:תזכורת–
select)Aα(= first)α( follow)A(α * ε
first)α( otherwise
32
S aB | BC | CBdB b | εC c | ε
selectהמשך דוגמה - חישוב
S aB | BC | CBdB b | εC c | ε
:לכל כלל בדקדוק selectחישוב •
33
selectהמשך דוגמה - חישוב
select)SaB( = first)aB( = {a}select)SBC( = first)BC(follow)S( = {b,c,$}select)SCBd( =select)Bb( =select)Bε( =select)Cc( = select)Cε( =
select)Aα(=
first)α( follow)A( α * ε
first)α( otherwise
S aB | BC | CBdB b | εC c | ε
:לכל כלל בדקדוק selectחישוב •select)SaB( = first)aB( = {a}select)SBC( = first)BC(follow)S( = {b,c,$}select)SCBd( = first)CBd( = {b,c,d}select)Bb( = first)b( = {b}select)Bε( = first)ε)follow)B( = {c,d,$(select)Cc( = first)c( = {c}select)Cε( = first)ε(follow)C( = {b,d,$}
34
selectהמשך דוגמה - חישוב select)Aα(=
first)α( follow)A( α * ε
first)α( otherwise
Recommended