ÌåôáãëùôôéóôÝò. Áðñßëéïò 2011

Σχετικά έγγραφα
Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Λεκτική Ανάλυση. Μεταγλωττιστές. Νίκος Παπασπύου, Κωστής Σαγώνας

Τυπικές Γλώσσες. Μεταγλωττιστές. (μέρος 1ο) Νίκος Παπασπύου, Κωστής Σαγώνας

Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο. Εισαγωγή. Μεταγλωττιστές. Νίκος Παπασπύου, Κωστής Σαγώνας

Τυπικές Γλώσσες. Μεταγλωττιστές. (μέρος 2ο) Νίκος Παπασπύου, Κωστής Σαγώνας

Συντακτική ανάλυση. Μεταγλωττιστές. (μέρος 1ον) Νίκος Παπασπύου, Κωστής Σαγώνας

Σημασιολογική ανάλυση

Υλοποίηση ΣΑ με το bison

Υλοποίηση ΣΑ με το bison

Συντακτική ανάλυση. Μεταγλωττιστές. (μέρος 3ον) Νίκος Παπασπύου, Κωστής Σαγώνας

Υλοποίηση ΛΑ με το flex

ÌåôáãëùôôéóôÝò. ÅéóáãùãÞ. ÅéóáãùãÞ (ii) Íßêïò Ðáðáóðýñïõ ÊùóôÞò Óáãþíáò. Áñ éêþ ãëþóóá L A A T ÔåëéêÞ ãëþóóá L T Y

ÊåöÜëáéï 3 ÏÑÉÆÏÕÓÅÓ. 3.1 ÅéóáãùãÞ

16. ÌåëÝôç ôùí óõíáñôþóåùí y=çìx, y=óõíx êáé ôùí ìåôáó çìáôéóìþí ôïõò.

ÓÕÍÄÕÁÓÔÉÊÇ É, ÓÅÐÔÅÌÂÑÉÏÓ ÏÌÁÄÁ ÈÅÌÁÔÙÍ Á

Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Μεταγλωττιστές Ενδιάμεσος Κώδικας Νίκος Παπασπύου, Κωστής Σαγώνας

ÓÕÍÄÕÁÓÔÉÊÇ É, ÓÅÐÔÅÌÂÑÉÏÓ ÏÌÁÄÁ ÈÅÌÁÔÙÍ B

¼ñãáíá Èåñìïêñáóßáò - ÓõóêåõÝò Øõêôéêþí Ìç áíçìüôùí

Κεφάλαιο 2: Τυπικές γλώσσες

ÊåöÜëáéï 4 ÄÉÁÍÕÓÌÁÔÁ. 4.1 ÅéóáãùãÞ (ÃåùìåôñéêÞ)

Ç ãëþóóá Grace. ÌåôáãëùôôéóôÝò 2009 ÈÝìá åñãáóßáò

Ç ãëþóóá Alan. ÌåôáãëùôôéóôÝò 2011 ÈÝìá åñãáóßáò

Ó ÅÄÉÁÓÌÏÓ - ÊÁÔÁÓÊÅÕÇ ÓÔÏÌÉÙÍ & ÅÉÄÉÊÙÍ ÅÎÁÑÔÇÌÁÔÙÍ ÊËÉÌÁÔÉÓÌÏÕ V X

ÏñãÜíùóç ÐñïãñÜììáôïò

( ) ξî τέτοιο, + Ý åé ìßá ôïõëü éóôïí ñßæá óôï äéüóôçìá ( ) h x =,να δείξετε ότι υπάρχει ( α,β) x ΕΦΑΡΜΟΓΕΣ ΣΤΙΣ ΠΑΡΑΓΩΓΟΥΣ

Παρουσίαση του εργαλείου BISON

Ç ãëþóóá Tony. ÌåôáãëùôôéóôÝò 2010 ÈÝìá åñãáóßáò

Μεταγλωττιστές. Εργαστήριο 5. Εισαγωγή στο BISON. Γεννήτρια Συντακτικών Αναλυτών. 2 η Φάση Μεταγλώττισης Συντακτική Ανάλυση

Κεφάλαιο 2: Τυπικές γλώσσες. Νίκος Παπασπύρου, Κωστής Σαγώνας Μεταγλωττιστές Μάρτιος / 216

3.1 Íá âñåèåß ôï ðåäßï ïñéóìïý ôçò óõíüñôçóçò f: 4 x. (iv) f(x, y, z) = sin x 2 + y 2 + 3z Íá âñåèïýí ôá üñéá (áí õðüñ ïõí): lim

Ç ãëþóóá Dana. ÌåôáãëùôôéóôÝò 2008 ÈÝìá åñãáóßáò

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

ÄéáêñéôÝò êáé óõíå åßò ôõ áßåò ìåôáâëçôýò ÁóêÞóåéò

ÓÕÍÈÇÊÇ ÁÌÅÔÁÈÅÔÏÔÇÔÁÓ ÓÕÓÔÇÌÁÔÏÓ ÔÏÉ ÙÌÁÔÙÍ ÐÁÑÁÑÔÇÌÁ Â

ÊåöÜëáéï 5 ÄÉÁÍÕÓÌÁÔÉÊÏÉ ÙÑÏÉ. 5.1 ÅéóáãùãÞ. 56 ÊåöÜëáéï 5. ÄÉÁÍÕÓÌÁÔÉÊÏÉ ÙÑÏÉ

Ãëþóóá ôåôñüäùí. ÌïñöÞ ôåôñüäáò: n: op, x, y, z üðïõ:

Γλώσσες Προγραμματισμού Μεταγλωττιστές. Συντακτική Ανάλυση με το Εργαλείο BISON

7. ÂáóéêÜ óôïé åßá ðñïãñáììáôéóìïý

2.4 ñçóéìïðïéþíôáò ôïí êáíüíá áëõóßäáò íá âñåèåß ç dr

3.1 H Ýííïéá ôçò óõíüñôçóçò ÐÁÑÁÄÅÉÃÌÁÔÁ - ÅÖÁÑÌÏÃÅÓ

ÁðáñéèìçôÝò- ÓõãêñéôÝò

Cel animation. ÅöáñìïãÝò ðïëõìýóùí

ÁíÜðôõîç åöáñìïãþí óå ðñïãñáììáôéóôéêü ðåñéâüëëïí

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

ιαδικασία åãêáôüóôáóçò MS SQL Server, SingularLogic Accountant, SingularLogic Accountant Ìéóèïäïóßá

ΕΛΕΝΗ ΓΕΡΟΥΛΑΝΟΥ. Εικονογράφηση ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ ΓΙΑ ΠΑΙΔΙΑ ΝΗΠΙΑΓΩΓΕΙΟΥ ΛΗΔΑ ΒΑΡΒΑΡΟΥΣΗ ΕΚΔΟΣΕΙΣ ΠΑΠΑΔΟΠΟΥΛΟΣ

Ðñïêýðôïõí ôá ðáñáêüôù äéáãñüììáôá.

Óõíå Þ êëüóìáôá & Áöáéñåôéêüò Åõêëåßäåéïò áëãüñéèìïò

Μεταγλωττιστές. Δημήτρης Μιχαήλ. Ακ. Έτος Συντακτική Ανάλυση. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

1. Íá ëõèåß ç äéáöïñéêþ åîßóùóç (15 ìïí.) 2. Íá âñåèåß ç ãåíéêþ ëýóç ôçò äéáöïñéêþò åîßóùóçò (15 ìïí.)

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

8. ÅðéëïãÞ êáé åðáíüëçøç

DOS Microsoft Windows... 65

µµ Setup : µ 2005

Ìáèáßíïõìå ôéò áðïäåßîåéò

: Ï ïäçãüò áõôüò åîçãåß ôïí ôñüðï áíôéêáôüóôáóçò êáé áíáâüèìéóçò ôçò ìíþìçò óôïí õðïëïãéóôþ.

ÅñãáóôÞñéï 1. ÄïìÝò ÄåäïìÝíùí. 1.1 Óôü ïé. 1.2 Áðáñáßôçôï Õëéêü

Παρουσίαση του εργαλείου BISON

Εισαγωγή. Γλώσσες προγραμματισμού Μεταγλωττιστές Αναγκαιότητα και ιστορική αναδρομή

B i o f l o n. Ãéá åöáñìïãýò ìåôáöïñüò çìéêþí

Áóõìðôùôéêïß Óõìâïëéóìïß êáé Éåñáñ ßá ÓõíáñôÞóåùí

: Ï ïäçãüò áõôüò åîçãåß ôïí ôñüðï áíôéêáôüóôáóçò êáé áíáâüèìéóçò ôçò ìíþìçò óôïí õðïëïãéóôþ.

ÅÍÏÔÇÔÁ 6ç ÑÏÍÏÓ-ÄÉÁÄÏ Ç

Εργαστήριο 4_1 Λεκτική Ανάλυση - Flex Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Üóêçóç 15. ÕëéêÜ - åîáñôþìáôá äéêôýïõ ðåðéåóìýíïõ áýñá êáé ðíåõìáôéêýò óõóêåõýò

Ανώτερα Μαθηματικά Ι. Ανοικτά Ακαδημαϊκά Μαθήματα. Ενότητα 7: Οριακή Τιμή Συνάρτησης. Αθανάσιος Μπράτσος. Τμήμα Ναυπηγών Μηχανικών ΤΕ

ÌÁÈÇÌÁÔÉÊÇ ËÏÃÉÊÇ Ë1 5ï ðáêýôï áóêþóåùí

å) Íá âñåßôå ôï äéüóôçìá ðïõ äéáíýåé ôï êéíçôü êáôü ôï ñïíéêü äéüóôçìá áðü ôï ðñþôï Ýùò ôï Ýâäïìï äåõôåñüëåðôï ôçò êßíçóþò ôïõ.

Chi-Square Goodness-of-Fit Test*

: Ï ïäçãüò áõôüò åîçãåß ôïí ôñüðï áíôéêáôüóôáóçò êáé áíáâüèìéóçò ôçò ìíþìçò óôïí õðïëïãéóôþ.

Γλώσσες Προγραμματισμού Μεταγλωττιστές. Σημασιολογική Ανάλυση

ÌÅÑÏÓ 3 ΥΠΗΡΕΣΙΕΣ ΥΠΟΣΤΗΡΙΞΗΣ ΤΗΣ ΚΛΙΝΙΚΗΣ ΠΡΑΞΗΣ ÁÐÁÉÔÇÓÅÙÍ ÕÐÇÑÅÓÉÙÍ. Υπηρεσίες Ιατρικής Πληροφορικής και Τηλεϊατρικής 9 ÂÁÓÉÊÅÓ ÊÁÔÅÕÈÕÍÓÅÉÓ

