Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "פרק 3 ניתוח לקסיקאלי תורת הקומפילציה איתן אביאור."— Presentation transcript:

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

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

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

4 ניתוח לקסיקאלי ─ שיטה תיאור המלים בשפה באמצעות ביטויים רגולריים
תיאור המלים בשפה באמצעות ביטויים רגולריים פירוק זרם התווים בקלט ובניית התמניות ע"י הפעלת אלגוריתמים להתאמת תבניות (pattern matching) “if” L(LD)* D+ “<=“ מנתח לקסיקאלי 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 תבנית, יחידה לקסיקאלית ותמנית דוגמאות
תיאור לא פורמלי של תבנית (pattern) דוגמאות של יחידות לקסיקאליות (lexemes) תמנית (token) המחרוזת const const המחרוזת if if המחרוזות < או <= או == או != או > או >= >, =>, ==, =!, <, =< relation אות שאחריה אפס או יותר אותיות וספרות D2, count, pi identifier קבוע מספרי 6.02e23, 3.14, 0 number רצף תווים הנתון בין שני תווי " “code dumped” literal תורת הקומפילציה איתן אביאור

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

12 קשיים בניתוח לקסיקאלי Fortran
ב-Fortran (וב-Algol 68) אין חשיבות לרווחים (אלא בתוך מחרוזת), ניתן להוסיף רווחים אפילו באמצע שמות משתנים עד שמגיעים לסימן המפריד בין 1 ו-2 (פסיק או נקודה) לא ניתן לדעת מה זרם התמניות הנוצר DO 5 I = 1.25 DO 5 I = 1,25 1.25 = DO5I num operator id 25 , 1 I 5 DO punc label keyword תורת הקומפילציה איתן אביאור

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

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 דוגמאות: s1 = ss0 = sε = s s2 = ss1 = ss ss3 = ss2 = sss תורת הקומפילציה איתן אביאור

22 פעולות על שפות איחוד (union) L  M L  M = { s | s  L  s  M }
חיתוך (לא שימושי) (intersection) L  M L  M = { s | s  L  s  M } שרשור (concatenation) LM LM = { st | s  L  t  M } חזקה (exponentiation) Li Li = { si | s  L } L0 = { ε }  Li = LLi-1 = Li-1L (i > 0) סגור קלין (Kleene closure) L L = סגור חיובי (positive closure) L+ L = תורת הקומפילציה איתן אביאור

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 ביטוים רגולרים ─ הגדרה כאשר הביטוי מגדיר את השפה ε { ε } a  Σ a { a }
r ו-s ביטוים רגולרים (r) | (s) L(r)  L(s) (r)(s) L(r) L(s) (r)* ( L(r) )* (r) L(r) תורת הקומפילציה איתן אביאור

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 ביטוים רגולרים ─ אלגברה
תיאור אקסיומה פעולת | הינה חילופית (commutative) r|s = s|r פעולת | הינה קיבוצית (associative) r|(s|t) = (r|s)|t פעולת השרשור הינה קיבוצית (rs)t = r(st) פעולת השרשור מתפלגת (distributes) מעל פעולת השרשור, הן משמאל והן מימין r(s|t) = rs | rt (s|t)r = sr | tr ε הינו איבר האדיש (identity element) של פעולת השרשור εr = r rε = r קשר בין פעולת * ובין ε r* = (r | ε)* פעולת * הינה אידמפוטנטית (idempotent) r** = r* תורת הקומפילציה איתן אביאור

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  if expr then stmt
| if expr then stmt else stmt | ε expr  term relop term | 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 זיהוי תמניות המטרה: בניית מנתח לקסיקאלי שיקרא את הקלט וינתח אותו באופן הבא: ביטוי רגולרי תמנית תכונה − ערך ws if then else id מחוון לטבלת סמלים num מחוון לטבלת ערכים < relop LT <= LE = EQ <> NE > GT >= GE תורת הקומפילציה איתן אביאור

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

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

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

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

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

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

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

