תורת הקומפילציה 236360 הרצאה 1 מבוא; ניתוח לקסיקלי
Post on 31-Dec-2015
139 Views
Preview:
DESCRIPTION
TRANSCRIPT
1
236360תורת הקומפילציה 1הרצאה
מבוא; ניתוח לקסיקלי
2
236360תורת הקומפילציה
פרופ"ח ארז פטרנקמרצה: ••erez@cs528 טאוב 13:30-14:30שעת קבלה – יום חמישי •
מתרגלים•, מתרגלת אחראיתקירה רדינסקי–גלעד קותיאל–
3
אדמיניסטרציה
http://webcourse.cs.technion.ac.il/236360 אתר:• - תרגילי בית25%•
תרגילים "יבשים", רשות )מגן(5%– תרגילים "רטובים", חובה20%–
- מבחן סוף הקורס75%•ציון נכשל במבחן גורר כשלון בקורס, ללא קשר לציון •
התרגילים. 236353קדם: אוטומטים ושפות פורמליות •מועד ג' למילואימניקים )בלבד(.•העתקות...•
4
ספרות
ספר עיקרי•A.V. Aho, M. S. Lam, R. Sethi, and J.D. Ullman – “Compilers – Principles, Techniques, and Tools”, Addison-Wesley, 2007
ספר משני•R. Wilhelm, and D. Maurer – “Compiler Design”, Addison-Wesley, 1995
5
ספרות-המשךספר נוסף•
K.D.Cooper and L.Torczon
“Engineering A Compiler”, Morgan Kaufmann, 2004
6
פרס טיורינג
March 10, 2009:
ACM has named Barbara Liskov the recipient of the 2008 ACM A.M. Turing Award for her contributions to practical and theoretical foundations of programming language and system design.
7
מורכבות
קומפילציה
שפות תכנות
הנדסת תכנה
מבנה מחשבים
מערכות הפעלהשפות פורמליות
אלגוריתמים
מבני נתונים
משלב תחומים רבים ממדעי המחשב•משלב מחקר תיאורטי ומעשי•
8
קומפילציה )הידור( – מושגי יסוד
זמן קומפילציה•
זמן ריצה•
compilersource program target program
target program
outputinput
9
(= פרשנות)אינטרפרטציה
interpreter
source program
input
output
שימושים:שפות סקריפט שבהם כל שורה קוראת לביצוע של משהו מורכב )אין טעם -
ליעל(( שבהן הנתונים מורכבים ואינם ידועים APL, Mathlabשפות מאד גבוהות )-
בעת הקומפילציה
10
דוגמא למבנה מודרני חשוב - Java
source program
inputoutput
Translator )javac(
Intermediate program)bytecode(
Bytecode is standard,machine-independent
Just In Time ,תוך כדי פרשנות התכנית -- מבצע קומפילציה של חלקי interpreterה-
תוכנית על מנת שהמשך הביצוע יהיה מהיר יותר.
Java Virtual Machine
Virtual machine תלוי מכונה. מבצע טוב כפי -יכולתו על המכונה הנתונה.
11
הידור / אינטרפרטציה – הכללות
•Source to Source
•Virtual Machine
•Pre-processors
C ++ program C programtranslator
Java bytecodeJava program compiler
“pure” programprogram with embeddedpre-pocessing statements(e.g., #include, macros)
preprocessor
12
שימושים של קופיילריםיעד
,SPARC, P690קוד מכונה: •IA32
שפת אסמבלי•קוד עבור אינטרפרטר:•
– Java Virtual Machine, P-Code… ,
שפות עבוד טקסט: •PostScript, TeX, html,
RTF … ,תוכנה למכשור•מעגל חשמלי•
קלט ,C, Pascalשפות תכנות:•
Assembler ...,שפות לעיבוד טקסט: •
PostScript, TeX, html, RTF …,
,scripting: C-shellשפות •emacs, perl, Hypercard…
שפות שאילתה לעבוד •(SQLנתונים )
שפות לתיאור חומרה •(VHDL)
שפות בקרה•
13
כלים נוספים לעיבוד שפה – דוגמא
Skeletal source program
Preprocessor
Source program
Target assembly program
Assembler
Relocateable machine code
Loader/Link-editor
Absolute machine code
compiler
Library, releasable, object files
איסוף מודולים, פתיחת מקרואים.
כתובות יחסיות, הפניות לספריה
:Linkכתובות יחסיות, לכל התוכנית
:Loadכתובות אבסולוטיות
14
קומפילציה – חשיבות התחום
לפיתוח שמושים מתקדמים•ניצול של כלים לפיתוח קומפיילרים להקלת מאמץ הפיתוח– אוטומטית של קבצי קלטקריאה )ו"הבנה"(–
למפתחי תוכנה•הבנה של האבחנה בין זמן קומפילציה לזמן ריצה–הבנה של מה יעשה קומפיילר עם התוכנה שלכם–
)שיפור זמן ריצה, התראות של שגיאות(שימוש נכון במבנים שונים של שפות התכנות–ניצול נכון של ארכיטקטורת המחשב–
15
קומפילציה – חשיבות התחום
לאנשי שפות תכנות•תמיכה יעילה בשפה חדשה–
לאנשי ארכיטקטורה של מחשבים•הבנה טובה של האיזון העדין שבין חומרה לתכנה– מה תעשה כל הבנה מעמיקה מה יעשה קומפיילר )כלומר:–
תוכנה( עם החומרה שלכם
16
תורת הקומפילציה – תוכן הקורס
מבוא•מבנה הקומפיילר•(lexical analysisניתוח מילוני )•(parsingניתוח תחבירי )•ניתוח סמנטי•יצירת קוד•סביבת זמן הריצה )טיפול ברוטינות, ניהול זיכרון, וכו'(•נושאים מתקדמים:•
, Data-flow analysisאופטימיזציות, ניתוח סטטי, – Virtual ו-Just-In-Timeלא נדבר על: קומפיילרים –
Machines ,
17
מבנה הקומפיילר – תמונה כללית
Wilhelm and Maurer – Chapter 6
Aho, Sethi, and Ullman – Chapter 1
Cooper and Torczon – Chapter 1
18
קומפיילר – כקופסא שחורה
target code
int a, b;a = 2;b = a*2 + 1;
SET R1,2STORE #0,R1SHIFT R1,1STORE #1,R1ADD R1,1STORE #2,R1
source code
מתרגם משפת המקור לשפת היעד• )עושה אותו תוכנית זהה סמנטית•
דבר(כיוון שהתירגום מסובך, חילקו אותו •
לשלבים מודולריים סטנדרטיים.
19
קומפיילר – חלוקה גסה
תוכנית מקור
תוכנית מטרה
analysis
code optimization
code generation
יצוג ביניים
ייצוג ביניים
Front End
Back End
20
מרכיבי הקומפיילר – חלוקה עדינהCharacter Stream
Lexical Analyzer
Token Stream
Syntax Analyzer
Syntax Tree
Semantic Analyzer
Decorated Syntax Tree
Machine-IndependentCode Optimization
Intermediate Representation
Code Generator
Target Machine Code
Machine-Dependent Code Optimization
Intermediate Code Generator
Intermediate Representation
Target Machine Code
21
Front Endמרכיבי הקומפיילר – Character Stream
Lexical Analyzer
Token Stream
Syntax Analyzer
Syntax Tree
Semantic Analyzer
Decorated Syntax Tree
Intermediate Code Generator
קל, טיפול בביטויים רגולריים
יותר מסובך, רקורסיבי, עבודהעם דקדוק חסר הקשר.
יותר מסובך, רקורסיבי, דורש עליה וירידה בעץ של הגזירה.
השטחת העץ. חלק האופטימיזציות נח לעשות על עץ, וחלק על קוד
22
דוגמה לתפקידי החלקים
23
דוגמה לתפקידי החלקים
24
טבלת הסמלים
. שומר את התכונות שלו identifierמבנה נתונים לכל •(attributes.ומאפשר גישה מהירה )
.scopeלדוגמא: מיקום בזיכרון, טיפוס, –הטבלה נבנית במהלך הניתוח. למשל: הניתוח הלקסיקלי לא מגלה מה –
הטיפוס. רק השלב של ייצור הקוד יודע את מיקום המשתנה בזיכרון, וכיו"ב.
25
הודעות שגיאה
חלק חשוב של תהליך הקומפילציה•כל שלב מגלה שגיאות ברמת הניתוח שלו של התוכנית.•
מודיע על השגיאה–ומנסה כמיטב יכולתו להמשיך בקומפילציה–
26
יתרון חשוב של מודולריות ...שפה בשפה א
analysis 1 analysis n analysis 2
machine independent optimization
machine dependent optimization
code generation
machine dependent optimization
code generation
mמכונה 1מכונה
…
27
שפת ביניים
שפה קלה לייצור, שקל לייצר ממנה קוד אמיתי, ונוחה לעבודה •לאופטימיזציה.
שבה כל three-address codeאנו נשתמש בצורה הנקראת •תא בזיכרון יכול לשמש פרמטר לכל פעולה.
temp1 := inttoreal)60(temp2 := id3 * temp1temp3 := id2 + temp2id1 := temp3
28
שלב האופטימיזציה
יצירת קוד הביניים נעשית בצורה אוטומטית. •הקוד ניתן לשיפור•
temp1 := inttoreal)60(temp2 := id3 * temp1temp3 := id2 + temp2id1 := temp3
temp1 := id3 * 60.0id1 := id2 + temp1
29
שלב האופטימיזציה
Decorated Syntax Tree
Decorated Syntax Tree
machine independent optimization
דוגמאות•–constant propogation–common subexpressions–dead code elimination
30
אופטימיזציה
-שלם או לא ניתן להכרעה, NPלא ניתן לייצר קוד אופטימלי )•תלוי מה מנסים לעשות...(. לכן משתמשים בהיוריסטיקות.
חובה לשמור על נכונות; צריך לשפר )כמעט תמיד(; חישוב •האופטימיזציה צריך להיות יעיל.
שיפורים: מהירות, מקום, אנרגיה, וכו'.•החלק שתופס זמן מירבי בתהליך הקומפילציה.•השאלה העיקרית: כמה זמן שווה להשקיע באופטימיזציה עבור •
ייעול תוכנית המטרה..JITהתשובה מאוד משתנה עבור –
31
אופטימיזציה מודרנית
האתגר העיקרי הוא לנצל פלטפורמות מודרניות•–Multicores פקודות ווקטוריות–היררכית זיכרונות–(?Java Bytecodeהאם הקוד מועבר ברשת )–
32
back-end)שלב הסינתזה )
decorated syntax tree
decorated syntax tree
target program
target program
address assignmet
code generation
machine dependent optimizationpeephole optimizer
33
(Code Generation)ייצור קוד
ייצור קוד של שפת המטרה.שלב אחרון:•משימה חשובה: החלטה על מיקום המשתנים בזיכרון.•האתגר העיקרי: לאיזה משתנים יוקצו רגיסטרים באיזה שלב •
של התוכנית?פעולות על רגיסטרים מהירות משמעותית מפעולות על הזיכרון.–
-קשה(, NPהשמה אופטימלית למקרה הגרוע ביותר היא קשה )•היוריסטיקות מאד טובות קיימות.
34
, דוגמאback-endה- a = 2temp1 = a*2b = temp1 + 1
addressassignment
machine indep.optimization
machine-dependent
optimization
a0temp1 1
b2a = 2temp1 = a << 1b = temp1 + 1
SET R1,2STORE #0,R1LOAD R1,#0SHIFT R1,1STORE #1,R1LOAD R1,#1ADD R1,1STORE #2,R1
int a, b;a = 2;b = a*2 + 1;
SET R1,2STORE #0,R1SHIFT R1,1STORE #1,R1ADD R1,1STORE #2,R1
(front end)
codegeneration
35
כלים
חלק משמעותי מהמאמץ בכתיבת קומפיילרים חוזר על עצמו •בין קומפיילקים שונים.
כלים מיועדים לחסוך את החלק החוזר.•–Parser generators.חלקם מתבססים על אלגוריתמים מורכבים :–Lexical generator)עבור ניתוח לקסיקאלי( –Syntax-directed translation engines מעבר על העץ האבסטרקטי
ויצירת קוד ביניים ממנו ע"י ביצוע פעולה על כל צומת.–Data Flow Engines.עבור אופטימיזציה
36
לסיכום
קומפיילר מתרגם משפת מקור לשפת יעד )ובדרך מספק •בדיקת שגיאות חשובה(.
על מנת להקטין את הסיבוכיות התירגום מחולק למודולים •ברורים ונפרדים.
מביא את התוכנית לייצוג ביניים שנוח לעבוד front-endשלב ה-•איתו באופן אוטומטי.
מבצע אופטימיזציות ומייצר קוד של שפת back-endשלב ה-•המטרה.
.front-endבהמשך – נתחיל בהבנת ה-•
37
ניתוח לקסיקלי
Wilhelm, and Maurer – Chapter 7
Aho, Sethi, and Ullman – Chapter 3
Cooper and Torczon – Chapter 2
38
front-endשלב הניתוח
משולבים זה בזהfront-endבקומפיילרים רבים כל השלבים של ה-•decorated syntax treeבקומפיילרים רבים ייצוג הביניים הוא •
תוכנית מקור
Back end
Lexical analysis
syntax analysis
semantic analysis
token string
syntax tree
decorated syntax tree
symboltable
errormessages
39
תוכנית מקור
Lexical Analyzer
parser
tokenget next token
מנתח לקסיקלי – אינטרקציה עם parserה-
errormessagemanager
40
פישוט הניתוח הלקסיקלי )והגדרת השפה( •ופישוט הניתוח הסינטקטי
מודולריות• שימוש חוזר•יעילות – ההפרדה מקלה לממש אלגוריתמים •
יעודיים יעילים.
מדוע מפרידים ניתוח לקסיקלי?
41
מושגים בסיסיים
•lexeme לקסמה )לפעמים נקרא גם = symbol סדרת אותיות המופרדת משאר :)
התוכנית באופן מוסכם )למשל ע"י רווח או .counterנקודה(. לדוגמא:
•Pattern .כלל המגדיר אוסף של מחרוזות :)לדוגמא: כל המחרוזות שמתחילות באות
וממשיכות באות או מספר(.
•token:אסימון: זוג של שם ותכונות. למשל = ( identifier,
{name=“counter”,code_location=3} .) שהלקסמה pattern נקבע עפ"י ה-tokenשם ה-
מקיימת.
42
lexical analyzerתפקידי ה-
קריאת הקלט, והפרדתו ליחידות לקסיקליות •)לקסמות(
, integer, real, boolean, string דוגמאות:•שמות משתנים, הערות, סימנים מיוחדים
)למשל =>(. עם tokens, מיונם ויצירת patternsזיהוי ה-•
שמות ותכונות. -- מילות מפתח שאינן keywordsטיפול ב- •
שמורות, , reserved wordsזיהוי • preprocessing( ,includeלפעמים מממש גם •
files -ו macros.)ספירת מספר שורות )למה?(• לא חוקיים.symbolsדיווח על שגיאות: •הדפסת פלט )התוכנית בשילוב הודעות •
שגיאה(, עשוי לכלול pretty printing.
)יש לעקוב אחרי מספרי השורות והעמודות בהם –(tokensמופיעים ה-
43
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. { } ; , ) ( :אחד לכל סימן פיסוק. למשל
44
(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 )
45
טיפול מיוחד במחרוזות שאינן סמלים
תוכנית המשתמש
comment */ignored/*
preprocessor directive #include <foo.h<
macro #define NUMS 5, 6
white space \t \n
46
תכונות
ישמשו לשלבים הבאים של הקומפילציה או tokenתכונות של •להודעות שגיאה.
•token( נפוץ לדוגמא הוא שם משתנה identifier תכונות .)סטנדרטיות שנרצה לשמור עבורו יכללו:
שם המשתנה )הלקסמה(–מיקום המשתנה בתוכנית )עבור הודעות שגיאה(–טיפוס המשתנה–
tokenהתכונות האלו נשמרות בד"כ בטבלת הסמלים, ולכן ב-•מספיק לרשום את מספר הכניסה בטבלה.
47
tokensמעבר מלקסמות ל-
48
דוגמא
הבאים: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 <
49
– דוגמאותlexical analysisהקושי ב-
קל: בשפת פסקל•Const pi = 3.1416;
הרווחים אינם נחשבים. לכן Fortranב-•ההחלטה על סיום לקסמה יותר מורכבת.
למשל,do 5 I = 1.2
אבל: •do 5 I = 1 , 2
lookaheadכאן מודגש הצורך ב-
)שפות מודרניות מתוכננות כך שלא תיווצרנה בעיות כאלו.(
אינם נחשבים .10 ו- .Ada 1 ו- Pascalב-•. 10..1שברים, כי זה מקשה את הזיהוי של
50
- המותרים בשפהtokensניסוח ה
נרצה דרך סטנדרטית להכריז מהם הסימבולים החוקיים •בשפה.
לשם כך נשתמש בביטויים רגולריים.•אוטומטים המבטאים את הביטויים הרגולריים ישימשו לסריקת •
.tokensהקלט וזיהוי ה-
תזכורת לתיאוריה... •
51
אלפבית, מילים, וכו'
• :דוגמא( אלפבית – ={i,m,b,a}) היא מחרוזת סופית של אותיות מילה מעל •
. אורך המילה הוא מספר האותיות בה. מ- abba, aba, ima, abbabbabbaדוגמאות:
המילה ריקה תסומן ב-••0אוסף המילים באורך אפס – •n אוסף המילים באורך – n• הסגור של( אוסף כל המילים –*Kleene)•+ או יותר1 – אוסף המילים באורך •x.y מילה המהווה שרשור של – x -ו y בד"כ(
(x yמשמיטים את אופרטור השרשור וכותבים •suffix, prefix, substring
52
שפות מעל * שפה – תת קבוצה של•
או 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 לעצמו מספר כלשהו
של פעמים
53
שפות מעל
קבוצת כל האותיות וגם הסימן _ L תהי דוגמא:• קבוצת כל הספרות. אז ניתן לתאר את D. תהי
Cהשמות החוקיים של משתנים בשפת * .)L)L Dכ-
, הביטויים החשובים patternsעבור תיאור ה-•הם: איחוד, שרשור, וסגור.
על-מנת לציין את המחרוזות האפשריות •המתקבלות המציאו את מושג הביטויים
הרגולריים.
54
ביטויים רגולריים, שפות רגולריות
• הוא ביטוי רגולרי מעל המתאר את השפה הריקה
• הוא ביטוי רגולרי מעל המתאר את השפה L)( = { }
הוא ביטוי רגולרי המתאר את a , aלכל •L)a( = { a }השפה
הם ביטויים רגולריים המתארים את qו- pאם •, אזי:Q ו- Pהשפות הרגולריות
– p | q הוא ביטוי רגולרי המתאר את השפהP U Qהרגולרית
– p q הוא ביטוי רגולרי המתאר את השפה P Q– p* הוא ביטוי רגולרי המתאר אתP*– (p הוא ביטוי רגולרי שהשפה שלו ) P ,כלומר(
מותר לשים סוגריים(.הערה: על מנת לפשט את הסימונים, * הוא •
בעל הקדימות הגבוהה ביותר, אח"כ שרשור, * (a | bcואח"כ איחוד. )
כל שפה הניתנת לכתיבה כביטוי רגולרי היא •שפה רגולרית.
55
תרגיל
. Σ={a,b}תהי ••L)a|b( ? = •L) )a|b( )a|b( ( ? = •L) )a|b(* ( ? =
56
דוגמא
. Σ={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, …}
57
באמצאות ביטויים רגולריים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 (* (
(שיטת תיאור זאת קשה לשימוש. לכן נשתמש •
בשמות של קבוצות.
58
בעזרת שמות ותחומים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(+
59
דוגמאות
• 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 ) - את זה לא נעביר לשלב הבא אלא
נתעלם
60
זיהוי ביטויים רגולריים – על ידי אוטומט סופי
= ) , Q , δ, q0 , F ( Mאוטומט – •
•א"ב – • Qקבוצה סופית של מצבים –•q0 Qמצב התחלתי –
•F Qקבוצת המצבים הסופיים – • δ : Q Qפונקצית המעברים state
control
קלט
61
אוטומט דטרמיניסטי ואי-דטרמיניסטי
• , Q , δ, q0 , F ( M הוא אוטומט ( = )סופי( אם:דטרמיניסטי
Q → Q : δ:היא פונקציה חלקית עבורה אין מעברי – יש לכל היותר מעבר למצב a ואות qלכל מצב –
יחיד, האוטומט יגיע למצב wכלומר: לכל מילה •
מסוים יחיד, או ייתקע. קבלה: אם המצב שאליו מגיעים סופי, הקלט •
"מתקבל".
• , Q , δ, q0 , F ( M הוא אוטומט ( = )סופי( אם:אי-דטרמיניסטי
Q ) {}( → 2Q : δ .היא פונקציה חלקית , ויותר ממעבר אפשרי אחד )ייתכנו מעברי-
לאות ומצב נתונים.( , האוטומט יכול להגיע למספר wלכל מילה •
כלשהו של מצבים או להיתקע. אם אחד מהם סופי, הקלט מתקבל.
62
שיטת העבודה
נהפוך את הביטויים הרגולריים לאוטומט •אי-דטרמיניסטי
נהפוך את האוטומט האי-דטרמיניסטי •לדטרמיניסטי
משפט: לכל אוטומט לא דטרמיניסטי קיים אוטומט –דטרמיניסטי שקול
במקרה הגרוע גודל האוטומט המתקבל –אקספוננציאלי בגודל האוטומט המקורי. אך בפועל
מתקבל אוטומט סביר. )עבור זיהוי לקסמות(נריץ את האוטומט הדטרמיניסטי על הקלט •
לזיהוי הביטוי המתאים.
באוטומטים למדנו על אוטומטים שרק מזהים •קלט )כן או לא(...
אבל כשתוכנית מריצה אוטומט על קלט אין •סיבה שלא תאסוף מידע בדרך )בפרט, אותיות
הקלט שנסקרו עד עתה, מספר השורה בקוד וכיו"ב(.
63
מביטויים רגולריים לאוטומט לא דטרמיניסטי
(0-9: הצב )את סימני הקבוצות כגון 1שלב • ,R1, R2וקבל סדרת ביטויים רגולריים טהורים
…, Rm.
לכל Mi: בנה אוטומט לא דטרמיניסטי 2שלב •Riביטוי רגולרי
המזהה את כל M: בנה אוטומט משולב 3שלב •הביטויים הרגולריים
לתשומת לב: ייתכן שישנם כמה דרכים לזהות •את הלקסמה הבאה בתור, אנו נעדיף בד"כ את
ביותר. הארוכה then כשם משתנה עדיף על thenutcrackerלמשל –
המילה השמורה. כמילה השמורה עדיף על thenאבל באותו אורך, –
then .כשם משתנה
64
סימונים
65
מביטוי רגולרי לאוטומט אי-דטרמיניסטי שקול
66
המצבים ההתחלתיים
והמקבלים במכונות
המקוריות הופכים למצבים רגילים
לאחר הבניה.
67
68
69
, איך נבצע את הניתוח הלקסיקלי ? patternבהינתן אוטומט לכל
70
נרכיב את כל האוטומטים שהתקבלו לאוטומט אחד גדול עם מצב אפשרי: patternסופי ייחודי לכל
71
שיטה נאיבית:ננסה כל אחד מהאוטומטים.
72
שיטה יותר יעילה היא שילוב כל האוטומטים לאחד, מעבר לאוטומט דטרמיניסטי, והרצה ארוכה ככל האפשר עד שנתקעים. כשנתקעים, זוכרים את המקום האחרון שבו
התקבלה מחרוזת ואותו מחזירים.
דוגמא:
73
מעבר לאוטומט דטרמיניסטי:
74
דוגמאות:
75
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
76
scanner generatorsymbol specification
Input program
scanner
token stream
scanning table
: מפורמליזם לתוכנהlexical analyzerה-
יתרונות•המפרט – קצר יחסית–אפשר לוודא שהמפרט תקין )לא אוטומטית!(–התוכנה קלה לתחזוקה–
שימושים נוספים generationלשיטת ה- •בקומפילציה ובשטחים נוספים
scanner
scanning table
driver
החלק הראשון מבוצע ע"י כותב הקומפיילר, החלק השני הופך
להיות השלב הראשון בקומפיילר.
77
: מפורמליזם לתוכנהlexical analyzerה-
- ביטויים רגולריים tokenתאור ה- • – אוטומט סופיscannerמבנה ה- •
הוא תוכנית המריצה אוטומט לפי טבלת driverה-–המעברים והקלט.
היא טבלת המעברים. scanning tableה- –
78
lexical analyzerתהליך בניית ה-
האפשריים כביטויים רגולריים.tokensבניית תיאור ה- • מכל סוגtokenהחלטה על תכונות שיישמרו בעת זיהוי –
מעבר לאוטומט דטרמניסטי כולל המתאר את כל הביטויים •האפשריים )טבלת מעברים( + שמירת תכונות.
.scanner generatorנעשה באופן אוטומטי ע"י –
של driver משמש את ה-scanner generatorהפלט של ה-•הניתוח הלקסיקלי.
והטבלאות של השפה הופכים להיות החלק הראשון של driverה-–הקומפיילר.
79
טיפול בשגיאות
בשלב הניתוח הלקסיקלי יש שגיאות רבות שלא •ניתן לגלות.
…, קשה ) )fi ) a == f)x עבור הביטוי למשל:•, או שם רוטינה. if הוא שיבוש של fiלדעת אם
בשלב יותר מאוחר של האנליזה נגלה זאת.–. identifier עבור tokenבשלב זה פשוט נעביר –
אבל לפעמים יש שגיאה ברורה כבר בשלב זה •– כאשר לא ניתן לשייך את הלקסמה
. מה עושים? patternשהתגלתה לשום השיטה הקלה ביותר: לסלק אותיות מהקלט עד •
שמתגלה התחלה של לקסמה חוקית. אפשרויות נוספות: לסלק אות אחת, להוסיף •
אות אחת, להחליף אות אחת, להחליף סדר של שתי אותיות סמוכות.
המטרה: לאפשר המשך הקומפילציה עם •מינימום הפרעה.
הקושי – התפשטות השגיאות.•
80
סיכוםלרוב השפות ניתן לכתוב ביטויים רגולריים לכל הלקסמות הרלוונטיות.•משלבים את כל הביטויים לאוטומט אי-דטרמיניסטי יחיד•הופכים את האוטומט לדטרמיניסטי•מריצים לגילוי לקסמה אחר לקסמה, אוספים מידע בדרך )למשל שם •
המשתנה(מודיעים על שגיאות ומנסים לתקן. •
לרוב שפות התכנות ניתן לבנות מנתח לקסיקלי בקלות. •. Fortran, PL/1יוצאי דופן:
ישנם כלים שבונים מנתח לקסיקלי בהינתן ביטויים רגולריים. •יש להם שימושים גם מחוץ לתחום הקומפיילרים, במקומות בהם דרוש ניתוח
אוטומטי של קלטים, למשל, מערכות שאילתות.
בתרגולים ובתרגיל הבית תכירו כלי אחד כזה: Lex
top related