J-Y(St)Y Ôçëåöùíéêü êáëþäéï åóùôåñéêïý þñïõ ìå èùñüêéóç êáôü VDE 0815

ÕÄÑÏËÇØÉÅÓ ÔÕÐÏÕ Á2 - Á4 ÌÅ ÁÍÔÉÐÁÃÅÔÉÊÇ ÐÑÏÓÔÁÓÉÁ

ÁñéèìçôéêÞ ÁíÜëõóç É - ÓÅÌÖÅ Åñãáóßá 2 ìåóåò êáé åðáíáëçðôéêýò ìýèïäïé

ÏÑÉÁÊÇ ÔÉÌÇ ÓÕÍÁÑÔÇÓÇÓ

9. ÁíÜðôõîç ðñïãñáììüôùí ìå ñïíéêýò ëåéôïõñãßåò.

4.5 ÁóêÞóåéò çìéêþò éóïññïðßáò ìå åðßäñáóç óôç èýóç éóïññïðßáò

1.1 Ïé öõóéêïß áñéèìïß - ÄéÜôáîç öõóéêþí, Óôñïããõëïðïßçóç

Estimation Theory Exercises*

Ç íýá Ýííïéá ôïõ ýðíïõ!

ÐïëëÝò åôáéñßåò ðñïóöýñïõí õðçñåóßåò

ÅõñùðáúêÞ íùóç Áëïõìéíßïõ Ý åé äçìïóéåýóåé Ýíáí ìßíé - ïäçãü åðåîþãçóçò

Μεταγλωττιστές. Δημήτρης Μιχαήλ. Ακ. Έτος Ανοδικές Μέθοδοι Συντακτικής Ανάλυσης. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ÅÍÏÔÇÔÁ 5ç ÔÁ Ó ÇÌÁÔÁ

ATHINA COURT. ÐïëõôåëÞ Äéáìåñßóìáôá

Äéá åßñéóç äåäïìýíùí

8.1 Ãåíéêüò äéäáêôéêüò óêïðüò

: Ï ðáñþí ïäçãüò åîçãåß ôïí ôñüðï ñþóçò ðñïáéñåôéêþí åîùôåñéêþí óõóêåõþí ìå ôïí õðïëïãéóôþ.

3524 ÅÖÇÌÅÑÉÓ ÔÇÓ ÊÕÂÅÑÍÇÓÅÙÓ (ÔÅÕ ÏÓ ÄÅÕÔÅÑÏ)

: Ï ïäçãüò áõôüò åîçãåß ôïí ôñüðï áíôéêáôüóôáóçò êáé áíáâüèìéóçò ôçò ìíþìçò óôïí õðïëïãéóôþ.

Μαθηματικά ΙΙΙ. Ανοικτά Ακαδημαϊκά Μαθήματα. Ενότητα 16: Προσέγγιση συνήθων διαφορικών εξισώσεων Μέρος ΙΙ. Αθανάσιος Μπράτσος

Μαθηματικά ΙΙΙ. Ανοικτά Ακαδημαϊκά Μαθήματα. Ενότητα 15: Προσέγγιση συνήθων διαφορικών εξισώσεων Μέρος Ι. Αθανάσιος Μπράτσος

: Ï ïäçãüò áõôüò ðåñéãñüöåé ôïí ôñüðï ñþóçò êáñôþí åîùôåñéêþí ìýóùí ìå ôïí õðïëïãéóôþ.

MultiBoot :

ÐÉÍÁÊÅÓ ÔÉÌÙÍ ÁÍÔÉÊÅÉÌÅÍÉÊÙÍ ÁÎÉÙÍ

ÐÁÍÅÐÉÓÔÇÌÉÏ ÐÅËÏÐÏÍÍÇÓÏÕ ÁÊÁÄÇÌÁÚÊÏ ÅÔÏÓ ÔÑÉÐÏËÇ

ÓÕÍÁÑÔÇÓÅÉÓ ÐÏËËÙÍ ÌÅÔÁÂËÇÔÙÍ

1. i) ÊÜèå üñïò ðñïêýðôåé áðü ôçí ðñüóèåóç ôïõ óôáèåñïý áñéèìïý 3 óôïí ðñïçãïýìåíï, ïðüôå Ý ïõìå áñéèìçôéêþ ðñüïäï á í ìå ðñþôï üñï

Union of Pure and Applied Chemistry).

ÖÅÊ 816 ÅÖÇÌÅÑÉÓ ÔÇÓ ÊÕÂÅÑÍÇÓÅÙÓ (ÔÅÕ ÏÓ ÄÅÕÔÅÑÏ) ÏÄÇÃÉÅÓ ÐÁ ÔÇ ÓÕÌÐËÇÑÙÓÇ ÔÇÓ ÁÉÔÇÓÇÓ ÅÃÊÅÊÑÉÌÅÍÏÕ ÁÐÏÈÇÊÅÕÔÇ Ï ÇÌÁÔÙÍ 1. ÇÌÅÑÏÌÇÍÉÁ: ÁíáãñÜöåô

Transcript:

ÌåôáãëùôôéóôÝò Íßêïò Ðáðáóðýñïõ {nickie}@softlab.ntua.gr ÊùóôÞò Óáãþíáò {kostis}@cs.ntua.gr Åèíéêü Ìåôóüâéï Ðïëõôå íåßï Ó ïëþ Çëåêôñïëüãùí Ìç. êáé Ìç. Õðïëïãéóôþí ÅñãáóôÞñéï Ôå íïëïãßáò Ëïãéóìéêïý Ðïëõôå íåéïýðïëç, 15780 ÆùãñÜöïõ. Áðñßëéïò 2011 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 1 / 216

ÅéóáãùãÞ (i) Ãëþóóåò ðñïãñáììáôéóìïý ÌåôáãëùôôéóôÝò Áíáãêáéüôçôá êáé éóôïñéêþ áíáäñïìþ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 2 / 216

ÅéóáãùãÞ (i) Ãëþóóåò ðñïãñáììáôéóìïý ÌåôáãëùôôéóôÝò Áíáãêáéüôçôá êáé éóôïñéêþ áíáäñïìþ αρχικό πρόγραµµα τελικό πρόγραµµα µεταγλωττιστής διαγνωστικά µηνύµατα Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 2 / 216

ÅéóáãùãÞ (ii) Áñ éêþ ãëþóóá L A A T ÔåëéêÞ ãëþóóá L T Ãëþóóá õëïðïßçóçò L Y Y Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 3 / 216

ÅéóáãùãÞ (ii) Áñ éêþ ãëþóóá L A A T ÔåëéêÞ ãëþóóá L T Ãëþóóá õëïðïßçóçò L Y Y Óçìáóéïëïãßá ôïõ ðñïãñüììáôïò P óôç ãëþóóá L [[P ]] L : Inp(P ) Out(P ) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 3 / 216

ÅéóáãùãÞ (ii) Áñ éêþ ãëþóóá L A A T ÔåëéêÞ ãëþóóá L T Ãëþóóá õëïðïßçóçò L Y Y Óçìáóéïëïãßá ôïõ ðñïãñüììáôïò P óôç ãëþóóá L [[P ]] L : Inp(P ) Out(P ) Óçìáóßá åíüò ìåôáãëùôôéóôþ C [[C ]] LY : L A L T Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 3 / 216

ÅéóáãùãÞ (iii) Ïñèüôçôá ôïõ ìåôáãëùôôéóôþ: \ôï ìåôáãëùôôéóìýíï ðñüãñáììá ðñýðåé íá åßíáé éóïäýíáìï ìå ôï áñ éêü" Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 4 / 216

ÅéóáãùãÞ (iii) Ïñèüôçôá ôïõ ìåôáãëùôôéóôþ: \ôï ìåôáãëùôôéóìýíï ðñüãñáììá ðñýðåé íá åßíáé éóïäýíáìï ìå ôï áñ éêü" [[P ]] LA = [[[[C ]] LY (P )]] LT Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 4 / 216

ÅéóáãùãÞ (iv) Åßäç ìåôáãëùôôéóôþí: Áðëïß Áíôßóôñïöïé (decompilers) Ìåôá-ìåôáãëùôôéóôÝò (meta-compilers) ÅéäéêÝò ðåñéðôþóåéò ìåôáãëùôôéóôþí: ÐñïåðåîåñãáóôÝò (preprocessors) ÓõìâïëïìåôáöñáóôÝò (assemblers) ÃåííÞôïñåò ðñïãñáììüôùí (program generators) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 5 / 216

ÅéóáãùãÞ (v) ÓõíáöÞ åñãáëåßá Äéåñìçíåßò (interpreters) Äéá åéñéóôýò âéâëéïèçêþí (library managers) ÓõíäÝôåò (linkers) ÖïñôùôÝò (loaders) Åêäüôåò ðñïãñáììüôùí (program editors) ÅíôïðéóôÝò óöáëìüôùí (debuggers) Óôáôéóôéêïß áíáëõôýò (prolers) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 6 / 216

ÊáôáóêåõÞ ìåôáãëùôôéóôþ (i) ÂáóéêÝò áðáéôþóåéò: Íá ëåéôïõñãåß óùóôü Íá óõììïñöþíåôáé ìå ôéò ðñïäéáãñáöýò ôçò áñ éêþò êáé ôçò ôåëéêþò ãëþóóáò Íá ìåôáãëùôôßæåé ðñïãñüììáôá êüèå ìåãýèïõò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 7 / 216

ÊáôáóêåõÞ ìåôáãëùôôéóôþ (ii) Åðéðñüóèåôåò áðáéôþóåéò: Íá ðáñüãåé áðïäïôéêü êþäéêá Íá Ý åé ìéêñü ñüíï ìåôáãëþôôéóçò Íá Ý åé ìéêñýò áðáéôþóåéò ìíþìçò êáôü ôç ìåôáãëþôôéóç Íá äßíåé êáëü äéáãíùóôéêü ìçíýìáôá Íá óõíå ßæåé ýóôåñá áðü ëüèç Íá åßíáé ìåôáöýñóéìïò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 8 / 216

ÖÜóåéò êáé ðñïúüíôá ôçò ìåôáãëþôôéóçò αρχικό πρόγραµµα ËåêôéêÞ áíüëõóç Λεκτική ανάλυση λεκτικές µονάδες ÓõíôáêôéêÞ áíüëõóç Συντακτική Ανάλυση ÓçìáóéïëïãéêÞ áíüëõóç συντακτικό δέντρο Σηµασιολογική Ανάλυση ÐáñáãùãÞ åíäéüìåóïõ êþäéêá Πίνακας συµβόλων συντακτικό δέντρο Παραγωγή ενδιάµεσου κώδικα Χειριστής σφαλµάτων Âåëôéóôïðïßçóç ενδιάµεσος κώδικας Βελτιστοποίηση ενδιάµεσου κώδικα ÐáñáãùãÞ ôåëéêïý êþäéêá ενδιάµεσος κώδικας Παραγωγή τελικού κώδικα τελικός κώδικας Βελτιστοποίηση τελικού κώδικα τελικό πρόγραµµα Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 9 / 216