44 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 ההיררכיה של חומסקי שפות מכונות רגולריות (regular) אוטומטים סופיים (finite automata) חסרות הקשר (context-free) אוטומטי מחסנית (pushdown automata) תלויות הקשר (context-sensitive) מכונות טיורינג (Turing machines) עם סיבוכיות זיכרון ליניארית (phrase structure) מכונות טיורינג בלתי-חסומות מחלקת שפות המופיעה למעלה היא תת-קבוצה של מחלקה שתחתיה מכונה המופיעה למעלה הינה מקרה מנוון של מכונה שתחתיה תורת הקומפילציה איתן אביאור

51 אוטומט סופי Finite Automaton
FA =  S, , δ, s0, F  S — קבוצת מצבים (states)  — אלף בית (alphabet) δ — פונקצית מעבר (transition function) s0 — מצב התחלה (start/initial state) F — קבוצת מצבים מקבלים (accepting/final states) אוטומט סופי אי-דטרמיניסטי (NFA = Nondeterministic Finite Automaton) כאשר לא מגבילים את פונקצית המעבר δ אוטומט סופי דטרמיניסטי (DFA = Determenistic Finite Automaton) מגבילים את δ כדלקמן: בחירה דטרמיניסטית s  S,   | δ(s, ) |  1 אין מעברי ε s  S δ(s, ε) = Ø δ: S  (  {ε})  2S s0  S F  S תורת הקומפילציה איתן אביאור

52 רישום אוטומטים ע"י גרף מכוון
כל מצב מסומן ע"י צומת (עיגול) מצב ההתחלה מסומן ע"י חץ start מצבים מקבלים מסומנים ע"י עיגול כפול קשת ממצב 1s למצב 2s ועליה תווית     {ε} אם"ם s2  δ(s1, ) start 3 אוטומט אי-דטרמיניסטי השפה (a* | b*) c אוטומט דטרמיניסטי start 1 3 a b c 2 start 1 3 ε c b 2 a תורת הקומפילציה איתן אביאור

