Upload
shani
View
63
Download
0
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
סמנטיים טיפוסים הגדרת
15
Lexקובץ
16
Bisonקובץ
17
המשך - Bisonקובץ
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כעת השגיאה , מתקבלת
. השגיאה מקור את הסבירו