ÈÝìáôá õëïðïßçóçò ÏñãÜíùóç óå ðåñüóìáôá ÏñãÜíùóç óå åìðñüóèéï êáé ïðßóèéï ôìþìá (front-end / back-end) ëåã ïò ïñèüôçôáò Åßäç äéáãíùóôéêþí ìçíõìüôùí êáé áíüíçøç ÅóùôåñéêÜ (internal) ÓöÜëìáôá (errors) ÐñïåéäïðïéçôéêÜ ìçíýìáôá (warnings) ÁðëÜ ìçíýìáôá (messages) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 10 / 216

Åêêßíçóç { bootstrapping A T A T A T A A T T S S T T T ÂÞìá 1: ÌåôáãëùôôéóôÞò ãéá S A óôçí T. ÂÞìá 2: ÌåôáãëùôôéóôÞò ãéá ôçí A óôçí S. ÂÞìá 3: ÌåôáãëùôôéóôÞò ãéá ôçí A óôçí A. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 11 / 216

ÏñãÜíùóç óå Ýíá ðýñáóìá Εµπρόσθιο τµήµα Συντακτικός αναλυτής Λεκτικός αναλυτής Σηµασιολογικός αναλυτής Γεννήτορας ενδιάµεσου κώδικα Βελτιστοποιητής ενδιάµεσου κώδικα Χειριστής σφαλµάτων Πίνακας συµβόλων Γεννήτορας τελικού κώδικα Βελτιστοποιητής τελικού κώδικα Οπίσθιο τµήµα Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 12 / 216

ÊåöÜëáéï 2: ÔõðéêÝò ãëþóóåò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 13 / 216

ÔõðéêÝò ãëþóóåò (i) ÂáóéêÝò Ýííïéåò ÁëöÜâçôï Óýìâïëï ÓõìâïëïóåéñÜ ÌÞêïò óõìâïëïóåéñüò Óýíïëï óõìâïëïóåéñþí ìþêïõò n Óýíïëï üëùí ôùí óõìâïëïóåéñþí Σ = Σ n n=0 Σ a α α Σ n Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 14 / 216

ÔõðéêÝò ãëþóóåò (ii) ÂáóéêÝò Ýííïéåò ÊåíÞ óõìâïëïóåéñü (óõíý åéá) ÐáñÜèåóç óõìâïëïóåéñþí ÐáñÜèåóç óõìâïëïóåéñüò ìå ôïí åáõôü ôçò α 0 = ɛ α n+1 = αα n Ðñüèåìá, åðßèåìá, õðïóõìâïëïóåéñü ɛ αβ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 15 / 216

ÔõðéêÝò ãëþóóåò (iii) ÂáóéêÝò Ýííïéåò Ãëþóóá (óõíý åéá) íùóç ãëùóóþí L 1 L 2 = { α α L 1 α L 2 } ÐáñÜèåóç ãëùóóþí L 1 L 2 = { αβ α L 1 β L 2 } ÐáñÜèåóç ãëþóóáò ìå ôïí åáõôü ôçò L 0 = { ɛ } L n+1 = LL n Êëåßóéìï Þ Üóôñï ôïõ Kleene L = L n L + = LL n=0 L Σ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 16 / 216

ÔõðéêÝò ãëþóóåò (iv) ÃåííçôéêÜ ìïíôýëá ÃñáììáôéêÞ G = (T, N, P, S) T : ôåñìáôéêü óýìâïëá a N : ìç ôåñìáôéêü óýìâïëá A P : êáíüíåò ðáñáãùãþò α β S : áñ éêü óýìâïëï ÐáñáãùãÝò: áí α, β, γ, δ (T N) êáé (α β) P ôüôå γαδ γβδ Ãëþóóá: L(G) = { α T S + α } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 17 / 216

ÔõðéêÝò ãëþóóåò (v) Éåñáñ ßá Chomsky Ôýðïõ 0: üëåò ïé ãñáììáôéêýò, α β Ôýðïõ 1: ãñáììáôéêýò ìå óõìöñáæüìåíá (context-sensitive), α β ìå α β Ôýðïõ 2: ãñáììáôéêýò ùñßò óõìöñáæüìåíá (context-free) A β Ôýðïõ 3: êáíïíéêýò ãñáììáôéêýò (regular) A ab Þ A a ÅéäéêÞ ðåñßðôùóç: ãëþóóåò ðïõ ðáñüãïõí ôçí êåíþ óõìâïëïóåéñü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 18 / 216

ÔõðéêÝò ãëþóóåò (vi) ÁíáãíùñéóôÝò Ôýðïõ 0: ìç áíþ Turing Ôýðïõ 1: ãñáììéêü ðåñéïñéóìýíç ìç áíþ Turing Ôýðïõ 2: áõôüìáôá óôïßâáò (push-down automata) ñþóéìá óôç óõíôáêôéêþ áíüëõóç Ôýðïõ 3: ðåðåñáóìýíá áõôüìáôá (nite automata) ñþóéìá óôç ëåêôéêþ áíüëõóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 19 / 216

ÊáíïíéêÝò ãëþóóåò (i) ÊáíïíéêÝò ãñáììáôéêýò Ìüíï êáíüíåò A ab Þ A a éóïäýíáìá A Ba Þ A a ÊáíïíéêÝò åêöñüóåéò (regular expressions) ÊåíÞ óõìâïëïóåéñü: ɛ ÊÜèå óýìâïëï ôïõ Σ: a ÐáñÜèåóç äýï êáíïíéêþí åêöñüóåùí: (rs) ÄéÜæåõîç äýï êáíïíéêþí åêöñüóåùí: (r s) Êëåßóéìï (Þ Üóôñï) Kleene: (r ) Óõíôïìïãñáößåò: áðáëïéöþ ðåñéôôþí ðáñåíèýóåùí r + [a 1, a 2,..., a n ] [a 1 a 2 ] r?. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 20 / 216

ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216

ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216

ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216

ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216

ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ([1-9][0-9] 0) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216

ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ðñïáéñåôéêü: õðïäéáóôïëþ êáé êëáóìáôéêü ìýñïò ([1-9][0-9] 0) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216

ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ðñïáéñåôéêü: õðïäéáóôïëþ êáé êëáóìáôéêü ìýñïò ([1-9][0-9] 0)(\.[0-9] + )? Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216

ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ðñïáéñåôéêü: õðïäéáóôïëþ êáé êëáóìáôéêü ìýñïò ðñïáéñåôéêü: åêèýôçò ìå Þ ùñßò ðñüóçìï ([1-9][0-9] 0)(\.[0-9] + )? Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216

ÊáíïíéêÝò ãëþóóåò (ii) Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ðñïáéñåôéêü: õðïäéáóôïëþ êáé êëáóìáôéêü ìýñïò ðñïáéñåôéêü: åêèýôçò ìå Þ ùñßò ðñüóçìï ([1-9][0-9] 0)(\.[0-9] + )?((E e)(+ )?[0-9] + )? Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 21 / 216

ÐåðåñáóìÝíá áõôüìáôá (i) 0 0 A 1 1 B ÊáôáóôÜóåéò êáé ìåôáâüóåéò ÍôåôåñìéíéóôéêÜ (ÍÐÁ), ìç íôåôåñìéíéóôéêü (ÌÐÁ) êáé ÌÐÁ ìå êåíýò ìåôáâüóåéò (ÌÐÁ-ɛ) Áñ éêþ êáôüóôáóç, ôåëéêýò êáôáóôüóåéò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 22 / 216

ÐåðåñáóìÝíá áõôüìáôá (ii) 0 0 A 1 1 B Ðïéá ãëþóóá áíáãíùñßæåé; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 23 / 216

ÐåðåñáóìÝíá áõôüìáôá (ii) 0 0 A 1 1 B Ðïéá ãëþóóá áíáãíùñßæåé; Ôç ãëþóóá ôùí óõìâïëïóåéñþí ðïõ áðïôåëïýíôáé áðü 0 êáé 1 êáé ðåñéý ïõí Üñôéï áñéèìü 1 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 23 / 216

ÊáíïíéêÝò ãëþóóåò, áíáóêüðçóç ÁíáãùãÝò êáé éóïäõíáìßåò êáíïíéêþ ãñáììáôéêþ ÌÐÁ-ɛ êáíïíéêþ Ýêöñáóç ÌÐÁ-ɛ ÌÐÁ-ɛ Åëá éóôïðïßçóç ÍÐÁ ÌÐÁ-ɛ êáíïíéêþ ãñáììáôéêþ ÌÐÁ-ɛ êáíïíéêþ Ýêöñáóç ÍÐÁ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 24 / 216

ÊåöÜëáéï 3: ËåêôéêÞ áíüëõóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 25 / 216

ËåêôéêÞ áíüëõóç ËåêôéêÝò ìïíüäåò (tokens) Áíáãíùñßæïíôáé ìå ðåðåñáóìýíá áõôüìáôá ðïõ: äéáâüæïõí åíäå ïìýíùò ðåñéóóüôåñïõò áñáêôþñåò ïðéóèïäñïìïýí áí ñåéáóôåß äéáèýôïõí Ýîïäï ðïõ ñçóéìïðïéåßôáé óôç óõíôáêôéêþ áíüëõóç Åéäéêüò óõìâïëéóìüò: äéáãñüììáôá ìåôüâáóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 26 / 216

ÄéáãñÜììáôá ìåôüâáóçò (i) ÁíáãíùñéóôéêÜ ôçò Pascal L 0 L 1 D Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 27 / 216

ÄéáãñÜììáôá ìåôüâáóçò (i) ÁíáãíùñéóôéêÜ ôçò Pascal L 0 L 1 D L L * όχι L/D 0 1 2 (T_id) D Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 27 / 216

ÄéáãñÜììáôá ìåôüâáóçò (ii) ÔåëåóôÝò > êáé >= 0 > 1 = 2 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 28 / 216

ÄéáãñÜììáôá ìåôüâáóçò (ii) ÔåëåóôÝò > êáé >= 0 > 1 = 2 * όχι = 2 (T_gt) 0 > 1 = 3 (T_ge) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 28 / 216

ÊáôáóêåõÞ ôïõ ËÁ (i) ÊáôáãñáöÞ êáé ôáîéíüìçóç áñáêôþñùí mapping : (ASCII { EOF }) Σ ÊáôáãñáöÞ êáé ôáîéíüìçóç ëåêôéêþí ìïíüäùí Êùäéêïðïßçóç ëåêôéêþí ìïíüäùí Áêïëïõèßá áñáêôþñùí (lexeme) Ó åäßáóç ôïõ äéáãñüììáôïò ìåôüâáóçò Õëïðïßçóç ôïõ ëåêôéêïý áíáëõôþ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 29 / 216

ÊáôáóêåõÞ ôïõ ËÁ (ii) ÅðéìÝñïõò èýìáôá Ôñüðïò äéá ùñéóìïý ëåêôéêþí ìïíüäùí Ó üëéá ÄéÜêñéóç ðåæþí / êåöáëáßùí ãñáììüôùí ÅíäéÜìåóç ìíþìç (buer) ÁíÜíçøç áðü óöüëìáôá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 30 / 216

ÊáôáóêåõÞ ôïõ ËÁ (iii) W 0. ; ( ) = + - EOF * 20 21 22 23 26 30 31 45 (T_dot) (T_smcolon) (T_lparen) (T_rparen) (T_eq) (T_plus) (T_minus) (T_eof) : < > / * Ó åäßáóç óõíïëéêïý äéáãñüììáôïò ìåôüâáóçò = 24 (T_assign) L E 1 6 40 όχι = * (T_colon) = όχι = = όχι = = όχι = * όχι * 25 (T_le) όχι L E D _ 2 3 4 5 45 41 (T_lt) * * 27 (T_ge) 42 (T_gt) * 28 (T_ne) 43 (T_div) * 29 (T_power) 44 (T_times) * L E D _ (T_id) όχι D. Ε όχι D Ε D * D 7. 8 E + - 9 10 D 11 όχι D 46 D Ε D D (T_const) { 12 } 0 όχι } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 31 / 216

