Upload
guy-ingram
View
96
Download
1
Embed Size (px)
DESCRIPTION
תרגול 7 – בניית מנתח תחבירי באמצעות כלי bison. bison. b ison הוא כלי אוטומטי לייצור מהדרים. קלט: קובץ מקור בשפת bison המגדיר את סכימת התרגום. פלט: מתרגם הפועל ע"פ סכימת התרגום. ניתוח תחבירי: בשיטת LALR (+הרחבה לפתרון קונפליקטים). ניתוח לקסיקלי: ע"י פונקציה שהוגדרה מראש. - PowerPoint PPT Presentation
Citation preview
1
מנתח – 7תרגול בניית
כלי באמצעות תחבירי
bison
2
bison
•bison. מהדרים לייצור אוטומטי כלי הואקלט:–
בשפת • מקור סכימת bisonקובץ את המגדירהתרגום.
פלט:–•. " התרגום סכימת פ ע הפועל מתרגם• : בשיטת תחבירי לפתרון )+ LALRניתוח הרחבה
קונפליקטים(.• . " : מראש שהוגדרה פונקציה י ע לקסיקלי ניתוח
– " כלי י ע מסופקת להיות .Lex (yylex)יכולה
3
ב השימוש Lexבעזרת bisonסכימתהמגדיר מקור קובץ
המנתח אתהלקסיקלי
(source.lex)
flexהכלי את Cקובץ המגדיר
הלקסיקלי המנתח(lex.yy.c)
המגדיר מקור קובץהמתרגם את
(source.ypp)bisonהכלי
++ Cקובץ את המגדירהמתרגם
(source.tab.cpp)
הגדרות קובץלשניהם משותף
(source.hpp)
g++
הרצה קובץשל
המתרגם (a.out)
4
ידי על הנוצר bisonהמנתח•: הבאות הפונקציות את מכיל
–yylex . הלקסיקלי)( : הניתוח פונקציית
• " כלי י ע .Lexנוצרת
–yyparse. הראשית)(: התחבירי הניתוח פונקציית
• " י ע אוטומטית .bisonנוצרת
או 0מחזירה • בהצלחה הסתיים הניתוח .1אם אחרת
–yyerror :)(ש .yyparseפונקציה שגיאה שמתגלית פעם בכל לה קוראת
•. " בשגיאות בעצמו לטפל מ ע אותה לדרוס יכול המשתמש
• , מהפונקציה לבצע yyparseבחזרה נכשלת. error recoveryמנסה היא אם
תחזיר- .1בכך
–main :)(ל קריאה היא העיקרית .yyparseמטרתה•. המנתח של מיוחדת סיום ופעולת איתחולים לשם לנצלה ניתן
5
של הקלט קובץ bisonמבנה
מודגשות ) • להופיע חייבות החלקים בין המפרידות השורות שתי
.) תחתון בקו
, 3חלק • מחלק לקרוא ניתן להן עזר שגרות עבור .2מיועד
6
של הקלט קובץ bisonמבנה
בחלק • המופיעות השגרות בחלק 3על להכריז - בין 1יש ל%}
. }%
בחלק • הרשום - %{ ) 1ובחלק 3כל בשפת %} כתוב ל ++( Cבין " י ע שנוצר המקור לקובץ שהוא כמו .bisonמועתק
7
בין -flexקישור bisonל bison- " ל קריאה י ע הלקסיקלי המנתח את .yylexמפעיל
- ש האסימונים בין לתאם -flexצריך ש האסימונים לבין bisonמייצרקורא.
הגדרות ) ( headerקובץsource.tab.hpp
המגדיר מקור קובץהמנתח אתהלקסיקלי
(source.lex)
flexהכלי את Cקובץ המגדיר
הלקסיקלי המנתח(lex.yy.c)
המגדיר מקור קובץהמתרגם את
(source.ypp)bisonהכלי
++ Cקובץ את המגדירהמתרגם
(source.tab.cpp)
הגדרות קובץלשניהם משותף
(source.hpp)
g++
הרצה קובץשל
המתרגם (a.out)
8
Bison: %token NUMBER
Lex: [0-9]+ {yylval.value=atoi(yytext)
return NUMBER; }
בין -flexקישור bisonל bison- " ל קריאה י ע הלקסיקלי המנתח את .yylexמפעיל
- ש האסימונים בין לתאם -flexצריך ש האסימונים לבין bisonמייצרקורא.
ה • בקובץ שהוגדרו האסימונים ב bisonכל שנוצר headerיופיעו
הכלי" ) י (.source.tab.hppע
ה • הגדרות לצרוך )Lexקובץ הקובץ( includeצריך את
source.tab.hpp. התיאום את ליצור מנת על
9
של • המבט :bisonמנקודתהפונקציה – של קיומה את .yylexמניח
האסימונים • לאחד המתאים קבוע פעם בכל מחזירה% " י ע .tokenשהוגדרו
של • המבט :Lexמנקודתב – שהוגדרה מחרוזת " %bisonכל י מתורגמת token Xע
ב .source.tab.hppלקבועהקבוע – המזהה את המחזיר לקסיקלי יחזיר, Xמנתח
, יפורש ולכן ההגדרות בקובץ שמוגדר הקבוע אותו אתכאסימון" התחבירי המנתח י .Xע
בין -flexקישור bisonל
10
Bison: %token NUMBER
Lex: [0-9]+ {yylval.value=atoi(yytext)
return NUMBER; }
•yylval מטיפוס גלובלי משתנה הוא YYSTYPEהוא גם המוגדר
. source.tab.hppבקובץ
•. שנקרא האחרון האסימון של הסמנטיות התכונות את מכיל
לטיפוס • המחדל .intהיא YYSTYPEברירת
את • להגדיר המשותף YYSTYPEניתן ההגדרות בקובץ עצמאית
.bisonול Lexל
בין -flexקישור bisonל
11
ב סמנטיות bisonתכונות
הן • הדקדוק משתני כל של כולן התכונותהטיפוס .YYSTYPE – מאותו
הגלובלי – המשתנה של הטיפוס גם .yylvalזהוהגדרת – את לדרוס להגדיר YYSTYPEניתן מנת על
: . למשל שונים טיפוסים בעלות תכונות
12
הגזירה – כללי חוקים
13
הגזירה – כללי חוקים
•: הבאה בצורה ירשם חוק
של – התחילי המשתנה הוא הראשון החוק של שמאל באגף המשתנההדקדוק.
•: וטרמינלים משתנים של הסמנטיות לתכונות גישה–. החוק - של שמאל באגף המופיע המשתנה תכונות $$
–n$ - (n>0)- ה הסימן חוקים ) nתכונות כולל החוק של ימין באגףסמנטיים(.
ו – $$n מטיפוס משתנים הם $YYSTYPE.
A B C NUM ‘d’ E
$$ $1 $2 $3 $4 $5 הסימןA B C NUM d E מתייחס
ל-
14
ב מנת unionשימוש עלשונות תכונות להגדיר
שונים טיפוסים עבור
15
16
17
18
עם bisonעבודה
• bison –d source.ypp• flex source.lex• g++ source.tab.cpp lex.yy.c
• bison –v source.ypp
קבצי tab.h, tab.cppמייצר
קובץ lex.yy.cמייצר
הרצה קובץ מייצר
קובץ עם source.outputמייצרוטבלת האוטומט מצבי
המעברים.
מנת על זאת באפשרות להשתמש ניתן , במידה הקונפליקטים את לראות
וקיימים.
19
מרקרים - חוקים
X
, εחוקי " למשל ריק חוק י ע | ;A : B Cנכתבים
20
משמעיים רב בדקדוקים טיפול• " דו דקדוק י ע המתוארים תכנות בשפות אלמנטים ישנם
משמעי. –: וכפל, חיבור עם אריתמטיים ביטויים לדוגמא
הקלט – מילת על למשל משמעי דו הוא זה ”. 3*1+2“דקדוקהרישא “ את קרא שהמנתח :2ישנן” 1+2לאחר התנהגויות
ובצע, shiftבצע 1. הקלט את לקרוא " reduceהמשך פ ע בסופו . השלישי הכלל
לפירוש • (3*2+)1מתאים
. reduceבצע 2. " הראשון הכלל פ עלפירוש )• 3(*1+2מתאים
21
משמעיים רב בדקדוקים טיפול–: הדקדוק עבור האוטומט של חלקי ציור
הטרמינל – עבור קונפליקט ישנו המסומן *.במצבהטרמינל, +. – עבור גם קונפליקט ישנו בנוסף
המחרוזת “• של הפירושים לשני ”:1+2+3מתאים(.2+3+)1או 3(+1+2)– , כן(. ) חיסור עבור אבל משנה לא זה חיבור עבור
22
אופרטורים קדימות• : לחיבור כפל בין לקונפליקט :3(*1+2לעומת( )3*2+)1פתרון
ל – לציין לאסימון * + .bisonניתן מאשר גדולה עדיפות יש שלאסימון
– . " ההגדרות בקובץ אסימונים על ההכרזה סדר י ע מבוצע
•. , אחרון יוכרז ביותר הגבוהה העדיפות בעל האסימון
–bison לכל עדיפות גזירה מגדיר .כלל•. בכלל המופיע האחרון האסימון עדיפות היא המחדל ברירת
•% " ב שימוש י ע מפורש באופן עדיפות לציין הוא tכאשר prec tניתןאסימון ) להוסיף ניתן לכלל לתת רוצים עדיפותו שאת האסימון
.) זו למטרה חדש%token '+'%token '*'%%E: E '+' E {…} | E '*' E {…} ;
23
אופרטורים קדימות• : לחיבור כפל בין לקונפליקט :3(*1+2לעומת( )3*2+)1פתרון
קונפליקט bisonכאשר – עבור shift/reduce: shiftמוצאמול tטרמינל כלל reduceאל ,Aαעם
לטרמינל shiftיבוצע • מלכלל tאם גדולה .Aαעדיפות
.reduceיבוצע • לטרמינל מאשר גבוהה עדיפות לכלל אם
•. נפתר לא הקונפליקט אחרת
– , ה, לטובת ייפתר זה קונפליקט הבעייתי במצב shiftבדוגמאלכלל * מאשר גדולה עדיפות ולאסימון .EE+Eמכיוון
•. הראשונה הפרשנות '+' token%התקבלה%token '*'%%E: E '+' E {…} | E '*' E {…} ;
ב להשתמש היה צריך זו בדוגמא למעשה%nonassoc% ב לקבל tokenבמקום כדי
קדימות. . בהמשך כך על נדבר
24
משמעיים רב בדקדוקים טיפול
הטרמינל +– עבור הקונפליקט על מתגברים כיצד כעת נראה
25
אסוציאטיביותהטרמינל + : • עבור לקונפליקט פתרון
:3(+1+2לעומת( )2+3+)1אותה '+' – ולאסימון מאחר עדיפות בעזרת להכריע ניתן לא
לכלל כמו .EE+Eהעדיפות–. שמאלית '+' אסוציאטיביות כבעל האסימון את להגדיר ניתן
עם %• עם %leftיוכרז tokenבמקום
%left '+'%token '*'%%E: E '+' E {…} | E '*' E {…} ;
26
אסוציאטיביותהטרמינל + : • עבור לקונפליקט פתרון
:3(+1+2לעומת( )2+3+)1קונפליקט – , S/Rכאשר קדימויות בעזרת נפתר יכריע bisonאינו
: הבא באופןה • יועדף שמאלית אסוציאטיביות לאסימון .reduceאם• , ה יועדף ימנית אסוציאטיביות לאסימון .shiftאם
ה – יועדף שלנו .reduceבמקרה השנייה הפרשנות את ונקבל
%left '+'%token '*'%%E: E '+' E {…} | E '*' E {…} ;
27
אסוציאטיביותעם: • שהוכרזו אסימונים עבור רק מוגדרת עדיפות הערה
" י, ע שהוגדרו אסימונים עבור לא אסוציאטיביות%token.ב %– להשתמש עדיפות nonassocניתן עם אסימון להגדיר כדי
. אסוציאטיביות לו שאין
נרצה: • מתמטיים אופרטורים לאילו שאלה? ימנית אסוציאטיביות
– : החזקה- אופרטור a^b^cלמשל
28
משמעיים רב בדקדוקים טיפולקונפליקט • :shift/reduceסיכום
עדיפות – הגזירה לכלל עדיפות rאם הקלט :tולטרמינל.reduceיבוצע r>tאם •.shiftיבוצע r<tאם •" ) r=tאם • זהה הכלל של האסוציאטיביות פ ע תיקבע הפעולה
:) הטרמינל לאסוציאטיביותשמאלית – .reduceיבוצע אסוציאטיביותימנית – .shiftיבוצע אסוציאטיביותמוגדרת – אינה שגיאה.אסוציאטיביות
:reduce/reduceקונפליקט •של – המחדל ברירת הגזירה bisonהתנהגות בכלל לבחור היא
. בדקדוק קודם שהופיע
–. זה קונפליקט עם שיתמודד כך הדקדוק את לשנות מומלץ
29
שורה ) כל הבאים מהקלטים אחד כל עבור התוכנית פלט יהיה מה כתבושורה ירידת בסימן ’(:n‘\מסתיימת
1. cbdbc2. cadbc3. caddc4. cadac
ממבחן שאלהה תוכנית :bisonנתונה הבאה
30
2שאלה ה קובץ את כתב (:grammar.yהבא )bisonסטודנט
. פעולות שתי הסטודנט הוסיף כך אחר שגיאות או אזהרות ללא התקמפל הקובץסמנטיות:
. תחתון בקו מודגשים שהתווספו החלקיםבעזרת לקמפל מנסה הסטודנט כאשר :bisonכעת השגיאה , מתקבלת
. השגיאה מקור את הסבירו