ניתוח תחבירי top-down

Post on 06-Jan-2016

102 Views

Category:

Documents

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

ניתוח תחבירי Top-Down. נכתב ע"י אלכס קוגן ( (sakogan@cs סמסטר חורף, תשס"ח. backend. ניתוח סמנטי. ניתוח תחבירי. ניתוח לקסיקלי. תזכורת מתרגול אחרון. ראינו מהו המבנה הסכמתי של קומפיילר לקסמות, אסימונים, וביטויים רגולריים. דנו בתכונות המנתח הלקסיקלי. ראינו את הכלי Flex. ניתוח תחבירי. - PowerPoint PPT Presentation

TRANSCRIPT

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

top related