ÊáôáóêåõÞ ôïõ ËÁ (iv) Åíáëëáêôéêïß ôñüðïé õëïðïßçóçò: åéñùíáêôéêü Ìå ðßíáêá ìåôáâüóåùí Ìå ôï ìåôáåñãáëåßï ex Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 32 / 216

Õëïðïßçóç ËÁ ìå ôï ex (i) Ìåôáåñãáëåßï ex: ãåííþôïñáò ËÁ Åßóïäïò: ìåôáðñüãñáììá ðïõ ðåñéãñüöåé ôéò ëåêôéêýò ìïíüäåò îïäïò: ðñüãñáììá óå C Ç óõíüñôçóç yylex õëïðïéåß ôï ËÁ ÅðéóôñÝöåé ôïí êùäéêü ôçò ëåêôéêþò ìïíüäáò ðïõ áíáãíùñßóôçêå, Þ 0 óôï ôýëïò ôçò óõìâïëïóåéñüò åéóüäïõ Ôïðïèåôåß óôç ìåôáâëçôþ yytext ôçí áíôßóôïé ç áêïëïõèßá áñáêôþñùí (lexeme) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 33 / 216

Õëïðïßçóç ËÁ ìå ôï ex (ii) ÄïìÞ ôïõ ìåôáðñïãñüììáôïò ÌÝñïò Á %% ÌÝñïò Â %% ÌÝñïò Ã Êáé ôá ôñßá ìýñç ìðïñïýí íá åßíáé êåíü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 34 / 216

Õëïðïßçóç ËÁ ìå ôï ex (iii) ÌÝñïò Á, ðåñéý åé Ó üëéá, üðùò óôç C Êþäéêá C, ìýóá óå %{ êáé %} ÌíçìïíéêÜ ïíüìáôá ùò óõíôïìïãñáößåò êáíïíéêþí åêöñüóåùí Äçëþóåéò áñ éêþí êáôáóôüóåùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 35 / 216

Õëïðïßçóç ËÁ ìå ôï ex (iv) ÌÝñïò Á, ðáñüäåéãìá %{ #define T_eof 0 #define T_id 1... #define T_while 52 void ERROR (const char msg []); %} L [A-Za-z] /* letters */ D [0-9] /* digits */ W [ \t\n] /* white space */ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 36 / 216

Õëïðïßçóç ËÁ ìå ôï ex (v) ÌÝñïò Â, ðåñéý åé êáíüíåò ôçò ìïñöþò êáíïíéêþ Ýêöñáóç åíýñãåéá ÊÜèå åíýñãåéá åßíáé ìéá åíôïëþ ôçò C Ëåéôïõñãßá: ÄéáâÜæåôáé ôï ìáêñýôåñï ðñüèåìá ôçò óõìâïëïóåéñüò åéóüäïõ ðïõ ìðïñåß íá áíáãíùñéóôåß áðü êüðïéá êáíïíéêþ Ýêöñáóç Åêôåëåßôáé ç áíôßóôïé ç åíýñãåéá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 37 / 216

Õëïðïßçóç ËÁ ìå ôï ex (vi) ÊáíïíéêÝò åêöñüóåéò a Ï áñáêôþñáò a.. ÏðïéïóäÞðïôå áñáêôþñáò åêôüò ôçò áëëáãþò ãñáììþò. \x Áí x Ýíá áðü ôá a, b, f, n, r, t, v Þ 0, ôüôå üðùò óôç C, áëëéþò ï ßäéïò ï áñáêôþñáò x. \123 Ï áñáêôþñáò ASCII ìå ïêôáäéêþ ôéìþ 123. \x3f Ï áñáêôþñáò ASCII ìå äåêáåîáäéêþ ôéìþ 3F. "abc" Ç óõìâïëïóåéñü abc. [abc] íáò áðü ôïõò áñáêôþñåò a, b Þ c. [a-z] íáò áðü ôïõò áñáêôþñåò a Ýùò z. [ac-fs] íáò áðü ôïõò áñáêôþñåò a, c Ýùò f, Þ s. [^a-z] íáò áðü ôïõò áñáêôþñåò åêôüò üóùí áíþêïõí óôçí ðåñéï Þ a Ýùò z. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 38 / 216

Õëïðïßçóç ËÁ ìå ôï ex (vii) ÊáíïíéêÝò åêöñüóåéò {name} (óõíý åéá) Ç êáíïíéêþ Ýêöñáóç ìå ìíçìïíéêü üíïìá name. rs Ç ðáñüèåóç ôùí r êáé s. r s Ç äéüæåõîç ôùí r êáé s. (r) Ç êáíïíéêþ Ýêöñáóç r. Ïé ðáñåíèýóåéò ñçóéìïðïéïýíôáé ãéá ïìáäïðïßçóç. r* Ç r åðáíáëáìâüíåôáé ìçäýí Þ ðåñéóóüôåñåò öïñýò. r+ Ç r åðáíáëáìâüíåôáé ìéá Þ ðåñéóóüôåñåò öïñýò. r? Ç r åßíáé ðñïáéñåôéêþ (åðáíáëáìâüíåôáé ìçäýí Þ ìéá öïñü). r{7} Ç r åðáíáëáìâüíåôáé áêñéâþò 7 öïñýò. r{3,5} Ç r åðáíáëáìâüíåôáé áðü 3 Ýùò 5 öïñýò. r{4,} Ç r åðáíáëáìâüíåôáé 4 Þ ðåñéóóüôåñåò öïñýò. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 39 / 216

Õëïðïßçóç ËÁ ìå ôï ex (viii) ÊáíïíéêÝò åêöñüóåéò (óõíý åéá) ^r Ç r áëëü ìüíï óôçí áñ Þ ìéáò ãñáììþò. r$ Ç r áëëü ìüíï óôï ôýëïò ìéáò ãñáììþò. <<EOF>> Ôï ôýëïò ôïõ áñ åßïõ åéóüäïõ. r/s Ç êáíïíéêþ Ýêöñáóç r áëëü ìüíï áí áêïëïõèåß ç êáíïíéêþ Ýêöñáóç s. <S>r Ç r áëëü ìüíï üôáí ç ôñý ïõóá áñ éêþ êáôüóôáóç åßíáé ç S. <S 1,S 2,S 3 >r Ç r, áëëü ìüíï üôáí ç ôñý ïõóá áñ éêþ êáôüóôáóç åßíáé ìéá áðü ôéò S 1, S 2 Þ S 3. <*>r Ç r óå ïðïéáäþðïôå áñ éêþ êáôüóôáóç. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 40 / 216

Õëïðïßçóç ËÁ ìå ôï ex (ix) ÌÝñïò Â, ðáñüäåéãìá "and" { return T_and; }... "while" { return T_while; } ":=" { return T_assign; } ":" { return T_colon; } {L}({L} {D} _)* { return T_id; } {D}+(\.{D}*(e\-?{D}+)?)? { return T_const; } {W}+ { /* nothing */ } "(*"([^*]+ \*+[^*)])*\*+")" { /* nothing */ }. { ERROR("illegal token"); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 41 / 216

Õëïðïßçóç ËÁ ìå ôï ex (x) ÌÝñïò Ã, ðåñéý åé êþäéêá C ÐáñÜäåéãìá void ERROR (const char msg []) { fprintf(stderr, "ERROR: %s\n", msg); exit(1); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 42 / 216

Õëïðïßçóç ËÁ ìå ôï ex (xi) ÐáñÜäåéãìá int main () { int token; (óõíý åéá) do { token = yylex(); printf("token=%d, lexeme=\"%s\"\n", token, yytext); } while (token!= T_eof); } return 0; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 43 / 216

Õëïðïßçóç ËÁ ìå ôï ex (xii) ÐáñÜäåéãìá: Áñßèìçóç ãñáììþí int lineno = 1; [ \t]+ { /* nothing */ } \n { lineno++; } void ERROR (const char msg []) { fprintf(stderr, "ERROR, line %d: %s\n", lineno, msg); exit(1); } Ðñüâëçìá: ËÜèïò áñßèìçóç óå ó üëéá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 44 / 216

Õëïðïßçóç ËÁ ìå ôï ex (xiii) Áñ éêýò êáôáóôüóåéò ÊïéíÝò: %s ÁðïêëåéóôéêÝò: %x Åíåñãïß êáíüíåò óå êüðïéá êáôüóôáóç ÌåôÜâáóç ìåôáîý êáôáóôüóåùí: BEGIN(s) Áñ éêþ êáôüóôáóç êáôü ôçí Ýíáñîç ëåéôïõñãßáò ôïõ ËÁ: INITIAL Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 45 / 216

Õëïðïßçóç ËÁ ìå ôï ex (xiv) ÐáñÜäåéãìá: Áñßèìçóç ãñáììþí (äéüñèùóç) %x COMMENT "(*" { BEGIN(COMMENT); } <COMMENT>"*)" { BEGIN(INITIAL); } <COMMENT>\n { lineno++; } <COMMENT>"*" { /* nothing */ } <COMMENT>[^*\n]+ { /* nothing */ } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 46 / 216

ÊåöÜëáéï 2: ÔõðéêÝò ãëþóóåò (ìýñïò 2ï) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 47 / 216

Ãëþóóåò ùñßò óõìöñáæüìåíá (i) ÃñáììáôéêÝò ùñßò óõìöñáæüìåíá: A α Óå êüèå ðáñáãùãþ Ýíá ìç ôåñìáôéêü óýìâïëï áíôéêáèßóôáôáé, âüóåé åíüò êáíüíá ÐïëëÝò äéáöïñåôéêýò ðáñáãùãýò äéáöýñïõí ìüíï óôç óåéñü ôùí áíôéêáôáóôüóåùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 48 / 216

Ãëþóóåò ùñßò óõìöñáæüìåíá (i) ÃñáììáôéêÝò ùñßò óõìöñáæüìåíá: A α Óå êüèå ðáñáãùãþ Ýíá ìç ôåñìáôéêü óýìâïëï áíôéêáèßóôáôáé, âüóåé åíüò êáíüíá ÐïëëÝò äéáöïñåôéêýò ðáñáãùãýò äéáöýñïõí ìüíï óôç óåéñü ôùí áíôéêáôáóôüóåùí Áñéóôåñüôåñç / äåîéüôåñç ðáñáãùãþ (leftmost / rightmost derivation) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 48 / 216

Ãëþóóåò ùñßò óõìöñáæüìåíá (i) ÃñáììáôéêÝò ùñßò óõìöñáæüìåíá: A α Óå êüèå ðáñáãùãþ Ýíá ìç ôåñìáôéêü óýìâïëï áíôéêáèßóôáôáé, âüóåé åíüò êáíüíá ÐïëëÝò äéáöïñåôéêýò ðáñáãùãýò äéáöýñïõí ìüíï óôç óåéñü ôùí áíôéêáôáóôüóåùí Áñéóôåñüôåñç / äåîéüôåñç ðáñáãùãþ (leftmost / rightmost derivation) ÓõíôáêôéêÜ äýíôñá (parse trees) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 48 / 216

Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) S aabc ɛ A csb Ab B bb a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216

Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) Ìßá ðáñáãùãþ S aa B c a A bbc acs B bbc ac S abbc acab B c acabac S aabc ɛ A csb Ab B bb a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216

Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) Ìßá ðáñáãùãþ S aa B c a A bbc acs B bbc ac S abbc acab B c acabac Áñéóôåñüôåñç ðáñáãùãþ S L a A BC L a A bbc L ac S BbBc L ac B bbc L acab B c L acabac S aabc ɛ A csb Ab B bb a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216

Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) Ìßá ðáñáãùãþ S aa B c a A bbc acs B bbc ac S abbc acab B c acabac Áñéóôåñüôåñç ðáñáãùãþ S L a A BC L a A bbc L ac S BbBc L ac B bbc L acab B c L acabac Äåîéüôåñç ðáñáãùãþ S R aa B c R a A ac R a A bac R acs B bac R ac S abac R acabac S aabc ɛ A csb Ab B bb a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216

