1 / 62

פרק 3 ניתוח לקסיקאלי

פרק 3 ניתוח לקסיקאלי. ניתוח ( analysis ). מנתח לקסיקאלי lexical analyser. מנתח תחביר syntax analyser. מנתח משמעות semantic analyser. מייצר קוד ביניים intermediate code generator. מייעל קוד code optimizer. חיבור ( synthesis ).

zena
Download Presentation

פרק 3 ניתוח לקסיקאלי

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. פרק 3 ניתוח לקסיקאלי תורת הקומפילציה

  2. ניתוח (analysis) מנתח לקסיקאלי lexical analyser מנתח תחבירsyntax analyser מנתח משמעות semantic analyser מייצר קוד בינייםintermediate code generator מייעל קוד code optimizer חיבור (synthesis) מייצר קוד code generator ניתוח לקסיקאלי מנתח לקסיקאלי lexical analyser תורת הקומפילציה

  3. ניתוח לקסיקאלי ─ מטרה • קריאת זרם התווים בקלט • חלוקה לתמניות (tokens) • סילוק תווים לבנים (רווח, ליווח (tab), סוף שורה) • סילוק הערות (comments) • בניית טבלת סמלים • שמירת הקלט (שם הקובץ, מספר השורה, הטקסט עצמו) לצורך יצירת הודעות שגיאה • הדפסת התוכנית עם הודעות השגיאה משובצות בה תורת הקומפילציה

  4. “if” L(LD)* D+ “<=“ מנתח לקסיקאלי ניתוח לקסיקאלי ─ שיטה • תיאור המלים בשפה באמצעות ביטויים רגולריים • פירוק זרם התווים בקלט ובניית התמניות ע"י הפעלת אלגוריתמים להתאמת תבניות (pattern matching) if ( id relation num ) if ( alpha33 <= 17 ) תורת הקומפילציה

  5. תמנית מנתח לקסיקאלי מנתח תחביר תוכנית המקור דרישה לתמנית הבאה טבלת סמלים יחסי גומליןמנתח לקסיקאלי − מנתח תחביר תורת הקומפילציה

  6. יחסי גומלין ─ המשך המנתח הלקסיקאלי פועל כתת-שגרה (subroutine) או כשגרה מצוותת (coroutine) של מנתח התחביר תת שגרהמנתח התחביר מפעיל את המנתח הלקסיקאלי (ע"י קריאה לתת שגרה) בכל פעם שדרושה לו תמנית נוספת שגרה מצוותת • המנתח הלקסיקאלי ומנתח התחביר עובדים במקביל (בשני תהליכים) ומתקיימים ביניהם יחסי יצרן-צרכן (producer-consumer) • המנתח הלקסיקאלי מייצר תמניות ומכניס אותן לחוצץ • המנתח התחביר מוציא תמניות מתוך החוצץ תורת הקומפילציה

  7. מנתח לקסיקאלי(Lexical Analyser)וסורק (Scanner) • יש מהדרים בהם השלב מתחלק לשני תת-שלבים: • סריקה (scanning)─ הוצאת תווים לבנים, הערות וכד' • ניתוח לקסיקאלי (lexical analysis)─ יצירת התמניות • יש מהדרים בהם לא נעשית הפרדה כזאת, ואזי הסורק והמנתח הלקסיקאלי חד המה אלא אם נדגיש אחרת, עבורנו: סורק  מנתח לקסיקאלי תורת הקומפילציה

  8. מדוע להפריד את המנתח הלקסיקאלי ממנתח התחביר ? • תכנון פשוט יותר של המהדר • מאפשר תיאור השפה בשתי רמות: • המלים ─ באמצעות ביטויים רגולריים • המשפטים ─ באמצעות דקדוק חסר הקשר • מפשט את שני השלבים • למשל, סילוק התווים הלבנים וההערות מפשט בהרבה את דקדוק השפה • המהדר המתקבל יעיל יותר • חלוקת התפקידים מאפשרת הפעלת אלגוריתמים יעילים לכל שלב • ניידות (portability) המהדר גדלה • למנתח התחביר אין תלות באמצעי הקלט, קוד התווים, וכד' תורת הקומפילציה

  9. תבנית, יחידה לקסיקאלית ותמנית • תבנית (pattern)─ ביטוי רגולרי המייצג את כל תת-המחרוזות המיוצגות ע"י תמנית מסוימת • יחידה לקסיקאלית (lexeme)─ תת-מחרוזת מסוימת המתאימה לתבנית והמיוצגת ע"י תמנית • תמנית (token)─ הישות המייצגת סוג מסוים של מלה בתחביר השפה והמהווה טרמינל (terminal) בדקדוק השפה תורת הקומפילציה

  10. תבנית, יחידה לקסיקאלית ותמניתדוגמאות תורת הקומפילציה

  11. דוגמאות מקובלות לתמניות ברוב שפות התכנות: • מלות מפתח (keywords) • אופרטורים • מזהים (identifiers) • קבועים (constants) • מחרוזות (literal strings) • סימני פיסוק (punctuation symbols) תורת הקומפילציה

  12. קשיים בניתוח לקסיקאלי Fortran ב-Fortran(וב-Algol 68) אין חשיבות לרווחים (אלא בתוך מחרוזת), ניתן להוסיף רווחים אפילו באמצע שמות משתנים עד שמגיעים לסימן המפריד בין 1 ו-2 (פסיק או נקודה) לא ניתן לדעת מה זרם התמניות הנוצר תורת הקומפילציה

  13. IF THEN THEN THEN = ELSE ; ELSE ELSE = THEN ; IF THEN THEN THEN = ELSE ; ELSE ELSE = THEN ; keyword keyword operator punctuation id id id id id keyword operator punctuation קשיים בניתוח לקסיקאלי − 2 PL/1 ב-PL/1 מלות המפתח אינן מלים שמורות תורת הקומפילציה

  14. תכונות (Attributies) • התמניות עצמן משמשות לצורך קבלת החלטות בניתוח התחביר ובפריסה • כאשר יש יותר ממחרוזת קלט אחת המתאימה לתמנית מסוימת יש לשמור מידע נוסף לגבי התמנית לצורך יצירת התרגום • מזהה (identifier)─ שם המשתנה • מספר (number)─ הערך המספרי • יחס (relation)─ האופרטור הספציפי • ובאופן כללי─ מחרוזת הקלט (ה-lexeme) שיצרה את התמנית תורת הקומפילציה

  15. שגיאות לקסיקאליות • מעט שגיאות ניתנות לגילוי ע"י המנתח הלקסיקאלי • רוב השגיאות תתגלנה ע"י מנתח התחביר • המנתח הלקסיקאלי ימצא שגיאה כאשר הרישא של הקלט שלרשותו איננו תואם שום תבנית • טיפול בשגיאות לקסיקאליות • דילוג על הקלט עד שניתן למצוא תמנית בנויה היטב • מחיקת תווים מיותרים • הוספת תווים חסרים • החלפת תווים שגויים • הפיכת סדר תווים סמוכים תורת הקומפילציה

  16. תיקון שגיאות לקסיקאליות • לתוכנית יש k שגיאות אם ע"י k פעולות כנ"ל ניתן לייצר ממנה תוכנית ללא שגיאות, ואם זהו ה-k המינימלי • ישנם מהדרים המבצעים פעולות תיקון ומוציאים את התוכנית הנכונה הקרובה ביותר לתוכנית הקלט השגויה • אולם, זהו תהליך יקר ומסובך ואיננו בשימוש בד"כ תורת הקומפילציה

  17. מחרוזות • תו (character)─ סימן כלשהו • אלף-בית (alphabet)─ קבוצה (סופית) של תווים, מסומן ע"י Σ • דוגמאות: {0,1}, {A−Z}, ASCII, UNICODE • מחרוזת (string)─ סדרה סופית של תווים מתוך אלף-בית נתון • המחרוזת הריקה (empty string)─ סדרה של 0 תווים, מסומנת ע"י ε תורת הקומפילציה

  18. מחרוזות − 2 • רישא (prefix)─ מחרוזת המתקבלת ממחיקת (0 או יותר) תווים מסופה של מחרוזת נתונה • סיפא (suffix)─ מחרוזת המתקבלת ממחיקת (0 או יותר) תווים מתחילתה של מחרוזת נתונה • תת-מחרוזת (substring)─ מחרוזת המתקבלת ממחיקת(0 או יותר) תווים מתחילתה ו/או מסופה של מחרוזת נתונה • רישא, סיפא או תת-מחרוזת אמיתית (proper)─ כאשר מספר התווים הנמחקים גדול מ-0, והמחרוזת הנוצרת איננה ריקה • תת סדרה (subsequeue)─ מחרוזת הנוצרת ממחיקת(0 או יותר) תווים שאינם בהכרח סמוכים במחרוזת נתונה תורת הקומפילציה

  19. שפה (Language) שפה (language)─ אוסף (לאו דווקא סופי) של מחרוזות מעל אלף-בית מסוים • שפות טריוויאליות: • השפה הריקה ─ • השפה בה רק המחרוזת הריקה ─ { ε } • השפה המלאה ─Σ* • שפות מורכבות: • כל תוכניות C החוקיות • כל המשפטים התקניים בעברית תנ"כית AaBbCc תורת הקומפילציה

  20. שרשור (Concatenation) כאשר x ו-y הינן שתי מחרוזותאזי xy הינה מחרוזת השרשור שלהן דוגמה: x = sub y = string xy= substring האיבר האדיש: ε הינו האיבר האדיש של פעולת השרשור  L : s  L : s = εs = sε תורת הקומפילציה

  21. חזקה (Exponential) נדמיין כי פעולת השרשור היא כעין פעולת כפל של מחרוזות ואזי נוכל לרשום: ss = s2 נגדיר פעולת חזקה (exponentiation): s0 = ε si = ssi-1 = si-1si > 0 דוגמאות: s0 = ε s1 = ss0 = sε = s s2 = ss1 = ss ss3 = ss2 = sss תורת הקומפילציה

  22. פעולות על שפות תורת הקומפילציה

  23. פעולות על שפות – דוגמה = { A–Z, a–z, 0–9 }― האלף-בית L = { A–Z, a–z}―שפה של מחרוזות אותיות באורך 1 D = { 0–9}―שפה של מחרוזות ספרות באורך 1 LD― קבוצת המחרוזות המורכבות מאות או ספרה בודדת LD― קבוצת המחרוזות המורכבות מאות שאחריה ספרה L4― קבוצת המחרוזות של 4 אותיות L― קבוצת המחרוזות באורך כלשהו של אותיות ( ε L) L(LD)― קבוצת המחרוזות של אותיות או ספרות המתחילות באות D+― קבוצת המחרוזות באורך חיובי של ספרות ( ε D+) תורת הקומפילציה

  24. ביטוי רגולרי (Regular Expression) • מוגדר מעל אלף-בית מסוים . • משמש להגדרת שפה (ברמה לקסיקאלית). • שפה המוגדרת ע"י ביטוי רגולרי נקראת קבוצה רגולרית (regular set). • נסמן ב-L(r) את השפה המוגדרת ע"י הביטוי הרגולריr. • אם L(s) = L(r) אזי r ו-s הינם שקולים. נרשוםs = r. תורת הקומפילציה

  25. ביטוים רגולרים ─ הגדרה תורת הקומפילציה

  26. ביטויים רגולרים סדרי קדימויות • קדימות הפעילות מהגבוהה לנמוכה • האופרטור * באסוציאטיביות שמאלית • שרשור באסוציאטיביות שמאלית • האופרטור | באסוציאטיביות שמאלית • ניתן לוותר על סוגריים "מיותרים" a | b * c = ( a) | ((b) * (c)) תורת הקומפילציה

  27. ביטוים רגולרים ─ דוגמאות • a | b─ הקבוצה { a , b } • (a | b) (a | b)=aa | ab | ba | bb─ הקבוצה { aa, ab, ba, bb } • a* ─ הקבוצה{ ε, a, aa, aaa, ... } • (a | b)*=(a*b*)*─ הקבוצה של מחרוזות באורך כלשהו (אפילו 0) המורכבות מהתווים a ו-b • a | a*b─ הקבוצה { a, b, ab, aab, aaab, ... } תורת הקומפילציה

  28. ביטוים רגולרים ─ אלגברה תורת הקומפילציה

  29. הגדרה רגולרית(Regular Definition) • לצורכי קיצור ניתן שמות לביטוים רגולרים d r • הגדרה רגולרית (regular definition)─ סדרת הגדרות מהצורה d1  r1 d2  r2 . . . dn  rn כאשר ברישום rk מותר להשתמש בשמות di עבורi < k • המשמעות היא הצבה: dk   di   dk   ( ri ) תורת הקומפילציה

  30. הגדרה רגולרית ─ דוגמאות מזהים: letterA|B|...|Z|a|b| ... |z digit0|1| ... |9 idletter(letter |digit)* מספרים: digit0|1| ... |9 digitsdigit |digit * opt_fraction .digits| ε opt_exponent (E(+|−|ε)digit)|ε numberdigits opt_fraction opt_exponent תורת הקומפילציה

  31. קיצורי תרשומת • ( r )+― חזרה אחת או יותר על r L( r+ )= ( L(r) ) + r+=r r* r* = r+ | ε • ( r ) ?― אפס חזרות או חזרה בודדת על r L( (r)? ) =L(r)  { ε } • הקדימות והאסוציאטיביות של פעולות + ו-? הן כשל פעולת * • [ abc ]―מחלקת תווים (character class) L( [ abc ] ) = L( a | b | c ) • [ a−z ]―תחום תווים (character range) L( [ a − z ] ) = L ( [ abc ... z ] ) תורת הקומפילציה

  32. קיצורי תרשומת ─ דוגמה digit [ 0−9] digitsdigit + opt_fraction(.digits ) ? opt_exponent (E(+|−)?digit )? numberdigits opt_fraction opt_exponent תורת הקומפילציה

  33. מגבלות ביטויים רגולרים • השפהL = { aibai }איננה רגולרית אם כי ניתן לתאר אותה באמצעות דקדוק חסר הקשר • באופן דומה, בדיקת התאמת סוגריים במשפט • השפהL = { wcw | w = (a | b)* }איננה רגולריתואיננה ניתנת לתיאור באמצעות דקדוק חסר הקשר תורת הקומפילציה

  34. דוגמה להמשך – דקדוק stmtifexprthenstmt | ifexprthen stmt elsestmt | ε expr  termrelopterm | term term  id | num תורת הקומפילציה

  35. דוגמה להמשך – תמניות if if then  then else else relop  < | <= | = | <> | >= | > id letter ( letter | digit )* num  digit+ (.digit+ )? (E (+ | −)?digit+ )? letter [ A−Za−z_ ] digit  [ 0−9 ] ws delim+ delim  blank | tab | newline תורת הקומפילציה

  36. זיהוי תמניות המטרה:בניית מנתח לקסיקאלי שיקרא את הקלט וינתח אותו באופן הבא: תורת הקומפילציה

  37. start > =  0 6 7 8 other דיאגרמת מעבר(Transition Diagram) • גרף מכוון • צמתים (מסומנים בעיגול וממוספרים) ─ מסמנים מצבים • מצב התחלה (start state)─ מסומן ע"י חץ נכנס • מצבים פנימיים • מצבים מקבלים (accepting states)─ מסומנים ע"י עיגול כפול • קשתות (מסומנות בחץ) ─ מסמנות מעברים • כל קשת נושאת תווים המסמנת את תווי הקלט המאפשרים מעבר בקשת • otherמסמן תווים שונים משל שאר הקשתות של מצב מסוים • צומת מסומן ב- מסמן שיש להחזיר תו לקלט תורת הקומפילציה

  38. דיאגרמת מעבר ─ 2 • ליד חלק מהמצבים המקבלים מסומנת תווית המציינת את התמנית שהמצב מקבל • מצב מקבל שאין לידו תווית איננו מייצר תמנית אלא מייצג קלט ה"נבלע" בשקט ע"י המנתח הלקסיקאלי (תווים לבנים, הערות, וכד') • דיאגרמה תיקרא דטרמיניסטית אם אין שתי קשתות היוצאות מאותו מצב ואשר התוויות שלהן מכילות תווים משותפים • הדילמות של מלות מפתח: • האם הן מלים שמורות • כיצד לזהות ולהבדיל בין מלת מפתח ובין מזהה תורת הקומפילציה

  39. דיאגרמת מעבר ─ 3 • רמה לקסיקאלית של שפה מיוצגת ע"י סדרה של דיאגרמות מעבר • יש חשיבות לסדר דיאגרמות: • רישא ממשית של תמנית עשויה להיות תמנית בפני עצמה • המטרה:להיות חמדן (greedy) ולייצר את התמנית הארוכה ביותר • תמניות שיש להן רישא משותפת ─ עדיף לבדוק קודם כל התאמה לתמנית השכיחה יותר (משיקולי יעילות) תורת הקומפילציה

  40. start < = <relop, LE> 0 1 2 > <relop, NE> 3 other  4 <relop, LT> = <relop, EQ> 5 start letter = other  <id/keyward, pointer to Symbol Table> > <relop, GE> 9 6 10 7 11 other  letterordigit 8 <relop, GT> דוגמאות לדיאגרמות מעבר תורת הקומפילציה

  41. digit digit digit start digit . digit E +or- digit  12 13 14 15 16 17 18 19 E digit other digit digit start digit . digit  20 21 22 23 24 digit delim other start start delim digit   25 28 29 26 27 30 other other דוגמאות לדיאגרמות מעבר <num, pointer to values table> תורת הקומפילציה

  42. אלגוריתם המעבר על דיאגרמות • סמן את המקום הנוכחי בקלט בתור "מקום ההתחלה" • עבור על הדיאגרמות לפי הסדר 2.1 התחל ממצב ההתחלה של הדיאגרמה 2.2 חזור על: 2.2.1 אם התו הבא מתאים לאחת הקשתותהתקדם בקלט והתקדם למצב הבא מעבר לקשת 2.2.2 אחרת אם יש קשת המסומנת ב-otherהתקדם בקלט והתקדם למצב הבא מעבר לקשת 2.2.3 אחרת (הקלט איננו מתאים לדיאגרמה) החזר את הקלט למקום התחלה ועבור לדיאגרמה הבאה 2.2.4 אם הגעת למצב מקבלאם הוא מסומן בכוכבית ─ החזר תו חזרה לקלט אם יש למצב המקבל תווית ─עצור עם ערך התמנית אחרת ─ חזור למצב 1 (בלע קלט בשקט) • (הסתיימו הדיאגרמות ולא נמצאה דיאגרמה המתאימה)הכרז על שגיאה בקלט ועצור תורת הקומפילציה

  43. נקודות לדיון על האלגוריתם • מדוע לא לאחד את כל הדיאגרמות לדיאגרמה אחת? • למה לנסות שוב ושוב רישא משותפת? (למשל החלק השלם של מספר) • פתרון: מצבי ביניים • תיקון שגיאות (למשל: 1. < x1.0 < x ) • הפיכת האלגוריתם לתוכנית • לימוד עצמי (ASU 3.4 pp.104–106) תורת הקומפילציה

  44. Lex – שפה וכלי לייצורמנתח לקסיקאלי / סורק מהדרLex lex התוכנית הנוצרת ב-C scanner.c תוכנית המקור ב-Lex scanner.l מהדרשפת C cc התוכנית הנוצרת ב-C scanner.c הסורק הנוצר scanner הסורק scanner הקלט לסריקה ע"י הסורק סדרת תמניות (או פעולות על תמניות) תורת הקומפילציה

  45. מבנה תוכנית ב-Lex • קבועים • משתנים • הגדרות רגולריות declarations %% translation rules %% auxiliary procedures • חוקי תרגום (יצירת תמניות) • שגרות עזר מקומיות תורת הקומפילציה

  46. דוגמה לתוכנית ב-Lexחלק א' – הגדרות %{ /* Definitions of the constants * LT, LE, EQ, NE, GT, GE, * IF, THEN, ELSE, ID, NUMBER, RELOP */ %} /* Regular definitions */ delim [ \t\n] ws {delim}+ letter [A-Za-z] digit [0-9] id {letter}({letter}|{digit})* number {digit}+(\.{digit}+)?(E[+\-]?{digit}+)? %% תורת הקומפילציה

  47. דוגמה לתוכנית ב-Lexחלק ב' – חוקי תרגום %% {ws} { /* no action and no return */ } if { return(IF); } then { return(THEN); } else { return(ELSE); } {id} { yyval = install_id(); return(ID); } {number} { yyval = install_num(); return(NUMBER); } “<“ { yyval = LT; return(RELOP); } “<=“ { yyval = LE; return(RELOP); } “=“ { yyval = EQ; return(RELOP); } “<>“ { yyval = NE; return(RELOP); } “>“ { yyval = GT; return(RELOP); } “>=“ { yyval = GE; return(RELOP); } %% תורת הקומפילציה

  48. דוגמה לתוכנית ב-Lexחלק ג' – שגרות עזר מקומיות %% install_id() { /* Retrieve the lexeme */ /* yytext – points to the input string */ /* yyleng – the length of the lexeme */ /* Check if id is in Symbol Table (ST) */ /* If not – insert the new id into the ST */ /* Return a pointer to the symbol’s entry */ } install_num() { /* Handle numeric values in a similar manner */ } תורת הקומפילציה

  49. הכרת שפה(Language Recognition) מכיר (recognizer) לשפה—מכונה (או תוכנת מחשב) אשר ניתנה לה כקלט מחרוזת והיא עונה "כן" אם המחרוזת שייכת לשפה ו"לא" אחרת.אם המכונה (או התוכנה) מזהה או מכירה את המחרוזת נאמר שהיא מקבלת (accepts) את המחרוזת. תורת הקומפילציה

  50. ההיררכיה של חומסקי מחלקת שפות המופיעה למעלה היא תת-קבוצה של מחלקה שתחתיהמכונה המופיעה למעלה הינה מקרה מנוון של מכונה שתחתיה תורת הקומפילציה

More Related