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

Preview:

DESCRIPTION

תורת הקומפילציה 236360 הרצאה 1 מבוא; ניתוח לקסיקלי. תורת הקומפילציה 236360. מרצה: פרופ"ח ארז פטרנק erez@cs שעת קבלה – יום חמישי 13:30-14:30 טאוב 528 מתרגלים קירה רדינסקי , מתרגלת אחראית גלעד קותיאל. אדמיניסטרציה. אתר: http://webcourse.cs.technion.ac.il/236360 25% - תרגילי בית - PowerPoint PPT Presentation

Citation preview

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

Recommended