Ãëþóóåò ùñßò óõìöñáæüìåíá (ii) Ìßá ðáñáãùãþ S aa B c a A bbc acs B bbc ac S abbc acab B c acabac Áñéóôåñüôåñç ðáñáãùãþ S L a A BC L a A bbc L ac S BbBc L ac B bbc L acab B c L acabac Äåîéüôåñç ðáñáãùãþ S R aa B c R a A ac R a A bac R acs B bac R ac S abac R acabac S a A B c c S A S aabc ɛ A csb Ab B bb a B b a ε a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 49 / 216

Äéöïñïýìåíåò ãñáììáôéêýò (i) Äýï ãñáììáôéêýò åßíáé éóïäýíáìåò üôáí ðáñüãïõí ôçí ßäéá ãëþóóá. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 50 / 216

Äéöïñïýìåíåò ãñáììáôéêýò (i) Äýï ãñáììáôéêýò åßíáé éóïäýíáìåò üôáí ðáñüãïõí ôçí ßäéá ãëþóóá. Ìéá ãñáììáôéêþ åßíáé äéöïñïýìåíç (ambiguous) áí õðüñ ïõí äýï Þ ðåñéóóüôåñá óõíôáêôéêü äýíôñá ãéá ôçí ßäéá ðáñáãüìåíç óõìâïëïóåéñü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 50 / 216

Äéöïñïýìåíåò ãñáììáôéêýò (i) Äýï ãñáììáôéêýò åßíáé éóïäýíáìåò üôáí ðáñüãïõí ôçí ßäéá ãëþóóá. Ìéá ãñáììáôéêþ åßíáé äéöïñïýìåíç (ambiguous) áí õðüñ ïõí äýï Þ ðåñéóóüôåñá óõíôáêôéêü äýíôñá ãéá ôçí ßäéá ðáñáãüìåíç óõìâïëïóåéñü ÃñáììáôéêÝò êáé ãëþóóåò åããåíþò äéöïñïýìåíåò (inherently ambiguous) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 50 / 216

Äéöïñïýìåíåò ãñáììáôéêýò (i) Äýï ãñáììáôéêýò åßíáé éóïäýíáìåò üôáí ðáñüãïõí ôçí ßäéá ãëþóóá. Ìéá ãñáììáôéêþ åßíáé äéöïñïýìåíç (ambiguous) áí õðüñ ïõí äýï Þ ðåñéóóüôåñá óõíôáêôéêü äýíôñá ãéá ôçí ßäéá ðáñáãüìåíç óõìâïëïóåéñü ÃñáììáôéêÝò êáé ãëþóóåò åããåíþò äéöïñïýìåíåò (inherently ambiguous) ñþóç äéöïñïýìåíùí ãñáììáôéêþí óôçí ðåñéãñáöþ ôçò óýíôáîçò ãëùóóþí ðñïãñáììáôéóìïý Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 50 / 216

Äéöïñïýìåíåò ãñáììáôéêýò ÐáñÜäåéãìá: îåêñýìáóôï if (dangling if) (ii) stmt if cond stmt else stmt if cond stmt s1 s2 cond c1 c2 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 51 / 216

Äéöïñïýìåíåò ãñáììáôéêýò ÐáñÜäåéãìá: îåêñýìáóôï if (dangling if) (ii) stmt if cond stmt else stmt if cond stmt s1 s2 cond c1 c2 Äéöïñïýìåíï: óå ðïéï if áíôéóôïé åß ôï else; if c1 if c2 s1 else s2 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 51 / 216

Äéöïñïýìåíåò ãñáììáôéêýò ÐáñÜäåéãìá: îåêñýìáóôï if (dangling if) (ii) stmt if cond stmt else stmt if cond stmt s1 s2 cond c1 c2 Äéöïñïýìåíï: óå ðïéï if áíôéóôïé åß ôï else; if c1 if c2 s1 else s2 stmt if cond stmt c1 if cond stmt else stmt c2 s1 s2 if c1 ( if c2 s1 else s2 ) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 51 / 216

