תורת הקומפילציה 236360 הרצאה 2 ניתוח לקסיקלי Wilhelm, and Maurer –...
-
date post
22-Dec-2015 -
Category
Documents
-
view
246 -
download
10
Transcript of תורת הקומפילציה 236360 הרצאה 2 ניתוח לקסיקלי Wilhelm, and Maurer –...
236360תורת הקומפילציה 2הרצאה
ניתוח לקסיקלי
Wilhelm, and Maurer – Chapter 7
Aho, Sethi, and Ullman – Chapter 3
Cooper and Torczon – Chapter 2
front-end שלב הניתוח
בקומפיילרים רבים השלבים בכל מסגרת משולבים זה בזה•decorated syntax treeבקומפיילרים רבים ייצוג הביניים הוא •
תוכנית מקור
Back end
scanning
screening
syntax analysis
semantic analysis
symbol string
token string
syntax tree
decorated syntax tree
symboltable
errormessages
lexical analysis
תוכנית מקור
scanner
screener
parser
symbol
token
get next symbol
get next token
parserמנתח לקסיקלי – אינטרקציה עם ה-
errormessagemanager
lexical analysis
פישוט הניתוח הלקסיקלי )והגדרת השפה( ופישוט הניתוח •הסינטקטי
מודולריות• שימוש חוזר•יעילות – ההפרדה מקלה לממש אלגוריתמים יעודיים יעילים.•
מדוע מפרידים ניתוח לקסיקלי?
מושגים בסיסיים
•lexeme לפעמים נקרא גם( לקסמה = symbol): סדרת אותיות המופרדת משאר התוכנית באופן מוסכם )למשל ע"י רווח או
. counterנקודה(. לדוגמא:
•Pattern:כל : כלל המגדיר אוסף של מחרוזות. )לדוגמאהמחרוזות שמתחילות באות וממשיכות באות או מספר(.
•tokenזוג של שם ותכונות. למשל:: = אסימון ( identifier, {name=counter,code_location=3}) .
שהלקסמה מקיימת.pattern נקבע עפ"י ה-tokenשם ה-
scannerתפקידי ה-
קריאת הקלט•הפרדת הקלט ליחידות לקסיקליות )לקסמות(•, שמות משתנים, integer, real, boolean, string דוגמאות:•
הערות, סימנים מיוחדים )למשל =>(. , כלומר, טיפול preprocessing מממש גם scannerלפעמים ה-•
.macros ו- include filesב- ספירת מספר שורות )למה?(•
screenerה-
)scanner )LEXלעיתים – משולב עם ה-•, מיונם patterns – זיהוי ה-screenerתפקידו העיקרי של ה-•
עם שמות ותכונות. tokensויצירת לא חוקיים.symbolsוכמובן דיווח על שגיאות: • -- מילות מפתח שאינן שמורות, keywordsטיפול ב- •, reserved wordsזיהוי •הדפסת פלט )התוכנית בשילוב הודעות שגיאה(, עשוי לכלול •
pretty printing.(tokens)יש לעקוב אחרי מספרי השורות והעמודות בהם מופיעים ה- –
Typical Tokens )Patterns(
•Token למשל( אחד לכל מילה שמורה בשפה if, else)וכיו"ב ,•Token .אחד לכל אופרטור. לפעמים הם ארוזים במשפחות
למשל משפחת ההשוואות:comparisons = < or < or <= or <= or == or. =!
•Token( אחד המייצג את כל שמות המשתנים identifier .). counter, score, employee למשל:
•Token אחד או יותר המייצגים קבועים )בד"כ מספרים .” 23e5, “Billie Holiday, 27.34, 35 ומחרוזות(. למשל:
•Token:אחד לכל סימן פיסוק. למשל { } ; , ) ( .
(Patterns)משפחות של סמלים
symbol class תוכנית המשתמש
ID foo n_14 last
NUM 73 00 517 082
REAL 66.1. 5 10 .1e67 5.5e-10
IF if
COMMA ,
NOTEQ =!
LPAREN (
RPAREN )
טיפול מיוחד במחרוזות שאינן סמלים
תוכנית המשתמש
comment */ignored/*
preprocessor directive #include <foo.h<
macro #define NUMS 5, 6
white space \t \n
תכונות
ישמשו לשלבים הבאים של הקומפילציה או tokenתכונות של •להודעות שגיאה.
. תכונות (identifier) נפוץ לדוגמא הוא שם משתנה tokenה-•סטנדרטיות שנרצה לשמור עבורו יכללו:
שם המשתנה )הלקסמה(–מיקום המשתנה בתוכנית )עבור הודעות שגיאה(–טיפוס המשתנה–
tokenהתכונות האלו נשמרות בד"כ בטבלת הסמלים, ולכן ב-•מספיק לרשום את מספר הכניסה בטבלה.
דוגמא
הבאים:tokens, נעביר את ה- :e = m * c ** 2עבור הביטוי •
< id , pointer to symbol table entry for e <
< assignment <
< id , pointer to symbol table entry for m<
< multiplication <
< id , pointer to symbol table entry for c<
< exponentiation <
< number , integer value 2 <
– דוגמאותlexical analysisהקושי ב-
בשפת פסקל•Const pi = 3.1416;
הרווחים אינם נחשבים. לכן ההחלטה על סיום Fortranב-•לקסמה יותר מורכבת. למשל,
do 5 I = 1.2
אבל:•do 5 I = 1 , 2
lookaheadכאן מודגש הצורך ב-
)שפות מודרניות מתוכננות כך שלא תיווצרנה בעיות כאלו.( אינם נחשבים שברים, כי זה .10 ו- .Ada 1 ו- Pascalב-•
. 10..1 מקשה את הזיהוי של
המותרים בשפה-tokensניסוח ה
נרצה דרך סטנדרטית להכריז מהם הסימבולים החוקיים •בשפה.
לשם כך נשתמש בביטויים רגולריים.•אוטומטים המבטאים את הביטויים הרגולריים ישימשו לסריקת •
.tokensהקלט וזיהוי ה-
תזכורת לתיאוריה... •
אלפבית, מילים, וכו'
• :דוגמא( אלפבית – ={i,m,b,a} ). אורך היא מחרוזת סופית של אותיות מ- מילה מעל •
המילה הוא מספר האותיות בה. abba, aba, ima, abbabbabba דוגמאות:
המילה ריקה תסומן ב-••0 אוסף המילים באורך אפס –
n אוסף המילים באורך – n* הסגור של( אוסף כל המילים –Kleene) + או יותר1 – אוסף המילים באורך •x.y מילה המהווה שרשור של – x -ו y בד"כ משמיטים את(
(x yאופרטור השרשור וכותבים •suffix, prefix, substring
שפות מעל
* שפה – תת קבוצה של• או L1={ima, aba, bamba} דוגמא:
L2 היא "כל המילים שמכילות את האות a."
שפות L, L1, L2יהיו •
–L1 L2 איחוד שפות –
–L1 L2 = {x1 x2 | x1 L1, x2 L2 }שרשור שפות –
–L המשלים של – L -המילים ב(* -שאינן ב L)–Ln שרשור של – L לעצמו nפעמים –L* הסגור של – L שרשור – L לעצמו מספר כלשהו של פעמים
שפות מעל
קבוצת D קבוצת כל האותיות וגם הסימן _ . תהי Lתהי דוגמא:•כל הספרות. אז ניתן לתאר את השמות החוקיים של משתנים
Cבשפת .* )L)L Dכ-
, הביטויים החשובים הם: איחוד, patternsעבור תיאור ה-•שרשור, וסגור.
על-מנת לציין את המחרוזות האפשריות המתקבלות המציאו •את מושג הביטויים הרגולריים.
ביטויים רגולריים, שפות רגולריות
הוא ביטוי רגולרי מעל המתאר את השפה הריקה הוא ביטוי רגולרי מעל המתאר את השפה L)( = { }L)a( = { a } הוא ביטוי רגולרי המתאר את השפהa , aלכל • P הם ביטויים רגולריים המתארים את השפות הרגולריות qו- p אם •
, אזי:Qו- – p | qהוא ביטוי רגולרי המתאר את השפה הרגולרית P U Q– p q הוא ביטוי רגולרי המתאר את השפה P Q– p* הוא ביטוי רגולרי המתאר אתP*– (p) הוא ביטוי רגולרי שהשפה שלו P.)כלומר, מותר לשים סוגריים(
הערה: על מנת לפשט את הסימונים, * הוא בעל הקדימות הגבוהה • (*a | bcביותר, אח"כ שרשור, אח"כ סימן האיחוד. )
כל שפה הניתנת לכתיבה כביטוי רגולרי היא שפה רגולרית.•
תרגיל
. Σ={a,b}תהי ••L)a|b( ? = •L) )a|b( )a|b( ( ? = •L) )a|b(* ( ? =
דוגמא
. Σ={a,b}תהי ••L)a|b( = {a,b}•L) )a|b( )a|b( ( = {aa,ab,ba,bb}•L) )a|b(* ( = {ε, a, b, aa, ab, ba, bb, aaa, aab, aba, …}
באמצאות ביטויים רגולרייםsymbolsתיאור
דוגמא: מספר שלם או שבור•
) 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (
) 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (*
) | . ) 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (
) 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (*
) | E ) 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (
) 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (* (
(שיטת תיאור זאת קשה לשימוש. לכן נשתמש בשמות של •
קבוצות.
בעזרת שמות ותחומיםsymbolsתיאור
על-מנת לקצר את התיאור נשתמש בשמות לביטויים ונשתמש • בהם כאילו היו משתנים רגילים. למשל:
letter = a | b | … | z | A | B | … | Z
letter_ = letter | _
digit = 0 | 1 | 2 | … | 9
id = letter_ ) letter_ | digit (*נשתמש גם במקף לציין תחום ברור. לדוגמא:•
letter = a-z | A-Zdigit = 0-9
ונשתמש ב- + במקום כוכבית לציין שהסגור מכיל לפחות מופע •אחד:
binary-number = )0|1(+
דוגמאות
• digit = 0-9• digits = digit+
• number = digits (Є | .digits (Є | e (Є|+|-) digits ) )• letter = a-z | A-Z• id = letter (letter | digit)*• if = if• then = then• else = else• relop = < | > | <= | >= | = | <>• ws = ( blank | tab | newline ) - את זה לא נעביר לשלב הבא אלא
נתעלם
tokensמעבר מלקסמות ל-
זיהוי ביטויים רגולריים – על ידי אוטומט סופי
= ) , Q , δ, q0 , F ( Mאוטומט – •
א"ב – • Qקבוצה סופית של מצבים –
•q0 Qמצב התחלתי –
•F Qקבוצת המצבים הסופיים – • δ : Q Qפונקצית המעברים
state
control
קלט
אוטומט דטרמיניסטי ואי-דטרמיניסטי , Q , δ, q0 , F ( M( = אם:דטרמיניסטי הוא אוטומט )סופי(
Q → Q : δ :היא פונקציה חלקית עבורה אין מעברי – יש לכל היותר מעבר למצב יחידa ואות qלכל מצב –
, האוטומט יגיע למצב מסוים יחיד, או ייתקע. wלכל מילה כלומר:•
אם המצב שאליו מגיעים סופי, הקלט "מתקבל". קבלה:•
, Q , δ, q0 , F ( M( = אם:אי-דטרמיניסטי הוא אוטומט )סופי(
Q ) {}( → 2Q : δ -היא פונקציה חלקית. )ייתכנו מעברי ,ויותר ממעבר אפשרי אחד לאות ומצב נתונים.(
, האוטומט יכול להגיע למספר כלשהו של מצבים או wלכל מילה •להיתקע. אם אחד מהם סופי, הקלט מתקבל.
שיטת העבודה
נהפוך את הביטויים הרגולריים לאוטומט אי-דטרמיניסטי•נהפוך את האוטומט האי-דטרמיניסטי לדטרמיניסטי )למה?(•
משפט: לכל אוטומט לא דטרמיניסטי קיים אוטומט דטרמיניסטי שקול–במקרה הגרוע גודל האוטומט המתקבל אקספוננציאלי בגודל האוטומט –
מתקבל אוטומט סביר. המקורי. אך בפועל )עבור זיהוי לקסמות(
נריץ את האוטומט הדטרמיניסטי על הקלט לזיהוי הביטוי •המתאים.
באוטומטים למדנו על אוטומטים שרק מזהים קלט )כן או לא(...•אבל כשתוכנית מריצה אוטומט על קלט אין סיבה שלא תאסוף •
מידע בדרך )בפרט, אותיות הקלט שנסקרו עד עתה, מספר השורה בקוד וכיו"ב(.
מביטויים רגולריים לאוטומט לא דטרמיניסטי
וקבל סדרת (0-9: הצב )את סימני הקבוצות כגון 1שלב •.R1, R2, …, Rmביטויים רגולריים טהורים
Ri לכל ביטוי רגולרי Mi: בנה אוטומט לא דטרמיניסטי 2שלב •
אוטומט זה מזהה את כל M: בנה אוטומט משולב 3שלב •הביטויים הרגולריים
ייתכן שישנם כמה דרכים לזהות את הלקסמה לתשומת לב:• ביותר. הארוכההבאה בתור, אנו נעדיף בד"כ את
המילה השמורה. then כשם משתנה עדיף על thenutcrackerלמשל – כשם משתנה. then כמילה השמורה עדיף על thenאבל באותו אורך, –
סימונים
מביטוי רגולרי לאוטומט אי-דטרמיניסטי שקול
המצבים ההתחלתיים
והמקבלים במכונות
המקוריות הופכים למצבים רגילים
לאחר הבניה.
, איך נבצע את הניתוח הלקסיקלי ?patternבהינתן אוטומט לכל
נרכיב את כל האוטומטים שהתקבלו לאוטומט אחד גדול עם מצב אפשרי:patternסופי ייחודי לכל
שיטה נאיבית:ננסה כל אחד מהאוטומטים.
שיטה יותר יעילה היא שילוב כל האוטומטים לאחד, מעבר לאוטומט דטרמיניסטי, והרצה ארוכה ככל האפשר עד
שנתקעים. כשנתקעים, זוכרים את המקום האחרון שבו התקבלה מחרוזת ואותו מחזירים.
דוגמא:
מעבר לאוטומט דטרמיניסטי:
Lookahead
הבעיה: לעיתים צריך לסרוק מספר אותיות קדימה על מנת להחליט מהו • אותו נחזיר.symbolה-
יכולה להיות גם שם של FORTRAN ב- IFדוגמא: המילה השמורה •משתנה.
“if)i,j(=3”-שונה מ "if )condition( then ”… ./( המציינת את עבור המנתח: אות מיוחדת )למשל -lookaheadתאור •
) * ( if" נוכל לציין שאנו מצפים ל- if. לזיהוי lookaheadמקום תחילת ה-then”-אבל רוצים שרק ה if .יוחזר
. ”if / ) * ( then“ונרשום אותיות. 2 של lookahead מספיק ADAבפסקל ו- הערה:•
0 1 2 3 4 5 6I F )(
startletter
any
scanner generatorsymbol specification
Input program
scanner
token stream
scanning table
: מפורמליזם לתוכנהlexical analyzerה-
יתרונות•המפרט – קצר יחסית–אפשר לוודא שהמפרט תקין )לא אוטומטית!(–התוכנה קלה לתחזוקה–
שימושים נוספים בקומפילציה ובשטחים generationלשיטת ה- •נוספים
scanner
scanning table
driver
: מפורמליזם לתוכנהlexical analyzerה-
- ביטויים רגולריים tokenתאור ה- • – אוטומט סופיscannerמבנה ה- •
הוא תוכנית המריצה אוטומט לפי טבלת המעברים והקלט. driverה-– היא טבלת המעברים. scanning tableה- –
טיפול בשגיאות
בשלב הניתוח הלקסיקלי יש שגיאות רבות שלא ניתן לגלות.• הוא fi, קשה לדעת אם …) )fi ) a == f)x עבור הביטוי למשל:•
, או שם רוטינה. ifשיבוש של בשלב יותר מאוחר של האנליזה נגלה זאת.–. identifier עבור tokenבשלב זה פשוט נעביר –
אבל לפעמים יש שגיאה ברורה כבר בשלב זה – כאשר לא ניתן • . מה עושים?patternלשייך את הלקסמה שהתגלתה לשום
לסלק אותיות מהקלט עד שמתגלה התחלה השיטה הקלה ביותר:•של לקסמה חוקית.
לסלק אות אחת, להוסיף אות אחת, להחליף אות אפשרויות נוספות:•אחת, להחליף סדר של שתי אותיות סמוכות.
לאפשר המשך הקומפילציה עם מינימום הפרעה. המטרה:•הקושי – התפשטות השגיאות.•
סיכוםלרוב השפות ניתן לכתוב ביטויים רגולריים לכל הלקסמות הרלוונטיות.•משלבים את כל הביטויים לאוטומט אי-דטרמיניסטי יחיד•הופכים את האוטומט לדטרמיניסטי•מריצים לגילוי לקסמה אחר לקסמה, אוספים מידע בדרך )למשל שם •
המשתנה(מודיעים על שגיאות ומנסים לתקן. •
לרוב שפות התכנות ניתן לבנות מנתח לקסיקלי בקלות. •. Fortran, PL/1יוצאי דופן:
ישנם כלים שבונים מנתח לקסיקלי בהינתן ביטויים רגולריים. •יש להם שימושים גם מחוץ לתחום הקומפיילרים, במקומות בהם דרוש ניתוח
אוטומטי של קלטים, למשל, מערכות שאילתות.
בתרגולים ובתרגיל הבית תכירו כלי אחד כזה: Lex