53 הקשר בין סוגי האוטומטים
משפט מחלקות האוטומטים הסופיים הדטרמיניסטים והאי-דטרמיניסטים שקולות כלומר לכל DFA קיים NFA המקבל אותה שפה ולכל NFA קיים DFA המקבל אותה שפה הוכחה DFAהינו מקרה פרטי של NFA ולכן צד זה מתקיים טריוויאלית קיים אלגוריתם "בניית תת קבוצות" (subset construction) המקבל NFA ומייצר DFA שקול פרטי האלגוריתם ב-3.6 ASU (אלג' 3.2) מספר המצבים של ה-DFA עשוי להיות אקספוננציאלי במספר המצבים של ה-NFA בד"כ ניתן לקבל DFA לא גדול מדי תורת הקומפילציה איתן אביאור

54 ייצוג אוטומט בתוכנית מחשב
טבלת מעברים T (מטריצה) בה |S| שורות על+1 || עמודות (באוטומט דטרמיניסטי מספיקות || עמודות)T[s, ] = δ(s, ) כל שורה מייצגת מצב כל עמודה מייצגת אות באלף-בית (או ε באוטומט אי-דטרמיניסטי) כל כניסה בטבלה הינה תת-קבוצה (או מחוון לתת-קבוצה) של מצבי האוטומט לפי ערך פונקצית המעבר השורה הראשונה מייצגת את מצב ההתחלה כאשר המטריצה דלילה מאוד, מייצגים את הגרף ע"י רשימת הקשתות שלו (רשימה מקושרת) סיבוכיות המקום קטנה אבל סיבוכיות הזמן למעבר על הגרף גדלה תורת הקומפילציה איתן אביאור

55 הדמיה (סימולציה) של אוטומט ע"י תוכנית מחשב
אוטומט אי-דטרמיניסטי S = ε_closure ( {s0} ); while ( ! empty(S) && (c=getchar()) != EOF ) S = ε_closure( moves(S, c)); return S  F  Ø; אוטומט דטרמיניסטי s = s0; while ( defined(s) && (c=getchar()) != EOF ) s = move(s, c); return s  F; moves מחזירה את קבוצת מצבים שאליהם ניתן לעבור מ-S ע"י с move מחזירה את המצב הבא או undef אם אין מעבר מוגדר מ-S ע"י с ε_closure — כל המצבים ב-S וכל המצבים אליהם ניתן להגיע מ-S ע"י צעדי ε סיבוכיות הזמן: O(n) סיבוכיות הזמן: O( |S|  n) תורת הקומפילציה איתן אביאור

56 ביטויים רגולרים ואוטומטים
ביטוי רגולרי הוא תבנית הנוצרת ע"י הדקדוק הבא: r  r │ r r  r r r  r * r  ( r ) r   r  ε תורת הקומפילציה איתן אביאור

57 האלגוריתם של תומפסון לבנית אוטומט מתוך ביטוי רגולרי
א. פרוס את הביטוי הרגולרי ע"פ הדקדוק הנ"ל וקבל עץ פריסה ב. בנה אוטומט באופן רקורסיבי מתוך עץ הפריסה ע"פ הכללים: s | t i start f N(s) ε N(t) ε i start f st N(s) i start N(t) f    i start f s* N(s) i start f ε N ( (s) ) = N ( s ) תורת הקומפילציה איתן אביאור

58 בנית NFA של ביטוי רגולרי
משפט א. מספר המצבים של N(r) הינו ליניארי באורך של r ב. זמן הבניה של N(r) ליניארי באורך של r הוכחה א. לפי הבניה: לכל סמל ε או  מיוצרים שני מצבים לכל תו | מיוצרים שני מצבים בשרשור לא מיוצרים מצבים חדשים (להפך — מאוחדים שני מצבים למצב אחד) לכל תו * מיוצרים שני מצבים חדשים לכל ( ) לא נוצרים מצבים חדשים מסקנה: | N(r) |  2|r| ב. זמן הבניה של כל שלב ברקורסיה קבוע, זמן הרקורסיה כגודל עץ פריסה השווה לאורך הביטוי תורת הקומפילציה איתן אביאור

59 הכרת ביטוים רגולרים ע"י תוכניות
בנה אוטומט אי-דטרמיניסטי N(r) מתוך הביטוי r (בזמן O(|r|) ) בהינתן מחרוזת x עשה עליה הדמיה של האוטומט (בזמן O(|r||x|) )  מתאים לתוכנית אינטראקטיבית המחפשת התאמה של מחרוזת בודדת לתבנית — למשל עורך (editor) בנה אוטומט אי-דטרמיניסטי N(r) מתוך הביטוי r (בזמן O(|r|) ) בנה אוטומט דטרמיניסטי D(r) מתוך N(r) (בזמן O(2|r|) ) בהינתן מחרוזת x עשה עליה הדמיה של האוטומט (בזמן O(|x|) )  מתאים לתוכנית המחפשת בקובץ את כל השורות המתאימות לתבנית מסוימת תורת הקומפילציה איתן אביאור

60 הכרת ביטוים רגולרים — 2 O ( |r|  |x| ) O ( |x| )
האוטומט גודל האוטומט (זיכרון הסימולטור) זמן ריצת הסימולטור NFA O ( |r| ) O ( |r|  |x| ) DFA O ( 2|r| ) O ( |x| ) תוכנית עצלנית הבונה את החלקים הנחוצים של D(r) מתוך N(r) תוך כדי בדיקת x ולא מראש — כשהמדמה נמצא במצב s ותו הקלט הבא הוא  התוכנית מייצרת רק את המצב δ(s,) (ולא את כל המצבים העוקבים של s) תורת הקומפילציה איתן אביאור

61 בנית מנתח לקסיקאלי מהדר Lex מפרט בשפת Lex טבלת מעברים חוצץ הקלט lexeme
מחרוזת הקלט זרם תמניות מדמה FA טבלת מעברים תורת הקומפילציה איתן אביאור

62 תום פרק 3 תורת הקומפילציה איתן אביאור


Download ppt "פרק 3 ניתוח לקסיקאלי תורת הקומפילציה איתן אביאור."

Similar presentations


Ads by Google