Äéöïñïýìåíåò ãñáììáôéêýò ÐáñÜäåéãìá: îåêñýìáóôï if (dangling if) (ii) stmt if cond stmt else stmt if cond stmt s1 s2 cond c1 c2 Äéöïñïýìåíï: óå ðïéï if áíôéóôïé åß ôï else; if c1 if c2 s1 else s2 stmt stmt if cond stmt if cond stmt else stmt c1 if cond stmt else stmt c1 if cond stmt s2 c2 s1 s2 c2 s1 if c1 ( if c2 s1 else s2 ) if c1 ( if c2 s1 ) else s2 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 51 / 216

Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (i) Backus-Naur Form (BNF) Óýìâïëï ::= óôïõò êáíüíåò Ìç ôåñìáôéêü óýìâïëá óå ãùíéáêýò ðáñåíèýóåéò, ð.. expr Óýìâïëï ãéá äéüæåõîç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 52 / 216

Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (i) Backus-Naur Form (BNF) Óýìâïëï ::= óôïõò êáíüíåò Ìç ôåñìáôéêü óýìâïëá óå ãùíéáêýò ðáñåíèýóåéò, ð.. expr Óýìâïëï ãéá äéüæåõîç unsigned-number ::= integer-part dec-fraction exp-part integer-part dec-fraction exp-part sign ::= digit integer-part digit ::=. integer-part ɛ ::= E sign integer-part e sign integer-part ɛ ::= + ɛ digit ::= 0 1 2 3 4 5 6 7 8 9 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 52 / 216

Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (ii) Extended Backus-Naur Form (EBNF) ÔåñìáôéêÜ óýìâïëá óå åéóáãùãéêü ÐáñåíèÝóåéò ãéá ïìáäïðïßçóç Áãêýëåò ãéá ðñïáéñåôéêü ôìþìáôá Óýìâïëá êáé + ãéá åðáíüëçøç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 53 / 216

Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (ii) Extended Backus-Naur Form (EBNF) ÔåñìáôéêÜ óýìâïëá óå åéóáãùãéêü ÐáñåíèÝóåéò ãéá ïìáäïðïßçóç Áãêýëåò ãéá ðñïáéñåôéêü ôìþìáôá Óýìâïëá êáé + ãéá åðáíüëçøç unsigned-number ::= digit + [ \." digit + ] [ (\E" \e") [ \+" \ " ] digit + ] digit ::= \0" \1" \2" \3" \4" \5" \6" \7" \8" \9" Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 53 / 216

Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (iii) ÓõíôáêôéêÜ äéáãñüììáôá ÔåñìáôéêÜ óýìâïëá óå ïâüë Ìç ôåñìáôéêü óýìâïëá óå ïñèïãþíéá Äéáäï Þ óõìâüëùí (ðáñüèåóç) ìå âýëç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 54 / 216

Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí (iii) ÓõíôáêôéêÜ äéáãñüììáôá ÔåñìáôéêÜ óýìâïëá óå ïâüë Ìç ôåñìáôéêü óýìâïëá óå ïñèïãþíéá Äéáäï Þ óõìâüëùí (ðáñüèåóç) ìå âýëç unsigned-number E + digit. digit digit e Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 54 / 216

ÊåöÜëáéï 4: ÓõíôáêôéêÞ áíüëõóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 55 / 216

ÓõíôáêôéêÞ áíüëõóç Óõíôáêôéêü äýíôñï (parse tree) ÊáôáóêåõÜæåôáé ìå äýï ôñüðïõò: ÊáèïäéêÜ Áðü ðüíù ðñïò ôá êüôù (top-down) äçëáäþ îåêéíþíôáò áðü ôç ñßæá êáé ðñï ùñþíôáò ðñïò ôá öýëëá ÁíïäéêÜ Áðü êüôù ðñïò ôá ðüíù (bottom-up) äçëáäþ îåêéíþíôáò áðü ôá öýëëá êáé ðñï ùñþíôáò ðñïò ôç ñßæá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 56 / 216

Top-down êáé bottom-up από πάνω προς τα κάτω (top-down) 1 S 2 3 11 a A B c 13 4 A b 10 12 a 5 6 c S 8 B 7 ε 9 a Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 57 / 216

Top-down êáé bottom-up από πάνω προς τα κάτω (top-down) 1 S από κάτω προς τα πάνω (bottom-up) 12 S 2 3 11 a A B c 13 10 a A B c 1 8 11 4 A b 10 12 a 6 A b 7 9 a 5 6 c S 8 B 2 c 5 S B 4 7 ε 9 a ε a 3 Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 57 / 216

ÂïçèçôéêÝò Ýííïéåò (i) Óýíïëá FIRST óôù óõìâïëïóåéñü α (T N) Ôï óýíïëï FIRST(α) T { ɛ } ðåñéý åé ôá ôåñìáôéêü óýìâïëá áðü ôá ïðïßá áñ ßæïõí ïé óõìâïëïóåéñýò ðïõ ðáñüãïíôáé áðü ôçí α Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 58 / 216

ÂïçèçôéêÝò Ýííïéåò (i) Óýíïëá FIRST óôù óõìâïëïóåéñü α (T N) Ôï óýíïëï FIRST(α) T { ɛ } ðåñéý åé ôá ôåñìáôéêü óýìâïëá áðü ôá ïðïßá áñ ßæïõí ïé óõìâïëïóåéñýò ðïõ ðáñüãïíôáé áðü ôçí α Áí α aβ ôüôå a FIRST(α) Áí α ɛ ôüôå ɛ FIRST(α) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 58 / 216

ÂïçèçôéêÝò Ýííïéåò (ii) Óýíïëá FOLLOW óôù ìç ôåñìáôéêü óýìâïëï A Ôï óýíïëï FOLLOW(A) T { EOF } ðåñéý åé ôá ôåñìáôéêü óýìâïëá ðïõ ìðïñïýí íá áêïëïõèïýí ôï A óôç äéüñêåéá ìéáò ðáñáãùãþò Áí ôï A ìðïñåß íá åßíáé ôï ôåëåõôáßï óýìâïëï óå ìéá ðáñáãùãþ, ôüôå EOF FOLLOW(A) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 59 / 216

ÂïçèçôéêÝò Ýííïéåò (ii) Óýíïëá FOLLOW óôù ìç ôåñìáôéêü óýìâïëï A Ôï óýíïëï FOLLOW(A) T { EOF } ðåñéý åé ôá ôåñìáôéêü óýìâïëá ðïõ ìðïñïýí íá áêïëïõèïýí ôï A óôç äéüñêåéá ìéáò ðáñáãùãþò Áí ôï A ìðïñåß íá åßíáé ôï ôåëåõôáßï óýìâïëï óå ìéá ðáñáãùãþ, ôüôå EOF FOLLOW(A) Áí S αaaβ ôüôå a FOLLOW(A) Áí S αa ôüôå EOF FOLLOW(A) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 59 / 216

Õðïëïãéóìüò FIRST (i) FIRST(ɛ) = { ɛ } FIRST(aβ) = { a } áí ɛ FIRST(A) ôüôå FIRST(Aβ) = FIRST(A) áí ɛ FIRST(A) ôüôå FIRST(Aβ) = (FIRST(A) { ɛ }) FIRST(β) ãéá êüèå êáíüíá A α, ðñýðåé FIRST(α) FIRST(A) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 60 / 216

Õðïëïãéóìüò FIRST (ii) ÐáñÜäåéãìá FIRST(E) = { id, ( } FIRST(T) = { id, ( } FIRST(F) = { id, ( } FIRST(E ) = { +, ɛ } FIRST(T ) = { *, ɛ } E T E E ɛ E + T E T F T T ɛ T * F T F ( E ) F id Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 61 / 216

Õðïëïãéóìüò FOLLOW (i) EOF FOLLOW(S) ãéá êüèå êáíüíá A αbβ (FIRST(β) { ɛ }) FOLLOW(B) áí ɛ FIRST(β) ôüôå FOLLOW(A) FOLLOW(B) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 62 / 216

Õðïëïãéóìüò FOLLOW (ii) ÐáñÜäåéãìá FOLLOW(E) = { ), EOF } FOLLOW(T) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } FOLLOW(E ) = { ), EOF } FOLLOW(T ) = { +, ), EOF } FIRST(E ) = { +, ɛ } FIRST(T ) = { *, ɛ } E T E E ɛ E + T E T F T T ɛ T * F T F ( E ) F id Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 63 / 216

ÓÁ bottom-up (i) Ç óõíôáêôéêþ áíüëõóç îåêéíü áðü ôá öýëëá ÊÜèå öïñü, áíáæçôü: ôïí áñéóôåñüôåñï êüìâï ôïõ äýíôñïõ ðïõ äåí Ý åé áêüìá êáôáóêåõáóôåß åíþ üëá ôá ðáéäéü ôïõ Ý ïõí êáôáóêåõáóôåß ÅðáíáëáìâÜíåé ìý ñé íá êáôáóêåõáóôåß ç ñßæá ÅëÜôôùóç (reducing): ç åðéëïãþ ôùí êüìâùí ðïõ èá áðïôåëýóïõí ôá ðáéäéü åíüò íýïõ êüìâïõ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 64 / 216

ÓÁ bottom-up (ii) B B D D D D r a. b r a. b r a. b S r B B D B, D D a b B B S B B D D D D r a. b r a. b Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 65 / 216

ÓÁ bottom-up (iii) ÓÁ ïëßóèçóçò-åëüôôùóçò (shift-reduce) ñçóéìïðïéïýí ìéá (áñ éêü êåíþ) óôïßâá üðïõ ôïðïèåôïýí óýìâïëá ôçò ãñáììáôéêþò Ïëßóèçóç (shift): ìåôáöïñü åíüò óõìâüëïõ áðü ôçí åßóïäï óôçí êïñõöþ ôçò óôïßâáò ÅëÜôôùóç (reduce): áöáßñåóç áðü ôçí êïñõöþ ôçò óôïßâáò ôïõ äåîéïý ìýëïõò åíüò êáíüíá êáé ðñüóèåóç ôïõ áñéóôåñïý ìýëïõò Åðéôõ ßá: ç óôïßâá ðåñéý åé ìüíï ôï S êáé ôá óýìâïëá ôçò åéóüäïõ Ý ïõí åîáíôëçèåß Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 66 / 216

ÓÁ bottom-up (iv) âþìá óôïßâá åßóïäïò êßíçóç 0 ɛ r a, b ïëßóèçóç 1 r a, b ïëßóèçóç 2 r a, b åëüôôùóç ìå D a 3 r D, b åëüôôùóç ìå B D 4 r B, b ïëßóèçóç (ü é åëüôôùóç ìå S r B) 5 r B, b ïëßóèçóç 6 r B, b ɛ åëüôôùóç ìå D b 7 r B, D ɛ åëüôôùóç ìå B B, D (ü é åëüôôùóç ìå B D) 8 r B ɛ åëüôôùóç ìå S r B 9 S ɛ áíáãíþñéóç S r B B D B, D D a b Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 67 / 216

