Download - ניתוח לקסיקלי וכלי Lex
Lexניתוח לקסיקלי וכלי
(sakogan@csנכתב ע"י אלכס קוגן )
סמסטר חורף, תשס"ח
מבנה הקומפיילר
תכנית בשפת המקור
ניתוחלקסיקלי
ניתוחתחבירי
ניתוחסמנטי
backend
x = 23;
קומפיילר
)רצף של תווים(
מבנה הקומפיילר
ניתוחלקסיקלי
ניתוחתחבירי
ניתוחסמנטי
backendתכנית
בשפת המקור
x = 23;
רצף אסימונים
id assign num sepx = 23 ;
מבנה הקומפיילר
ניתוחלקסיקלי
ניתוחתחבירי
ניתוחסמנטי
backendתכנית
בשפת המקור
S
id assign E sep
num
עץ גזירה
x = 23;
)העלים של עץ הגזירה הם האסימונים שהתקבלו מהניתוח
הלקסיקלי(
רצף אסימונים
מבנה הקומפיילר
ניתוחלקסיקלי
ניתוחתחבירי
ניתוחסמנטי
backendתכנית
בשפת המקור
האם קיים משתנה ששמו x?
?int מטיפוס x האם
x = 23;
עץ גזירה
מבנה הקומפיילר
ניתוחלקסיקלי
ניתוחתחבירי
ניתוחסמנטי
backendתכנית
בשפת המקור
ייצור קוד בשפת היעד
x = 23;
תפקיד המנתח הלקסיקלי
מחלק את קוד המקור לאסימונים )"מילים"(•
מסנן חלקים שאינם דרושים להמשך הניתוח•למשל: רווחים, ירידות שורה.–?commentsמה עם –
מזהה שגיאות לקסיקליות - מחרוזות שאינן יכולות •להיות אף אסימון
Cלמשל: "@" בשפת –
ניתוחלקסיקלי
ניתוחתחבירי
ניתוחסמנטי
backendתכנית
בשפת המקור
קומפיילר
הגדרות
כטרמינל : יחידה בסיסית המשמשת (tokenאסימון )•בדקדוק שגוזר את שפת התכנות.
: מחרוזת בקלט )קוד המקור( (lexemeלקסמה )•שהמנתח הלקסיקלי התאים לאסימון כלשהו.
המנתח הלקסיקלי - דוגמה
;” :x = size + 29“ניתוח לקסיקלי עבור •
\n ; 29 + size = x
sep num op id assign id
לקסמות
אסימונים
המנתח לא יחזיר אסימון
הגדרות
כטרמינל : יחידה בסיסית המשמשת (tokenאסימון )•בדקדוק שגוזר את שפת התכנות.
: מחרוזת בקלט )קוד המקור( (lexemeלקסמה )•שהמנתח הלקסיקלי התאים לאסימון כלשהו.
: ביטוי רגולרי שמגדיר את (pattern, regexpתבנית )•ההתאמה בין אוסף הלקסמות לאסימון מסוים.
ע"י התבניתnumדוגמה: ניתן להגדיר את האסימון –(0+1+…+9+)
המנתח הלקסיקלי ותכונות סמנטיות
הלקסמות אינן עוברות הלאה לשלבים הבאים בניתוח, אלא רק •האסימונים שנוצרו מהן
המנתח התחבירי אינו צריך את הלקסמות.–המנתח הסמנטי כן צריך מידע עליהן:–
?xהאם קיים משתנה ששמו •איזו פעולה בדיוק הופעלה?•
לטובת העברת המידע על הלקסמות, המנתח הלקסיקלי •מחשב לכל אסימון תכונות סמנטיות:
–id {name = “x”}–op {type = “+”}
התכונות הסמנטיות ידונו בהרחבה בהמשך.•
Lexכלי
מנתחים לקסיקליים.לייצורכלי •צורת הפעלה:•
הגדרת מנתח לקסיקל
י)קובץ טקסט(
lexקוד של המנתח
(lex.yy.c)
מנתח לקסיקל
י
gcc
Flexבקורס נעבוד עם כלי תואם •
Lexבניית מנתח לקסיקלי בעזרת
( source.lex(עריכת קובץ הגדרת המנתח )1בקובץ טקסט.
flex source.lex(הרצת הפקודה 2lex.yy.c בשם Cהפלט המתקבל: קובץ –
לטובת ייצור gcc –ll lex.yy.c(הרצת הפקודה3קובץ ההרצה.
הגדרת מנתח לקסיקל
י
lexקוד של המנתח
מנתח לקסיקל
י
gcc
מבנה קובץ הגדרות המנתח
קובץ הגדרות הוא קובץ טקסט המורכב •משלושה חלקים המופרדים בעזרת שורות
המכילות "%%" בלבד:
Definition section %%Rules section %%C code section
דוגמה למבנה קובץ הגדרות המנתח
Definitionssection
דוגמה למבנה קובץ הגדרות המנתח
Rules section
דוגמה למבנה קובץ הגדרות המנתח
C code section
דוגמה למבנה קובץ הגדרות המנתח
Cהגדרות של שפת -
קוד זה מועתק כפי שהוא לתחילת קובץ
מייצר.flex ש-Cה-אופציות השולטות עלצורת העבודה של
Flex הגדרת מקרואים(macros)
בעזרת ביטויים רגולריים
)לשימוש בחלק הבא(
Definitions section
Lexביטויים רגולריים של
ביטוי רגולרי של
Lex
ביטוי רגולרי "רגיל"
משמעות
a a aהתו . Σ \ {\n} כל תו פרט לירידת שורה
[xyz][a-z]
x+y+za+b+c+…+z
אחד מהתווים שבתוך הסוגריים
r*r+
r*r+
-ים rמספר כלשהו של כולל אפס / לא כולל אפס
דוגמאות נוספות ניתן למצוא באתר הקורס
Rules sectionהגדרות של
אסימונים ופעולות צריך לבצעLexש-
בעת זיהוי שלהם
דוגמה למבנה קובץ הגדרות המנתח
C code sectionהגדרות פונקציות
שהוכרזו בחלק ראשון
משתנים גלובלייםLexשל
דוגמה למבנה קובץ הגדרות המנתח
Lexמשתנים גלובליים של
שם טיפוס משמעותyytext char* הטקסט של הלקסמה האחרונה
שזוהתה
yyleng int אורך הלקסמה האחרונה שזוהתה
yylineno int השורה הנוכחית בקלט
yylval user defined
משמש לתקשורת עם המנתח (7התחבירי )פרטים בתרגול מספר
בונהLexתכונות המנתח הלקסיקלי ש-
.stdout וכותב פלט ל-stdinקורא קלט מ-• )נמצאת בקובץ yylexרוב העבודה נעשית בפונקציה •
lex.yy.c שנוצר ע"י flex:שתפקידה )לקרוא את הקלט.–לזהות אסימונים.–לבצע את הפעולה המתאימה לאסימון )ע"פ קובץ ההגדרות(.–
•yylex:חוזרת רק כאשר בפעולה של אסימון.returnהמשתמש כתב –
אומגיעה לסוף הקלט.–
טיפול בשגיאות ניתוח
שגיאת ניתוח נוצרת כאשר בנקודה מסוימת •yylex.לא מצליחה לזהות אף אסימון
במקרה כזה, פעולת ברירת המחדל היא •העתקת התו הנוכחי לפלט. הניסיון להתאמת
אסימונים ימשיך מהתו הבא.דוגמה:•
abc$178idמזוהה כ-
לא מזוהה ולכן מודפס לפלט
numמזוהה כ-
טיפול בשגיאות ניתוח )המשך(
כדי לשנות את ברירת המחדל לטיפול בשגיאה, •ניתן להשתמש באסימון הנקודה ).( בתור
.Rules sectionאסימון אחרון ב כפי שנעשה בדוגמה: –
פתרון קונפליקטים
קונפליקט נוצר כאשר אותו קלט יכול להתאים •למספר אסימונים.
דוגמה: נניח שמוגדרים האסימונים הבאים:•
for “for”
id [a-z]+מחרוזות שיגרמו לקונפליקט ניתוחים אפשריים
abcford
for
פתרון קונפליקטים
קונפליקט נוצר כאשר אותו קלט יכול להתאים •למספר אסימונים.
דוגמה: נניח שמוגדרים האסימונים הבאים:•
for “for”
id [a-z]+מחרוזות שיגרמו לקונפליקט ניתוחים אפשריים
abc a, ab, abcford for, ford, f, fo
for for )id( / for )for(
הכללים לפתרון הקונפליקט
המנתח חמדן – תמיד מעדיף את הלקסמה 1. שניתן לבחור.הארוכה ביותר
( לא פתר את הקונפליקט, בוחרים 1אם כלל )2.באסימון בעל עדיפות גבוהה יותר:
האסימון הראשון שמופיע בקובץ ההגדרות •)העליון ביותר המתאים ללקסמה(.
פתרון הדוגמה
מחרוזות שיגרמו לקונפליקט
ניתוחים אפשריים הניתוח שייבחר
לפי כלל
abc a, ab, abcford for, ford, f, fofor for )id( / for )for(
נניח שמוגדרים האסימונים הבאים:•
for “for”
id [a-z]+
abc 1
for )for( 2
ford 1
הכללים לפתרון קונפליקט
בחירת הלקסמה הארוכה 1.ביותר.
( לא פתר - בחירת 1אם כלל )2.אסימון בעל עדיפות גבוהה
יותר.
מקורות נוספים
ניתן למצוא באתר Lexדוגמאות לשימוש ב-•הקורס
ועל ביטויים Lexאינפורמציה נוספת על •רגולריים:
–man lex–man –s 5 regexp
:Flexאתר הבית של כלי •http://flex.sourceforge.net