ÓÁ bottom-up (v) συµβολοσειρά εισόδου a 1 a 2... a n EOF LR(k) επόµενο σύµβολο LR(0) SLR(1) LALR(1) LR(1) s m x m... κορυφή Πίνακες ελέγχου συντακτικής ανάλυσης LR(1) s 1 ACTION NEXT x 1 Συντακτικός Αναλυτής LR(1) s 0 στοίβα Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 68 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (i) Ìåôáåñãáëåßï bison: ãåííþôïñáò ÓÁ LALR(1) Åßóïäïò: ìåôáðñüãñáììá ðïõ ðåñéãñüöåé ôç óýíôáîç êáé ôéò óçìáóéïëïãéêýò ñïõôßíåò îïäïò: ðñüãñáììá óå C Ç óõíüñôçóç yyparse õëïðïéåß ôï ÓÁ ÅðéóôñÝöåé 0 áí áíáãíùñéóôåß ç óõìâïëïóåéñü åéóüäïõ Þ 1 óå ðåñßðôùóç óõíôáêôéêïý óöüëìáôïò ÓõíåñãÜæåôáé ìå ôï ëåêôéêü áíáëõôþ (óõíüñôçóç yylex) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 69 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (ii) ÄïìÞ ôïõ ìåôáðñïãñüììáôïò ÌÝñïò Á %% ÌÝñïò Â %% ÌÝñïò Ã Êáé ôá ôñßá ìýñç ìðïñïýí íá åßíáé êåíü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 70 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (iii) ÌÝñïò Á, ðåñéý åé Ó üëéá, üðùò óôç C Êþäéêá C, ìýóá óå %{ êáé %} Äçëþóåéò ëåêôéêþí ìïíüäùí Äçëþóåéò ôåëåóôþí ôçò áñ éêþò ãëþóóáò (ðñïôåñáéüôçôá, ðñïóåôáéñéóôéêüôçôá) ÄÞëùóç ôïõ óõíüëïõ óçìáóéïëïãéêþí ôéìþí (ôýðïò YYSTYPE Þ ìå ñþóç ôïõ %union) ÄÞëùóç ôïõ ôýðïõ ôçò óçìáóéïëïãéêþò ôéìþò êüèå óõìâüëïõ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 71 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (iv) ÌÝñïò Á, ðáñüäåéãìá %{ void ERROR (const char msg []); %} %token T_program "program" %token T_div T_mod %token T_if T_then T_else %nonassoc '=' '<' '>' %left '+' '-' %left '*' '/' T_div T_mod Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 72 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (v) ÌÝñïò Á, ðáñüäåéãìá (óõíý åéá) %union{ int i; double f; char str[80]; } %token<str> T_id %token<i> T_int_const %token<f> T_float_const %type<f> expression Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 73 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (vi) ÌÝñïò Â, ðåñéý åé: ôïõò êáíüíåò ðáñáãùãþò óå ìïñöþ BNF óçìáóéïëïãéêýò ñïõôßíåò ðïõ åêôåëïýíôáé êáôü ôç óõíôáêôéêþ áíüëõóç Ïé êáíüíåò Ý ïõí ôç ìïñöþ: A : x 1 1 x 1 2... x 1 m 1 x 2 1 x 2 2...... x 2 m 2 x n 1 x n 2... x n m n ; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 74 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (vii) ÌÝñïò Â, ðáñüäåéãìá program : { count=0; } block_list { printf("counted %d block(s)\n", count); } ; block_list : /* nothing */ block_list block { count++; } ; block : "begin" block_list "end" ; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 75 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (viii) ÌÝñïò Ã, ðåñéý åé êþäéêá C Ôï ìåôáðñüãñáììá ôïõ bison áíáëáìâüíåé ôïí êåíôñéêü Ýëåã ï ôïõ ìåôáãëùôôéóôþ ðïõ åðéôõã Üíåôáé ìå ôç óõíåñãáóßá ôùí ðáñáêüôù: ôïõ ëåêôéêïý áíáëõôþ ôïõ óõíôáêôéêïý áíáëõôþ ôïõ ðßíáêá óõìâüëùí ôïõ óçìáóéïëïãéêïý áíáëõôþ ôïõ ãåííþôïñá åíäéüìåóïõ êþäéêá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 76 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (ix) ÌÝñïò Ã, ðáñüäåéãìá void yyerror (const char * msg) { fprintf(stderr, "syntax error in line %d: %s\n", linecount, msg); exit(1); } int main () { return yyparse(); } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 77 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (x) ÐáñÜäåéãìá ìå óçìáóéïëïãéêýò ôéìýò E T E E + T T F T T * F F ( E ) F num Æçôïýìåíï: íá êáôáóêåõáóôåß ÓÁ ðïõ íá õðïëïãßæåé ôçí ôéìþ ìéáò áñéèìçôéêþò Ýêöñáóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 78 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (xi) ÐáñÜäåéãìá (óõíý åéá) %{ typedef int YYSTYPE; %} %token T_num %% program : expression { printf("value: %d\n", $1); } ; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 79 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (xii) ÐáñÜäåéãìá (óõíý åéá) expression : term { $$ = $1; } expression '+' term { $$ = $1 + $3; } ; term : factor { $$ = $1; } term '*' factor { $$ = $1 * $3; } ; Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 80 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (xiii) ÐáñÜäåéãìá (óõíý åéá) factor : '(' expression ')' { $$ = $2; } T_num { $$ = $1; } ; %% Ðáñáëåßðïíôáé óôï ÌÝñïò Ã: ç óõíüñôçóç yylex (ðéèáíþò óå îå ùñéóôü áñ åßï, áí ñçóéìïðïéçèåß ôï ex) ïé óõíáñôþóåéò yyerror êáé main Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 81 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (xiv) ÐáñÜäåéãìá Õëïðïßçóç ËÁ åéñùíáêôéêü int yylex () { int c; while (isspace(c = fgetc(stdin))); if (isdigit(c)) { yylval = c - '0'; while (isdigit(c = fgetc(stdin))) yylval = yylval * 10 + c - '0'; ungetc(c, stdin); return T_num; } Óôï ìýñïò à Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 82 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (xv) ÐáñÜäåéãìá } (óõíý åéá) if (strchr("+*()", c)) return c; if (c!= EOF) fprintf(stderr, "Illegal character: %c\n", c); return 0; Áõôïìáôïðïßçóç ôçò ìåôáãëþôôéóçò ôïõ ÓÁ mytest1: mytest1.y bison mytest1.y gcc -o mytest1 mytest1.tab.c Makele Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 83 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (xvi) ÐáñÜäåéãìá Õëïðïßçóç ËÁ ìå ôï ex %{ #include "mytest2.tab.h" %} %% [0-9]+ { yylval = atoi(yytext); return T_num; } \( \) \+ \* { return yytext[0]; } [ \t\n]+ { /* nothing */ }. { yyerror("illegal character"); } %% mytest2.l Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 84 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (xvii) Áõôïìáôïðïßçóç ôçò ìåôáãëþôôéóçò ËÁ êáé ÓÁ mytest2: mytest2.l mytest2.y bison -d mytest2.y flex -s mytest2.l gcc -o mytest2 mytest2.tab.c lex.yy.c \ -lfl Åðßëõóç óõãêñïýóåùí óôï bison shift-reduce: ðüíôá shift reduce-reduce: ï ðñþôïò êáíüíáò Makele Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 85 / 216

ÓÁ top-down (i) Ç óõíôáêôéêþ áíüëõóç îåêéíü áðü ôç ñßæá ÊÜèå öïñü, áíáæçôü: ôï ìç ôåñìáôéêü óýìâïëï ðïõ èá áíôéêáôáóôáèåß óõíþèùò åðéëýãåôáé ôï áñéóôåñüôåñï ôïí êáíüíá ðáñáãùãþò ðïõ èá åöáñìïóôåß âüóåé ôùí åðüìåíùí k ëåêôéêþí ìïíüäùí óôç óõìâïëïóåéñü åéóüäïõ: LL(k) ÅðáíáëáìâÜíåôáé ìý ñé íá åîáíôëçèïýí ôá ìç ôåñìáôéêü Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 86 / 216

ÃñáììáôéêÝò LL(1) Áðáñáßôçôåò ðñïûðïèýóåéò: Áðïõóßá áñéóôåñþò áíáäñïìþò (Üìåóçò Þ Ýììåóçò) Áðïõóßá êïéíïý ðñïèýìáôïò óå åíáëëáêôéêïýò êáíüíåò ÌåñéêÝò öïñýò åßíáé äõíáôüò ï ìåôáó çìáôéóìüò ìéáò ãñáììáôéêþò óå éóïäýíáìç LL(1) áðáëïéöþ áñéóôåñþò áíáäñïìþò áñéóôåñþ ðáñáãïíôïðïßçóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 87 / 216

Ìåôáó çìáôéóìüò óå LL(1) ÁíôéêáôÜóôáóç A α 1... α n B β 1 Aβ 2 A α 1... α n B β 1 α 1 β 2... β 1 α n β 2 ÁñéóôåñÞ ðáñáãïíôïðïßçóç A αβ 1... αβ n A αb B β 1... β n ÁðáëïéöÞ Üìåóçò áñéóôåñþò áíáäñïìþò A Aα 1... Aα n β 1... β m A β 1 B... β m B B α 1 B... α n B ɛ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 88 / 216

ÓÁ áíáäñïìéêþò êáôüâáóçò A α 1... α n ìåôáôñýðåôáé óå êþäéêá ôçò ìïñöþò: if token FIRST(α 1 ) then êþäéêáò ãéá ôçí áíáãíþñéóç ôçò α 1... else if token FIRST(α n ) then êþäéêáò ãéá ôçí áíáãíþñéóç ôçò α n else if ɛ FIRST(α 1 )... FIRST(α n ) then óõíôáêôéêü óöüëìá else if token FOLLOW(A) then óõíôáêôéêü óöüëìá end if Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 89 / 216

ÓÁ LL(1) (i) ñçóéìïðïéïýí ìéá óôïßâá üðïõ ôïðïèåôïýí óýìâïëá ôçò ãñáììáôéêþò áñ éêü ìüíï ôï S ÊÜèå öïñü åîåôüæåôáé ç êïñõöþ ôçò óôïßâáò: Áí åßíáé ôåñìáôéêü óýìâïëï êáé åßíáé ôï ßäéï ìå ôï åðüìåíï ôçò óõìâïëïóåéñüò åéóüäïõ, ôüôå áöáéñïýíôáé êáé ôá äýï Áí åßíáé ìç ôåñìáôéêü óýìâïëï, ôüôå áíüëïãá ìå ôï åðüìåíï ôçò óõìâïëïóåéñüò åéóüäïõ åöáñìüæåôáé êüðïéïò êáíüíáò Åðéôõ ßá: ç óôïßâá êáé ç óõìâïëïóåéñü åéóüäïõ åßíáé Üäåéåò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 90 / 216

ÓÁ LL(1) (ii) συµβολοσειρά εισόδου a 1 a 2... a n EOF Ï áëãüñéèìïò êáôáóêåõþò ôïõ ðßíáêá M ïñßæåé ôçí ïéêïãýíåéá ôùí ãëùóóþí LL(1) x m... κορυφή επόµενο σύµβολο Πίνακας M συντακτικής ανάλυσης LL(1) x 2 x 1 στοίβα Συντακτικός Αναλυτής LL(1) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 91 / 216

ÊáôáóêåõÞ ÓÁ LL(1) E T E E + T E ɛ T F T T * F T ɛ F ( E ) id FIRST(E) = FIRST(T) = FIRST(F) = { id, ( } FIRST(E ) = { +, ɛ } FIRST(T ) = { *, ɛ } FOLLOW(E) = FOLLOW(E ) = { ), EOF } FOLLOW(T) = FOLLOW(T ) = { +, ), EOF } FOLLOW(F) = { *, +, ), EOF } id + * ( ) EOF E E TE E TE E E +TE E ɛ E ɛ T T FT T FT T T ɛ T *FT T ɛ T ɛ F F id F (E) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 92 / 216

Ëåéôïõñãßá ÓÁ LL(1) 0 E id + id * id EOF E T E 1 E T id + id * id EOF T F T 2 E T F id + id * id EOF F id 3 E T id id + id * id EOF 4 E T + id * id EOF T ɛ 5 E + id * id EOF E + T E 6 E T + + id * id EOF 7 E T id * id EOF T F T 8 E T F id * id EOF F id 9 E T id id * id EOF 10 E T * id EOF T * F T 11 E T F * * id EOF 12 E T F id EOF F id 13 E T id id EOF 14 E T EOF T ɛ 15 E EOF E ɛ 16 ɛ EOF áíáãíþñéóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 93 / 216

ÊåöÜëáéï 2: ÔõðéêÝò ãëþóóåò (ìýñïò 3ï) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 94 / 216

ÊáôçãïñéêÝò ãñáììáôéêýò (i) ÊáôçãïñéêÞ ãñáììáôéêþ (attribute grammar): ãñáììáôéêþ ùñßò óõìöñáæüìåíá üðïõ êüèå óýìâïëï öýñåé Ýíá óýíïëï êáôçãïñçìüôùí Ïé ôéìýò ôùí êáôçãïñçìüôùí õðïëïãßæïíôáé âüóåé ôïõ óõíôáêôéêïý äýíôñïõ: ÓõíèåôéêÜ êáôçãïñþìáôá: ïé ôéìýò ôïõò åîáñôþíôáé ìüíï áðü êáôçãïñþìáôá ôùí ðáéäéþí êüèå êüìâïõ Êëçñïíïìïýìåíá êáôçãïñþìáôá: ïé ôéìýò ôïõò åîáñôþíôáé ìüíï áðü êáôçãïñþìáôá ôïõ \ðáôýñá" êáé ôùí \áäåëöþí" êüèå êüìâïõ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 95 / 216

ÊáôçãïñéêÝò ãñáììáôéêýò (ii) E E + T { E 1.val := E 2.val + T.val } E T { E.val := T.val } T T * F { T 1.val := T 2.val F.val } T F { T.val := F.val } F ( E ) { F.val := E.val } F num { F.val := num.val } Óçìáóéïëïãéêïß êáíüíåò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 96 / 216

ÊåöÜëáéï 5: Ðßíáêáò óõìâüëùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 97 / 216

Ðßíáêáò óõìâüëùí Óõãêåíôñþíåé ðëçñïöïñßåò ãéá ôá ïíüìáôá ðïõ åìöáíßæïíôáé óôï áñ éêü ðñüãñáììá Ïíüìáôá åßíáé: ôï ðñüãñáììá ïé ìåôáâëçôýò ôá õðïðñïãñüììáôá (äéáäéêáóßåò, óõíáñôþóåéò) ïé ðáñüìåôñïé ôùí õðïðñïãñáììüôùí ïé åôéêýôôåò åíôïëþí ïé óôáèåñýò ïé ôýðïé äåäïìýíùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 98 / 216

áñáêôçñéóôéêü ïíïìüôùí Êáôçãïñßá áðïèþêåõóçò (storage class) ÊáèïëéêÝò ìåôáâëçôýò (global variables) ÌåôáâëçôÝò óôïßâáò (stack variables) ÓôáôéêÝò ìåôáâëçôýò (static variables) ÅìâÝëåéá (scope) Ïñáôüôçôá (visibility) ÄéÜñêåéá æùþò (lifetime) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 99 / 216

Ðåñéå üìåíá ðßíáêá óõìâüëùí ÅìâÝëåéá (Ýììåóá) Ïñáôüôçôá (Ýììåóá) ÄéÜñêåéá æùþò Ôýðïò ÈÝóç (äéåýèõíóç ìíþìçò, êáôá ùñçôþò,...) Áñéèìüò ðáñáìýôñùí õðïðñïãñüììáôïò Ôýðïò ðáñáìýôñùí õðïðñïãñüììáôïò Ôñüðïò ðåñüóìáôïò ðáñáìýôñùí õðïðñïãñüììáôïò Ôýðïò áðïôåëýóìáôïò óõíüñôçóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 100 / 216

ÏñãÜíùóç ðßíáêá óõìâüëùí ÂáóéêÝò ëåéôïõñãßåò ÐñïóèÞêç ïíüìáôïò ÁíáæÞôçóç ïíüìáôïò ÄéáãñáöÞ ïíüìáôïò Þ ïìüäáò ïíïìüôùí Êüóôïò ðñïóèþêçò Þ áíáæþôçóçò áíüëïãá ìå ôçí õëïðïßçóç: ãñáììéêþ ëßóôá O(n) äõáäéêü äýíôñï áíáæþôçóçò O(log n) ðßíáêáò êáôáêåñìáôéóìïý O(n/k) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 101 / 216

Õëïðïßçóç ìå ÐÊ 0 1 2... k 2 k 1 b c x a aa y c b a εµβέλεια 3 εµβέλεια 2 εµβέλεια 1 3 2 1 πίνακας κατακερµατισµού στοίβα αποθήκευσης στοίβα εµβελειών Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 102 / 216

ÊåöÜëáéï 6: ÓçìáóéïëïãéêÞ áíüëõóç Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 103 / 216

Óýíôáîç êáé óçìáóéïëïãßá Óýíôáîç: ìïñöþ êáé äïìþ ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 104 / 216

Óýíôáîç êáé óçìáóéïëïãßá Óýíôáîç: ìïñöþ êáé äïìþ ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Óçìáóéïëïãßá: åñìçíåßá ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 104 / 216

Óýíôáîç êáé óçìáóéïëïãßá Óýíôáîç: ìïñöþ êáé äïìþ ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Óçìáóéïëïãßá: åñìçíåßá ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí ÓôáôéêÞ óçìáóéïëïãßá: åíôïðéóìüò óçìáóéïëïãéêþí óöáëìüôùí êáôü ôç äéüñêåéá ôçò ìåôáãëþôôéóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 104 / 216

Óýíôáîç êáé óçìáóéïëïãßá Óýíôáîç: ìïñöþ êáé äïìþ ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Óçìáóéïëïãßá: åñìçíåßá ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí ÓôáôéêÞ óçìáóéïëïãßá: åíôïðéóìüò óçìáóéïëïãéêþí óöáëìüôùí êáôü ôç äéüñêåéá ôçò ìåôáãëþôôéóçò ÄõíáìéêÞ óçìáóéïëïãßá: áðüäïóç åñìçíåßáò óôá ðñïãñüììáôá êáôü ôçí åêôýëåóþ ôïõò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 104 / 216

ÓôáôéêÞ óçìáóéïëïãßá (i) ÐåñéâÜëëïíôá ôýðùí Γ 1 = { i integer, x real } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 105 / 216

ÓôáôéêÞ óçìáóéïëïãßá (i) ÐåñéâÜëëïíôá ôýðùí Γ 1 = { i integer, x real } Ó Ýóç áíôéóôïß éóçò ôýðùí Γ E : τ Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 105 / 216

ÓôáôéêÞ óçìáóéïëïãßá (i) ÐåñéâÜëëïíôá ôýðùí Γ 1 = { i integer, x real } Ó Ýóç áíôéóôïß éóçò ôýðùí Γ E : τ Êáíüíåò ôýðùí Γ E 1 : integer Γ E 2 : integer Γ E 1 +E 2 : integer Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 105 / 216

ÓôáôéêÞ óçìáóéïëïãßá (ii) ÐáñáãùãÝò ôýðùí Γ 1 i : integer Γ 1 1 : integer Γ 1 i+1 : integer Γ 1 (i+1)*x : real Γ 1 x : real Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 106 / 216

ÓôáôéêÞ óçìáóéïëïãßá (ii) ÐáñáãùãÝò ôýðùí Γ 1 i : integer Γ 1 1 : integer Γ 1 i+1 : integer Γ 1 (i+1)*x : real Γ 1 x : real Ç áíôéóôïß éóç ôýðùí ìå êáíüíåò ôýðùí åðåêôåßíåôáé óå üëá ôá ôìþìáôá ðñïãñüììáôïò Γ E : boolean Γ S : stmt Γ while E do S : stmt Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 106 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí ÄçëùôéêÞ óçìáóéïëïãßá (denotational semantics) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí ÄçëùôéêÞ óçìáóéïëïãßá (denotational semantics) ìáèçìáôéêþ óõíüñôçóç áðü ôï ðåäßï ôùí äåäïìýíùí åéóüäïõ óôï ðåäßï ôùí áðïôåëåóìüôùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí ÄçëùôéêÞ óçìáóéïëïãßá (denotational semantics) ìáèçìáôéêþ óõíüñôçóç áðü ôï ðåäßï ôùí äåäïìýíùí åéóüäïõ óôï ðåäßï ôùí áðïôåëåóìüôùí ÁîéùìáôéêÞ óçìáóéïëïãßá (axiomatic semantics) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (i) ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí ÄçëùôéêÞ óçìáóéïëïãßá (denotational semantics) ìáèçìáôéêþ óõíüñôçóç áðü ôï ðåäßï ôùí äåäïìýíùí åéóüäïõ óôï ðåäßï ôùí áðïôåëåóìüôùí ÁîéùìáôéêÞ óçìáóéïëïãßá (axiomatic semantics) ç åñìçíåßá êáèïñßæåôáé Ýììåóá ìýóù ëïãéêþí ðñïôüóåùí ðïõ ðåñéãñüöïõí éäéüôçôåò ôïõ ðñïãñüììáôïò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 107 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (ii) Ç åíôïëþ áíüèåóçò I=E Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 108 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (ii) Ç åíôïëþ áíüèåóçò I=E ËåéôïõñãéêÞ óçìáóéïëïãßá E, σ v I=E, σ σ[i v] Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 108 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (ii) Ç åíôïëþ áíüèåóçò I=E ËåéôïõñãéêÞ óçìáóéïëïãßá E, σ v I=E, σ σ[i v] ÄçëùôéêÞ óçìáóéïëïãßá C[[I=E ]](s) = s[i E[[E ]](s)] Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 108 / 216

ÄõíáìéêÞ óçìáóéïëïãßá (ii) Ç åíôïëþ áíüèåóçò I=E ËåéôïõñãéêÞ óçìáóéïëïãßá E, σ v I=E, σ σ[i v] ÄçëùôéêÞ óçìáóéïëïãßá C[[I=E ]](s) = s[i E[[E ]](s)] ÁîéùìáôéêÞ óçìáóéïëïãßá { P [I E] } I=E { P } Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 108 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï (C) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç (C) (Java) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí (C) (Java) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò (C) (Java) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò ëåã ïò ìïíáäéêüôçôáò (C) (Java) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò ëåã ïò ìïíáäéêüôçôáò ð.. ïé óôáèåñýò óå ìßá äïìþ case åßíáé ìïíáäéêýò (C) (Java) (Pascal) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò ëåã ïò ìïíáäéêüôçôáò ð.. ïé óôáèåñýò óå ìßá äïìþ case åßíáé ìïíáäéêýò ëåã ïò óõíýðåéáò (C) (Java) (Pascal) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (i) ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò ëåã ïò ìïíáäéêüôçôáò ð.. ïé óôáèåñýò óå ìßá äïìþ case åßíáé ìïíáäéêýò ëåã ïò óõíýðåéáò ð.. óùóôü üíïìá õðïðñïãñüììáôïò óôï end (C) (Java) (Pascal) (Ada) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 109 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (ii) Áðïõóßá óçìáóéïëïãéêþí óöáëìüôùí áðïõóßá óöáëìüôùí åêôýëåóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 110 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (ii) Áðïõóßá óçìáóéïëïãéêþí óöáëìüôùí áðïõóßá óöáëìüôùí åêôýëåóçò ÌåñéêÝò öïñýò üìùò åßíáé äõíáôü íá ðñïâëåöèïýí óöüëìáôá åêôýëåóçò Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 110 / 216

Óçìáóéïëïãéêüò Ýëåã ïò (ii) Áðïõóßá óçìáóéïëïãéêþí óöáëìüôùí áðïõóßá óöáëìüôùí åêôýëåóçò ÌåñéêÝò öïñýò üìùò åßíáé äõíáôü íá ðñïâëåöèïýí óöüëìáôá åêôýëåóçò program p; var x, y : integer; begin read(x); y := 5/(x-x) end. Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 110 / 216

Óýóôçìá ôýðùí Âáóéêïß ôýðïé (integer, boolean, real, char,...) Óýíèåôïé ôýðïé Ðßíáêåò (arrays) Æåýãç (products) êáé ðëåéüäåò (tuples) ÅããñáöÝò (records) Äåßêôåò (pointers) ÓõíáñôÞóåéò (functions) Ôýðïé êáé ôéìýò ðñþôçò ôüîçò (rst class) Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 111 / 216

ÁðëÝò åêöñüóåéò, âáóéêïß ôýðïé ÓçìáóéïëïãéêÞ áíüëõóç óôï bison Óêïðüò: õðïëïãéóìüò ôïõ ðåäßïõ type (i) %{ typedef enum { TY_int, TY_real, TY_bool } Type; %} %union{ char * n; Type t; struct { Type type; /* other fields */ } v;... } %type<n> T_id %type<t> typename %type<v> expression Íßêïò Ðáðáóðýñïõ, ÊùóôÞò Óáãþíáò ÌåôáãëùôôéóôÝò Áðñßëéïò 2011 112 / 216