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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Στοιχεία από Assembly Γιώργος Μανής

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

DOS Microsoft Windows... 65

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Chi-Square Goodness-of-Fit Test*

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

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

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

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

µµ Setup : µ 2005

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

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

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

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

Estimation Theory Exercises*

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

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

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

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

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

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

ÁÑÉÈÌÇÔÉÊÇ ËÕÓÇ ÓÕÍÇÈÙÍ ÄÉÁÖÏÑÉÊÙÍ ÅÎÉÓÙÓÅÙÍ

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

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

Do Loop. Do While. Loop. Do While. Loop. Loop

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

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

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

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

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

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

Ενότητα 7: Διαδικασιακός Προγραμματισμός

Ðåñéå üìåíá ìå Ìéá ÌáôéÜ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕΔΟΝΙΑΣ ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ.

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

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

Προτεινόμενα θέματα Πανελλαδικών εξετάσεων. Χημεία Θετικής Κατεύθυνσης ΕΛΛΗΝΟΕΚΔΟΤΙΚΗ

Union of Pure and Applied Chemistry).

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

Transcript:

ÌåôáãëùôôéóôÝò Íßêïò Ðáðáóðýñïõ ÊùóôÞò Óáãþíáò {nickie}@softlab.ntua.gr {kostis}@cs.ntua.gr ÅéóáãùãÞ Ãëþóóåò ðñïãñáììáôéóìïý ÌåôáãëùôôéóôÝò Áíáãêáéüôçôá êáé éóôïñéêþ áíáäñïìþ ÅéóáãùãÞ Áñ éêþ ãëþóóá L A A T ÔåëéêÞ ãëþóóá L T Y Ãëþóóá õëïðïßçóçò L Y Óçìáóéïëïãßá ôïõ ðñïãñüììáôïò P óôç ãëþóóá L Åèíéêü Ìåôóüâéï Ðïëõôå íåßï Ó ïëþ Çëåêôñïëüãùí Ìç. êáé Ìç. Õðïëïãéóôþí ÅñãáóôÞñéï Ôå íïëïãßáò Ëïãéóìéêïý αρχικό πρόγραµµα µεταγλωττιστής τελικό πρόγραµµα [[P ]] L : Inp(P ) Out(P ) Óçìáóßá åíüò ìåôáãëùôôéóôþ C Ðïëõôå íåéïýðïëç, 15780 ÆùãñÜöïõ. Áðñßëéïò 2011 διαγνωστικά µηνύµατα [[C ]] LY : L A L T 1 / 216 2 / 216 3 / 216 ÅéóáãùãÞ ÅéóáãùãÞ (iv) ÅéóáãùãÞ (v) Ïñèüôçôá ôïõ ìåôáãëùôôéóôþ: \ôï ìåôáãëùôôéóìýíï ðñüãñáììá ðñýðåé íá åßíáé éóïäýíáìï ìå ôï áñ éêü" [[P ]] LA = [[[[C ]] LY (P )]] LT Åßäç ìåôáãëùôôéóôþí: Áðëïß Áíôßóôñïöïé (decompilers) Ìåôá-ìåôáãëùôôéóôÝò (meta-compilers) ÅéäéêÝò ðåñéðôþóåéò ìåôáãëùôôéóôþí: ÐñïåðåîåñãáóôÝò (preprocessors) ÓõìâïëïìåôáöñáóôÝò (assemblers) ÃåííÞôïñåò ðñïãñáììüôùí (program generators) ÓõíáöÞ åñãáëåßá Äéåñìçíåßò (interpreters) Äéá åéñéóôýò âéâëéïèçêþí (library managers) ÓõíäÝôåò (linkers) ÖïñôùôÝò (loaders) Åêäüôåò ðñïãñáììüôùí (program editors) ÅíôïðéóôÝò óöáëìüôùí (debuggers) Óôáôéóôéêïß áíáëõôýò (prolers) 4 / 216 5 / 216 6 / 216

ÊáôáóêåõÞ ìåôáãëùôôéóôþ ÊáôáóêåõÞ ìåôáãëùôôéóôþ ÖÜóåéò êáé ðñïúüíôá ôçò ìåôáãëþôôéóçò αρχικό πρόγραµµα ÂáóéêÝò áðáéôþóåéò: Íá ëåéôïõñãåß óùóôü Íá óõììïñöþíåôáé ìå ôéò ðñïäéáãñáöýò ôçò áñ éêþò êáé ôçò ôåëéêþò ãëþóóáò Íá ìåôáãëùôôßæåé ðñïãñüììáôá êüèå ìåãýèïõò Åðéðñüóèåôåò áðáéôþóåéò: Íá ðáñüãåé áðïäïôéêü êþäéêá Íá Ý åé ìéêñü ñüíï ìåôáãëþôôéóçò Íá Ý åé ìéêñýò áðáéôþóåéò ìíþìçò êáôü ôç ìåôáãëþôôéóç Íá äßíåé êáëü äéáãíùóôéêü ìçíýìáôá Íá óõíå ßæåé ýóôåñá áðü ëüèç Íá åßíáé ìåôáöýñóéìïò ËåêôéêÞ áíüëõóç ÓõíôáêôéêÞ áíüëõóç ÓçìáóéïëïãéêÞ áíüëõóç ÐáñáãùãÞ åíäéüìåóïõ êþäéêá Âåëôéóôïðïßçóç ÐáñáãùãÞ ôåëéêïý êþäéêá Πίνακας συµβόλων Λεκτική ανάλυση λεκτικές µονάδες Συντακτική Ανάλυση συντακτικό δέντρο Σηµασιολογική Ανάλυση συντακτικό δέντρο Παραγωγή ενδιάµεσου κώδικα ενδιάµεσος κώδικας Βελτιστοποίηση ενδιάµεσου κώδικα ενδιάµεσος κώδικας Παραγωγή τελικού κώδικα τελικός κώδικας Χειριστής σφαλµάτων Βελτιστοποίηση τελικού κώδικα τελικό πρόγραµµα 7 / 216 8 / 216 9 / 216 ÈÝìáôá õëïðïßçóçò Åêêßíçóç { bootstrapping ÏñãÜíùóç óå Ýíá ðýñáóìá Εµπρόσθιο τµήµα ÏñãÜíùóç óå ðåñüóìáôá ÏñãÜíùóç óå åìðñüóèéï êáé ïðßóèéï ôìþìá (front-end / back-end) ëåã ïò ïñèüôçôáò Åßäç äéáãíùóôéêþí ìçíõìüôùí êáé áíüíçøç ÅóùôåñéêÜ (internal) ÓöÜëìáôá (errors) ÐñïåéäïðïéçôéêÜ ìçíýìáôá (warnings) ÁðëÜ ìçíýìáôá (messages) A S A T S A T ÂÞìá 1: ÌåôáãëùôôéóôÞò ãéá S A óôçí T. ÂÞìá 2: ÌåôáãëùôôéóôÞò ãéá ôçí A óôçí S. ÂÞìá 3: ÌåôáãëùôôéóôÞò ãéá ôçí A óôçí A. T A T T A T T T Λεκτικός αναλυτής Πίνακας συµβόλων Συντακτικός αναλυτής Σηµασιολογικός αναλυτής Γεννήτορας ενδιάµεσου κώδικα Βελτιστοποιητής ενδιάµεσου κώδικα Γεννήτορας τελικού κώδικα Βελτιστοποιητής τελικού κώδικα Χειριστής σφαλµάτων Οπίσθιο τµήµα 10 / 216 11 / 216 12 / 216

ÔõðéêÝò ãëþóóåò ÔõðéêÝò ãëþóóåò ÊåöÜëáéï 2: ÔõðéêÝò ãëþóóåò ÂáóéêÝò Ýííïéåò ÁëöÜâçôï Óýìâïëï ÓõìâïëïóåéñÜ ÌÞêïò óõìâïëïóåéñüò Óýíïëï óõìâïëïóåéñþí ìþêïõò n Óýíïëï üëùí ôùí óõìâïëïóåéñþí Σ = Σ n n=0 Σ a α α Σ n ÂáóéêÝò Ýííïéåò (óõíý åéá) ÊåíÞ óõìâïëïóåéñü ÐáñÜèåóç óõìâïëïóåéñþí ÐáñÜèåóç óõìâïëïóåéñüò ìå ôïí åáõôü ôçò α 0 = ɛ α n+1 = αα n Ðñüèåìá, åðßèåìá, õðïóõìâïëïóåéñü ɛ αβ 13 / 216 14 / 216 15 / 216 ÔõðéêÝò ãëþóóåò ÔõðéêÝò ãëþóóåò (iv) ÔõðéêÝò ãëþóóåò (v) ÂáóéêÝò Ýííïéåò Ãëþóóá (óõíý åéá) íùóç ãëùóóþí 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 Σ ÃåííçôéêÜ ìïíôýëá ÃñáììáôéêÞ G = (T, N, P, S) T : ôåñìáôéêü óýìâïëá a N : ìç ôåñìáôéêü óýìâïëá A P : êáíüíåò ðáñáãùãþò α β S : áñ éêü óýìâïëï ÐáñáãùãÝò: áí α, β, γ, δ (T N) êáé (α β) P ôüôå γαδ γβδ Ãëþóóá: L(G) = { α T S + α } Éåñáñ ßá Chomsky Ôýðïõ 0: üëåò ïé ãñáììáôéêýò, α β Ôýðïõ 1: ãñáììáôéêýò ìå óõìöñáæüìåíá (context-sensitive), α β ìå α β Ôýðïõ 2: ãñáììáôéêýò ùñßò óõìöñáæüìåíá (context-free) A β Ôýðïõ 3: êáíïíéêýò ãñáììáôéêýò (regular) A ab Þ A a ÅéäéêÞ ðåñßðôùóç: ãëþóóåò ðïõ ðáñüãïõí ôçí êåíþ óõìâïëïóåéñü 16 / 216 17 / 216 18 / 216

ÔõðéêÝò ãëþóóåò (vi) ÊáíïíéêÝò ãëþóóåò ÊáíïíéêÝò ãëþóóåò ÁíáãíùñéóôÝò Ôýðïõ 0: ìç áíþ Turing Ôýðïõ 1: ãñáììéêü ðåñéïñéóìýíç ìç áíþ Turing Ôýðïõ 2: áõôüìáôá óôïßâáò (push-down automata) ñþóéìá óôç óõíôáêôéêþ áíüëõóç Ôýðïõ 3: ðåðåñáóìýíá áõôüìáôá (nite automata) ñþóéìá óôç ëåêôéêþ áíüëõóç ÊáíïíéêÝò ãñáììáôéêýò Ìüíï êáíüíåò 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?. Ðáñáäåßãìáôá êáíïíéêþí åêöñüóåùí ÁêÝñáéåò óôáèåñýò ùñßò ðñüóçìï óôçí Pascal Ýíá Þ ðåñéóóüôåñá äåêáäéêü øçößá [0-9] + ÁñéèìçôéêÝò óôáèåñýò ùñßò ðñüóçìï óôç C áêýñáéï ìýñïò ðïõ äåí áñ ßæåé ìå ìçäýí, åêôüò áí åßíáé ìçäåíéêü (ãéáôß;) ðñïáéñåôéêü: õðïäéáóôïëþ êáé êëáóìáôéêü ìýñïò ðñïáéñåôéêü: åêèýôçò ìå Þ ùñßò ðñüóçìï ([1-9][0-9] 0)(\.[0-9] + )?((E e)(+ )?[0-9] + )? 19 / 216 20 / 216 21 / 216 ÐåðåñáóìÝíá áõôüìáôá ÐåðåñáóìÝíá áõôüìáôá ÊáíïíéêÝò ãëþóóåò, áíáóêüðçóç A ÊáôáóôÜóåéò êáé ìåôáâüóåéò 0 0 1 1 ÍôåôåñìéíéóôéêÜ (ÍÐÁ), ìç íôåôåñìéíéóôéêü (ÌÐÁ) êáé ÌÐÁ ìå êåíýò ìåôáâüóåéò (ÌÐÁ-ɛ) Áñ éêþ êáôüóôáóç, ôåëéêýò êáôáóôüóåéò B A Ðïéá ãëþóóá áíáãíùñßæåé; 0 0 1 1 Ôç ãëþóóá ôùí óõìâïëïóåéñþí ðïõ áðïôåëïýíôáé áðü 0 êáé 1 êáé ðåñéý ïõí Üñôéï áñéèìü 1 B ÁíáãùãÝò êáé éóïäõíáìßåò êáíïíéêþ ãñáììáôéêþ ÌÐÁ-ɛ êáíïíéêþ Ýêöñáóç ÌÐÁ-ɛ ÌÐÁ-ɛ Åëá éóôïðïßçóç ÍÐÁ ÌÐÁ-ɛ êáíïíéêþ ãñáììáôéêþ ÌÐÁ-ɛ êáíïíéêþ Ýêöñáóç ÍÐÁ 22 / 216 23 / 216 24 / 216

ËåêôéêÞ áíüëõóç ÄéáãñÜììáôá ìåôüâáóçò ÁíáãíùñéóôéêÜ ôçò Pascal ÊåöÜëáéï 3: ËåêôéêÞ áíüëõóç ËåêôéêÝò ìïíüäåò (tokens) Áíáãíùñßæïíôáé ìå ðåðåñáóìýíá áõôüìáôá ðïõ: äéáâüæïõí åíäå ïìýíùò ðåñéóóüôåñïõò áñáêôþñåò ïðéóèïäñïìïýí áí ñåéáóôåß äéáèýôïõí Ýîïäï ðïõ ñçóéìïðïéåßôáé óôç óõíôáêôéêþ áíüëõóç Åéäéêüò óõìâïëéóìüò: äéáãñüììáôá ìåôüâáóçò 0 L L 1 L D L όχι L/D 0 1 2 (T_id) D 25 / 216 26 / 216 27 / 216 ÄéáãñÜììáôá ìåôüâáóçò ÊáôáóêåõÞ ôïõ ËÁ ÊáôáóêåõÞ ôïõ ËÁ ÔåëåóôÝò > êáé >= 0 0 > > όχι = 1 1 = 2 2 (T_gt) ÊáôáãñáöÞ êáé ôáîéíüìçóç áñáêôþñùí mapping : (ASCII { EOF }) Σ ÊáôáãñáöÞ êáé ôáîéíüìçóç ëåêôéêþí ìïíüäùí Êùäéêïðïßçóç ëåêôéêþí ìïíüäùí Áêïëïõèßá áñáêôþñùí (lexeme) Ó åäßáóç ôïõ äéáãñüììáôïò ìåôüâáóçò Õëïðïßçóç ôïõ ëåêôéêïý áíáëõôþ ÅðéìÝñïõò èýìáôá Ôñüðïò äéá ùñéóìïý ëåêôéêþí ìïíüäùí Ó üëéá ÄéÜêñéóç ðåæþí / êåöáëáßùí ãñáììüôùí ÅíäéÜìåóç ìíþìç (buer) ÁíÜíçøç áðü óöüëìáôá = 3 (T_ge) 28 / 216 29 / 216 30 / 216

ÊáôáóêåõÞ ôïõ ËÁ ÊáôáóêåõÞ ôïõ ËÁ (iv) Õëïðïßçóç ËÁ ìå ôï ex W Ó åäßáóç óõíïëéêïý äéáãñüììáôïò ìåôüâáóçò 0 = 24 (T_assign) L E D D. : 20 1 40 ; όχι = 21 ( 22 ) 23 (T_dot) (T_smcolon) (T_lparen) (T_rparen) (T_eq) (T_plus) (T_minus) 6 7 (T_colon) L E D _ = 26 + 30 = όχι = = όχι = = όχι = όχι 25 (T_le) όχι L E D _ όχι D. Ε Ε. 8 < > / 45 (T_id) D 41 (T_lt) 27 (T_ge) E + - 9 42 (T_gt) 10 28 (T_ne) D - 31 11 43 (T_div) EOF όχι D D 45 (T_eof) 2 3 4 5 όχι D Ε D 29 (T_power) 46 (T_const) 44 (T_times) Åíáëëáêôéêïß ôñüðïé õëïðïßçóçò: åéñùíáêôéêü Ìå ðßíáêá ìåôáâüóåùí Ìå ôï ìåôáåñãáëåßï ex Ìåôáåñãáëåßï ex: ãåííþôïñáò ËÁ Åßóïäïò: ìåôáðñüãñáììá ðïõ ðåñéãñüöåé ôéò ëåêôéêýò ìïíüäåò îïäïò: ðñüãñáììá óå C Ç óõíüñôçóç yylex õëïðïéåß ôï ËÁ ÅðéóôñÝöåé ôïí êùäéêü ôçò ëåêôéêþò ìïíüäáò ðïõ áíáãíùñßóôçêå, Þ 0 óôï ôýëïò ôçò óõìâïëïóåéñüò åéóüäïõ Ôïðïèåôåß óôç ìåôáâëçôþ yytext ôçí áíôßóôïé ç áêïëïõèßá áñáêôþñùí (lexeme) { 12 } 0 όχι } 31 / 216 32 / 216 33 / 216 Õëïðïßçóç ËÁ ìå ôï ex Õëïðïßçóç ËÁ ìå ôï ex Õëïðïßçóç ËÁ ìå ôï ex (iv) ÄïìÞ ôïõ ìåôáðñïãñüììáôïò ÌÝñïò Á %% ÌÝñïò  %% ÌÝñïò à Êáé ôá ôñßá ìýñç ìðïñïýí íá åßíáé êåíü ÌÝñïò Á, ðåñéý åé Ó üëéá, üðùò óôç C Êþäéêá C, ìýóá óå %{ êáé %} ÌíçìïíéêÜ ïíüìáôá ùò óõíôïìïãñáößåò êáíïíéêþí åêöñüóåùí Äçëþóåéò áñ éêþí êáôáóôüóåùí ÌÝñïò Á, ðáñüäåéãìá %{ #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 / 34 / 216 35 / 216 36 / 216

Õëïðïßçóç ËÁ ìå ôï ex (v) Õëïðïßçóç ËÁ ìå ôï ex (vi) Õëïðïßçóç ËÁ ìå ôï ex (vii) ÌÝñïò Â, ðåñéý åé êáíüíåò ôçò ìïñöþò êáíïíéêþ Ýêöñáóç ÊÜèå åíýñãåéá åßíáé ìéá åíôïëþ ôçò C åíýñãåéá Ëåéôïõñãßá: ÄéáâÜæåôáé ôï ìáêñýôåñï ðñüèåìá ôçò óõìâïëïóåéñüò åéóüäïõ ðïõ ìðïñåß íá áíáãíùñéóôåß áðü êüðïéá êáíïíéêþ Ýêöñáóç Åêôåëåßôáé ç áíôßóôïé ç åíýñãåéá ÊáíïíéêÝò åêöñüóåéò 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. ÊáíïíéêÝò åêöñüóåéò {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 Þ ðåñéóóüôåñåò öïñýò. 37 / 216 38 / 216 39 / 216 Õëïðïßçóç ËÁ ìå ôï ex (viii) Õëïðïßçóç ËÁ ìå ôï ex (ix) Õëïðïßçóç ËÁ ìå ôï ex (x) ÊáíïíéêÝò åêöñüóåéò (óõíý åéá) ^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 óå ïðïéáäþðïôå áñ éêþ êáôüóôáóç. ÌÝñïò Â, ðáñüäåéãìá "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"); } ÌÝñïò Ã, ðåñéý åé êþäéêá C ÐáñÜäåéãìá void ERROR (const char msg []) { fprintf(stderr, "ERROR: %s\n", msg); exit(1); } 40 / 216 41 / 216 42 / 216

Õëïðïßçóç ËÁ ìå ôï ex (xi) Õëïðïßçóç ËÁ ìå ôï ex (xii) Õëïðïßçóç ËÁ ìå ôï ex (xiii) ÐáñÜäåéãìá int main () { int token; } (óõíý åéá) do { token = yylex(); printf("token=%d, lexeme=\"%s\"\n", token, yytext); } while (token!= T_eof); return 0; ÐáñÜäåéãìá: Áñßèìçóç ãñáììþí int lineno = 1; [ \t]+ { / nothing / } \n { lineno++; } void ERROR (const char msg []) { fprintf(stderr, "ERROR, line %d: %s\n", lineno, msg); exit(1); } Ðñüâëçìá: ËÜèïò áñßèìçóç óå ó üëéá Áñ éêýò êáôáóôüóåéò ÊïéíÝò: %s ÁðïêëåéóôéêÝò: %x Åíåñãïß êáíüíåò óå êüðïéá êáôüóôáóç ÌåôÜâáóç ìåôáîý êáôáóôüóåùí: BEGIN(s) Áñ éêþ êáôüóôáóç êáôü ôçí Ýíáñîç ëåéôïõñãßáò ôïõ ËÁ: INITIAL 43 / 216 44 / 216 45 / 216 Õëïðïßçóç ËÁ ìå ôï ex (xiv) Ãëþóóåò ùñßò óõìöñáæüìåíá ÐáñÜäåéãìá: Áñßèìçóç ãñáììþí (äéüñèùóç) %x COMMENT "(" { BEGIN(COMMENT); } <COMMENT>")" { BEGIN(INITIAL); } <COMMENT>\n { lineno++; } <COMMENT>"" { / nothing / } <COMMENT>[^\n]+ { / nothing / } ÊåöÜëáéï 2: ÔõðéêÝò ãëþóóåò (ìýñïò 2ï) ÃñáììáôéêÝò ùñßò óõìöñáæüìåíá: A α Óå êüèå ðáñáãùãþ Ýíá ìç ôåñìáôéêü óýìâïëï áíôéêáèßóôáôáé, âüóåé åíüò êáíüíá ÐïëëÝò äéáöïñåôéêýò ðáñáãùãýò äéáöýñïõí ìüíï óôç óåéñü ôùí áíôéêáôáóôüóåùí Áñéóôåñüôåñç / äåîéüôåñç ðáñáãùãþ (leftmost / rightmost derivation) ÓõíôáêôéêÜ äýíôñá (parse trees) 46 / 216 47 / 216 48 / 216

Ãëþóóåò ùñßò óõìöñáæüìåíá Ìßá ðáñáãùãþ 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 a b a Äéöïñïýìåíåò ãñáììáôéêýò Äýï ãñáììáôéêýò åßíáé éóïäýíáìåò üôáí ðáñüãïõí ôçí ßäéá ãëþóóá. Ìéá ãñáììáôéêþ åßíáé äéöïñïýìåíç (ambiguous) áí õðüñ ïõí äýï Þ ðåñéóóüôåñá óõíôáêôéêü äýíôñá ãéá ôçí ßäéá ðáñáãüìåíç óõìâïëïóåéñü ÃñáììáôéêÝò êáé ãëþóóåò åããåíþò äéöïñïýìåíåò (inherently ambiguous) ñþóç äéöïñïýìåíùí ãñáììáôéêþí óôçí ðåñéãñáöþ ôçò óýíôáîçò ãëùóóþí ðñïãñáììáôéóìïý Äéöïñïýìåíåò ãñáììáôéêýò ÐáñÜäåéãìá: îåêñýìáóôï if (dangling if) 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 49 / 216 50 / 216 51 / 216 Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí Ôñüðïé ðáñüóôáóçò ãñáììáôéêþí Backus-Naur Form (BNF) Óýìâïëï ::= óôïõò êáíüíåò Ìç ôåñìáôéêü óýìâïëá óå ãùíéáêýò ðáñåíèýóåéò, ð.. expr Óýìâïëï ãéá äéüæåõîç Extended Backus-Naur Form ÔåñìáôéêÜ óýìâïëá óå åéóáãùãéêü ÐáñåíèÝóåéò ãéá ïìáäïðïßçóç Áãêýëåò ãéá ðñïáéñåôéêü ôìþìáôá Óýìâïëá êáé + ãéá åðáíüëçøç (EBNF) ÓõíôáêôéêÜ äéáãñüììáôá ÔåñìáôéêÜ óýìâïëá óå ïâüë Ìç ôåñìáôéêü óýìâïëá óå ïñèïãþíéá Äéáäï Þ óõìâüëùí (ðáñüèåóç) ìå âýëç 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 unsigned-number ::= digit + [ \." digit + ] [ (\E" \e") [ \+" \ " ] digit + ] digit ::= \0" \1" \2" \3" \4" \5" \6" \7" \8" \9" unsigned-number digit. digit E e + digit 52 / 216 53 / 216 54 / 216

ÓõíôáêôéêÞ áíüëõóç Top-down êáé bottom-up από πάνω προς τα κάτω (top-down) από κάτω προς τα πάνω (bottom-up) ÊåöÜëáéï 4: ÓõíôáêôéêÞ áíüëõóç Óõíôáêôéêü äýíôñï (parse tree) ÊáôáóêåõÜæåôáé ìå äýï ôñüðïõò: ÊáèïäéêÜ Áðü ðüíù ðñïò ôá êüôù (top-down) äçëáäþ îåêéíþíôáò áðü ôç ñßæá êáé ðñï ùñþíôáò ðñïò ôá öýëëá ÁíïäéêÜ Áðü êüôù ðñïò ôá ðüíù (bottom-up) äçëáäþ îåêéíþíôáò áðü ôá öýëëá êáé ðñï ùñþíôáò ðñïò ôç ñßæá 2 3 S 11 a A B c c 4 5 6 A S 8 B b 1 10 12 a 13 S 10 a A B c 1 8 2 c 5 6 A S B b 4 7 12 9 a 11 7 ε 9 a ε a 3 55 / 216 56 / 216 57 / 216 ÂïçèçôéêÝò Ýííïéåò ÂïçèçôéêÝò Ýííïéåò Õðïëïãéóìüò FIRST Óýíïëá FIRST óôù óõìâïëïóåéñü α (T N) Ôï óýíïëï FIRST(α) T { ɛ } ðåñéý åé ôá ôåñìáôéêü óýìâïëá áðü ôá ïðïßá áñ ßæïõí ïé óõìâïëïóåéñýò ðïõ ðáñüãïíôáé áðü ôçí α Áí α aβ ôüôå a FIRST(α) Áí α ɛ ôüôå ɛ FIRST(α) Óýíïëá FOLLOW óôù ìç ôåñìáôéêü óýìâïëï A Ôï óýíïëï FOLLOW(A) T { EOF } ðåñéý åé ôá ôåñìáôéêü óýìâïëá ðïõ ìðïñïýí íá áêïëïõèïýí ôï A óôç äéüñêåéá ìéáò ðáñáãùãþò Áí ôï A ìðïñåß íá åßíáé ôï ôåëåõôáßï óýìâïëï óå ìéá ðáñáãùãþ, ôüôå EOF FOLLOW(A) Áí S αaaβ ôüôå a FOLLOW(A) Áí S αa ôüôå EOF FOLLOW(A) FIRST(ɛ) = { ɛ } FIRST(aβ) = { a } áí ɛ FIRST(A) ôüôå FIRST(Aβ) = FIRST(A) áí ɛ FIRST(A) ôüôå FIRST(Aβ) = (FIRST(A) { ɛ }) FIRST(β) ãéá êüèå êáíüíá A α, ðñýðåé FIRST(α) FIRST(A) 58 / 216 59 / 216 60 / 216

Õðïëïãéóìüò FIRST Õðïëïãéóìüò FOLLOW Õðïëïãéóìüò FOLLOW ÐáñÜäåéãìá 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 EOF FOLLOW(S) ãéá êüèå êáíüíá A αbβ (FIRST(β) { ɛ }) FOLLOW(B) áí ɛ FIRST(β) ôüôå FOLLOW(A) FOLLOW(B) ÐáñÜäåéãìá 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 61 / 216 62 / 216 63 / 216 ÓÁ bottom-up ÓÁ bottom-up ÓÁ bottom-up B B Ç óõíôáêôéêþ áíüëõóç îåêéíü áðü ôá öýëëá ÊÜèå öïñü, áíáæçôü: ôïí áñéóôåñüôåñï êüìâï ôïõ äýíôñïõ ðïõ äåí Ý åé áêüìá êáôáóêåõáóôåß åíþ üëá ôá ðáéäéü ôïõ Ý ïõí êáôáóêåõáóôåß ÅðáíáëáìâÜíåé ìý ñé íá êáôáóêåõáóôåß ç ñßæá ÅëÜôôùóç (reducing): ç åðéëïãþ ôùí êüìâùí ðïõ èá áðïôåëýóïõí ôá ðáéäéü åíüò íýïõ êüìâïõ S r B B D B, D D a b D r a. b B D r B D a. b D S D D r a. b B B D D ÓÁ ïëßóèçóçò-åëüôôùóçò (shift-reduce) ñçóéìïðïéïýí ìéá (áñ éêü êåíþ) óôïßâá üðïõ ôïðïèåôïýí óýìâïëá ôçò ãñáììáôéêþò Ïëßóèçóç (shift): ìåôáöïñü åíüò óõìâüëïõ áðü ôçí åßóïäï óôçí êïñõöþ ôçò óôïßâáò ÅëÜôôùóç (reduce): áöáßñåóç áðü ôçí êïñõöþ ôçò óôïßâáò ôïõ äåîéïý ìýëïõò åíüò êáíüíá êáé ðñüóèåóç ôïõ áñéóôåñïý ìýëïõò Åðéôõ ßá: ç óôïßâá ðåñéý åé ìüíï ôï S êáé ôá óýìâïëá ôçò åéóüäïõ Ý ïõí åîáíôëçèåß r a. b r a. b 64 / 216 65 / 216 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 ÓÁ bottom-up LR(k) LR(0) SLR(1) LALR(1) LR(1) s m x m s 1 x 1 s 0 στοίβα (v) κορυφή συµβολοσειρά εισόδου a 1 a 2 a n EOF επόµενο σύµβολο Πίνακες ελέγχου συντακτικής ανάλυσης LR(1) ACTION NEXT Συντακτικός Αναλυτής LR(1) Õëïðïßçóç ÓÁ ìå ôï bison Ìåôáåñãáëåßï bison: ãåííþôïñáò ÓÁ LALR(1) Åßóïäïò: ìåôáðñüãñáììá ðïõ ðåñéãñüöåé ôç óýíôáîç êáé ôéò óçìáóéïëïãéêýò ñïõôßíåò îïäïò: ðñüãñáììá óå C Ç óõíüñôçóç yyparse õëïðïéåß ôï ÓÁ ÅðéóôñÝöåé 0 áí áíáãíùñéóôåß ç óõìâïëïóåéñü åéóüäïõ Þ 1 óå ðåñßðôùóç óõíôáêôéêïý óöüëìáôïò ÓõíåñãÜæåôáé ìå ôï ëåêôéêü áíáëõôþ (óõíüñôçóç yylex) 67 / 216 68 / 216 69 / 216 Õëïðïßçóç ÓÁ ìå ôï bison Õëïðïßçóç ÓÁ ìå ôï bison Õëïðïßçóç ÓÁ ìå ôï bison (iv) ÄïìÞ ôïõ ìåôáðñïãñüììáôïò ÌÝñïò Á %% ÌÝñïò  %% ÌÝñïò à Êáé ôá ôñßá ìýñç ìðïñïýí íá åßíáé êåíü ÌÝñïò Á, ðåñéý åé Ó üëéá, üðùò óôç C Êþäéêá C, ìýóá óå %{ êáé %} Äçëþóåéò ëåêôéêþí ìïíüäùí Äçëþóåéò ôåëåóôþí ôçò áñ éêþò ãëþóóáò (ðñïôåñáéüôçôá, ðñïóåôáéñéóôéêüôçôá) ÄÞëùóç ôïõ óõíüëïõ óçìáóéïëïãéêþí ôéìþí (ôýðïò YYSTYPE Þ ìå ñþóç ôïõ %union) ÄÞëùóç ôïõ ôýðïõ ôçò óçìáóéïëïãéêþò ôéìþò êüèå óõìâüëïõ ÌÝñïò Á, ðáñüäåéãìá %{ 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 70 / 216 71 / 216 72 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (v) Õëïðïßçóç ÓÁ ìå ôï bison (vi) Õëïðïßçóç ÓÁ ìå ôï bison (vii) ÌÝñïò Á, ðáñüäåéãìá %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 (óõíý åéá) ÌÝñïò Â, ðåñéý åé: ôïõò êáíüíåò ðáñáãùãþò óå ìïñöþ 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 ; ÌÝñïò Â, ðáñüäåéãìá program : { count=0; } block_list { printf("counted %d block(s)\n", count); } ; block_list : / nothing / block_list block { count++; } ; block : "begin" block_list "end" ; 73 / 216 74 / 216 75 / 216 Õëïðïßçóç ÓÁ ìå ôï bison (viii) Õëïðïßçóç ÓÁ ìå ôï bison (ix) Õëïðïßçóç ÓÁ ìå ôï bison (x) ÌÝñïò Ã, ðåñéý åé êþäéêá C Ôï ìåôáðñüãñáììá ôïõ bison áíáëáìâüíåé ôïí êåíôñéêü Ýëåã ï ôïõ ìåôáãëùôôéóôþ ðïõ åðéôõã Üíåôáé ìå ôç óõíåñãáóßá ôùí ðáñáêüôù: ôïõ ëåêôéêïý áíáëõôþ ôïõ óõíôáêôéêïý áíáëõôþ ôïõ ðßíáêá óõìâüëùí ôïõ óçìáóéïëïãéêïý áíáëõôþ ôïõ ãåííþôïñá åíäéüìåóïõ êþäéêá ÌÝñïò Ã, ðáñüäåéãìá void yyerror (const char msg) { fprintf(stderr, "syntax error in line %d: %s\n", linecount, msg); exit(1); } int main () { return yyparse(); } ÐáñÜäåéãìá ìå óçìáóéïëïãéêýò ôéìýò E T E E + T T F T T F F ( E ) F num Æçôïýìåíï: íá êáôáóêåõáóôåß ÓÁ ðïõ íá õðïëïãßæåé ôçí ôéìþ ìéáò áñéèìçôéêþò Ýêöñáóçò 76 / 216 77 / 216 78 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (xi) Õëïðïßçóç ÓÁ ìå ôï bison (xii) Õëïðïßçóç ÓÁ ìå ôï bison (xiii) ÐáñÜäåéãìá (óõíý åéá) %{ typedef int YYSTYPE; %} %token T_num %% program : expression { printf("value: %d\n", $1); } ; ÐáñÜäåéãìá (óõíý åéá) expression : term { $$ = $1; } expression '+' term { $$ = $1 + $3; } ; term : factor { $$ = $1; } term '' factor { $$ = $1 $3; } ; ÐáñÜäåéãìá (óõíý åéá) factor : '(' expression ')' { $$ = $2; } T_num { $$ = $1; } ; %% Ðáñáëåßðïíôáé óôï ÌÝñïò Ã: ç óõíüñôçóç yylex (ðéèáíþò óå îå ùñéóôü áñ åßï, áí ñçóéìïðïéçèåß ôï ex) ïé óõíáñôþóåéò yyerror êáé main 79 / 216 80 / 216 81 / 216 Õëïðïßçóç ÓÁ ìå ôï bison (xiv) Õëïðïßçóç ÓÁ ìå ôï bison (xv) Õëïðïßçóç ÓÁ ìå ôï bison (xvi) ÐáñÜäåéãìá Õëïðïßçóç ËÁ åéñùíáêôéêü 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; } Óôï ìýñïò à ÐáñÜäåéãìá (óõíý åéá) 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 ÐáñÜäåéãìá Õëïðïßçóç ËÁ ìå ôï ex %{ #include "mytest2.tab.h" %} %% [0-9]+ { yylval = atoi(yytext); return T_num; } \( \) \+ \ { return yytext[0]; } [ \t\n]+ { / nothing / }. { yyerror("illegal character"); } %% mytest2.l 82 / 216 83 / 216 84 / 216

Õëïðïßçóç ÓÁ ìå ôï bison (xvii) ÓÁ top-down ÃñáììáôéêÝò LL(1) Áõôïìáôïðïßçóç ôçò ìåôáãëþôôéóçò ËÁ êáé ÓÁ 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 Ç óõíôáêôéêþ áíüëõóç îåêéíü áðü ôç ñßæá ÊÜèå öïñü, áíáæçôü: ôï ìç ôåñìáôéêü óýìâïëï ðïõ èá áíôéêáôáóôáèåß óõíþèùò åðéëýãåôáé ôï áñéóôåñüôåñï ôïí êáíüíá ðáñáãùãþò ðïõ èá åöáñìïóôåß âüóåé ôùí åðüìåíùí k ëåêôéêþí ìïíüäùí óôç óõìâïëïóåéñü åéóüäïõ: LL(k) ÅðáíáëáìâÜíåôáé ìý ñé íá åîáíôëçèïýí ôá ìç ôåñìáôéêü Áðáñáßôçôåò ðñïûðïèýóåéò: Áðïõóßá áñéóôåñþò áíáäñïìþò (Üìåóçò Þ Ýììåóçò) Áðïõóßá êïéíïý ðñïèýìáôïò óå åíáëëáêôéêïýò êáíüíåò ÌåñéêÝò öïñýò åßíáé äõíáôüò ï ìåôáó çìáôéóìüò ìéáò ãñáììáôéêþò óå éóïäýíáìç LL(1) áðáëïéöþ áñéóôåñþò áíáäñïìþò áñéóôåñþ ðáñáãïíôïðïßçóç 85 / 216 86 / 216 87 / 216 Ìåôáó çìáôéóìüò óå LL(1) ÓÁ áíáäñïìéêþò êáôüâáóçò ÓÁ 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 ɛ 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 ñçóéìïðïéïýí ìéá óôïßâá üðïõ ôïðïèåôïýí óýìâïëá ôçò ãñáììáôéêþò áñ éêü ìüíï ôï S ÊÜèå öïñü åîåôüæåôáé ç êïñõöþ ôçò óôïßâáò: Áí åßíáé ôåñìáôéêü óýìâïëï êáé åßíáé ôï ßäéï ìå ôï åðüìåíï ôçò óõìâïëïóåéñüò åéóüäïõ, ôüôå áöáéñïýíôáé êáé ôá äýï Áí åßíáé ìç ôåñìáôéêü óýìâïëï, ôüôå áíüëïãá ìå ôï åðüìåíï ôçò óõìâïëïóåéñüò åéóüäïõ åöáñìüæåôáé êüðïéïò êáíüíáò Åðéôõ ßá: ç óôïßâá êáé ç óõìâïëïóåéñü åéóüäïõ åßíáé Üäåéåò 88 / 216 89 / 216 90 / 216

ÓÁ LL(1) ÊáôáóêåõÞ ÓÁ LL(1) Ëåéôïõñãßá ÓÁ LL(1) Ï áëãüñéèìïò êáôáóêåõþò ôïõ ðßíáêá M ïñßæåé ôçí ïéêïãýíåéá ôùí ãëùóóþí LL(1) x m x 2 x 1 στοίβα κορυφή συµβολοσειρά εισόδου a 1 a 2 a n EOF επόµενο σύµβολο Πίνακας M συντακτικής ανάλυσης LL(1) Συντακτικός Αναλυτής 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) 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 áíáãíþñéóç 91 / 216 92 / 216 93 / 216 ÊáôçãïñéêÝò ãñáììáôéêýò ÊáôçãïñéêÝò ãñáììáôéêýò ÊåöÜëáéï 2: ÔõðéêÝò ãëþóóåò (ìýñïò 3ï) ÊáôçãïñéêÞ ãñáììáôéêþ (attribute grammar): ãñáììáôéêþ ùñßò óõìöñáæüìåíá üðïõ êüèå óýìâïëï öýñåé Ýíá óýíïëï êáôçãïñçìüôùí Ïé ôéìýò ôùí êáôçãïñçìüôùí õðïëïãßæïíôáé âüóåé ôïõ óõíôáêôéêïý äýíôñïõ: ÓõíèåôéêÜ êáôçãïñþìáôá: ïé ôéìýò ôïõò åîáñôþíôáé ìüíï áðü êáôçãïñþìáôá ôùí ðáéäéþí êüèå êüìâïõ Êëçñïíïìïýìåíá êáôçãïñþìáôá: ïé ôéìýò ôïõò åîáñôþíôáé ìüíï áðü êáôçãïñþìáôá ôïõ \ðáôýñá" êáé ôùí \áäåëöþí" êüèå êüìâïõ 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 } Óçìáóéïëïãéêïß êáíüíåò 94 / 216 95 / 216 96 / 216

Ðßíáêáò óõìâüëùí áñáêôçñéóôéêü ïíïìüôùí ÊåöÜëáéï 5: Ðßíáêáò óõìâüëùí Óõãêåíôñþíåé ðëçñïöïñßåò ãéá ôá ïíüìáôá ðïõ åìöáíßæïíôáé óôï áñ éêü ðñüãñáììá Ïíüìáôá åßíáé: ôï ðñüãñáììá ïé ìåôáâëçôýò ôá õðïðñïãñüììáôá (äéáäéêáóßåò, óõíáñôþóåéò) ïé ðáñüìåôñïé ôùí õðïðñïãñáììüôùí ïé åôéêýôôåò åíôïëþí ïé óôáèåñýò ïé ôýðïé äåäïìýíùí Êáôçãïñßá áðïèþêåõóçò (storage class) ÊáèïëéêÝò ìåôáâëçôýò (global variables) ÌåôáâëçôÝò óôïßâáò (stack variables) ÓôáôéêÝò ìåôáâëçôýò (static variables) ÅìâÝëåéá (scope) Ïñáôüôçôá (visibility) ÄéÜñêåéá æùþò (lifetime) 97 / 216 98 / 216 99 / 216 Ðåñéå üìåíá ðßíáêá óõìâüëùí ÏñãÜíùóç ðßíáêá óõìâüëùí Õëïðïßçóç ìå ÐÊ ÅìâÝëåéá (Ýììåóá) Ïñáôüôçôá (Ýììåóá) ÄéÜñêåéá æùþò Ôýðïò ÈÝóç (äéåýèõíóç ìíþìçò, êáôá ùñçôþò, ) Áñéèìüò ðáñáìýôñùí õðïðñïãñüììáôïò Ôýðïò ðáñáìýôñùí õðïðñïãñüììáôïò Ôñüðïò ðåñüóìáôïò ðáñáìýôñùí õðïðñïãñüììáôïò Ôýðïò áðïôåëýóìáôïò óõíüñôçóçò ÂáóéêÝò ëåéôïõñãßåò ÐñïóèÞêç ïíüìáôïò ÁíáæÞôçóç ïíüìáôïò ÄéáãñáöÞ ïíüìáôïò Þ ïìüäáò ïíïìüôùí Êüóôïò ðñïóèþêçò Þ áíáæþôçóçò áíüëïãá ìå ôçí õëïðïßçóç: ãñáììéêþ ëßóôá O(n) äõáäéêü äýíôñï áíáæþôçóçò O(log n) ðßíáêáò êáôáêåñìáôéóìïý O(n/k) 0 1 2... k 2 k 1 πίνακας κατακερµατισµού b c x a aa y c b a στοίβα αποθήκευσης εµβέλεια 3 εµβέλεια 2 εµβέλεια 1 3 2 1 στοίβα εµβελειών 100 / 216 101 / 216 102 / 216

Óýíôáîç êáé óçìáóéïëïãßá ÓôáôéêÞ óçìáóéïëïãßá ÐåñéâÜëëïíôá ôýðùí ÊåöÜëáéï 6: ÓçìáóéïëïãéêÞ áíüëõóç Óýíôáîç: ìïñöþ êáé äïìþ ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí Óçìáóéïëïãßá: åñìçíåßá ôùí êáëþò ó çìáôéóìýíùí ðñïãñáììüôùí ÓôáôéêÞ óçìáóéïëïãßá: åíôïðéóìüò óçìáóéïëïãéêþí óöáëìüôùí êáôü ôç äéüñêåéá ôçò ìåôáãëþôôéóçò ÄõíáìéêÞ óçìáóéïëïãßá: áðüäïóç åñìçíåßáò óôá ðñïãñüììáôá êáôü ôçí åêôýëåóþ ôïõò Γ 1 = { i integer, x real } Ó Ýóç áíôéóôïß éóçò ôýðùí Γ E : τ Êáíüíåò ôýðùí Γ E 1 : integer Γ E 2 : integer Γ E 1 +E 2 : integer 103 / 216 104 / 216 105 / 216 ÓôáôéêÞ óçìáóéïëïãßá ÄõíáìéêÞ óçìáóéïëïãßá ÄõíáìéêÞ óçìáóéïëïãßá ÐáñáãùãÝò ôýðùí Γ 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 ËåéôïõñãéêÞ óçìáóéïëïãßá (operational semantics) áêïëïõèßá õðïëïãéóôéêþí âçìüôùí ÄçëùôéêÞ óçìáóéïëïãßá (denotational semantics) ìáèçìáôéêþ óõíüñôçóç áðü ôï ðåäßï ôùí äåäïìýíùí åéóüäïõ óôï ðåäßï ôùí áðïôåëåóìüôùí ÁîéùìáôéêÞ óçìáóéïëïãßá (axiomatic semantics) ç åñìçíåßá êáèïñßæåôáé Ýììåóá ìýóù ëïãéêþí ðñïôüóåùí ðïõ ðåñéãñüöïõí éäéüôçôåò ôïõ ðñïãñüììáôïò Ç åíôïëþ áíüèåóçò I=E ËåéôïõñãéêÞ óçìáóéïëïãßá ÄçëùôéêÞ óçìáóéïëïãßá E, σ v I=E, σ σ[i v] C[[I=E ]](s) = s[i E[[E ]](s)] ÁîéùìáôéêÞ óçìáóéïëïãßá { P [I E] } I=E { P } 106 / 216 107 / 216 108 / 216

Óçìáóéïëïãéêüò Ýëåã ïò Óçìáóéïëïãéêüò Ýëåã ïò Óýóôçìá ôýðùí ëåã ïò ôýðùí ð.. ïé ôåëåóôýò åöáñìüæïíôáé óå êáôüëëçëá ôåëïýìåíá ëåã ïò ñïþò ð.. ü é continue Ýîù áðü âñü ï ð.. ïé ìåôáâëçôýò áñ éêïðïéïýíôáé ðñéí ôç ñþóç ëåã ïò ýðáñîçò ïíïìüôùí ð.. ïé ìåôáâëçôýò ïñßæïíôáé ðñéí ôç ñþóç ôïõò ëåã ïò ìïíáäéêüôçôáò ð.. ïé óôáèåñýò óå ìßá äïìþ case åßíáé ìïíáäéêýò ëåã ïò óõíýðåéáò ð.. óùóôü üíïìá õðïðñïãñüììáôïò óôï end (C) (Java) (Pascal) (Ada) Áðïõóßá óçìáóéïëïãéêþí óöáëìüôùí áðïõóßá óöáëìüôùí åêôýëåóçò ÌåñéêÝò öïñýò üìùò åßíáé äõíáôü íá ðñïâëåöèïýí óöüëìáôá åêôýëåóçò program p; var x, y : integer; begin read(x); y := 5/(x-x) end. Âáóéêïß ôýðïé (integer, boolean, real, char, ) Óýíèåôïé ôýðïé Ðßíáêåò (arrays) Æåýãç (products) êáé ðëåéüäåò (tuples) ÅããñáöÝò (records) Äåßêôåò (pointers) ÓõíáñôÞóåéò (functions) Ôýðïé êáé ôéìýò ðñþôçò ôüîçò (rst class) 109 / 216 110 / 216 111 / 216 ÁðëÝò åêöñüóåéò, âáóéêïß ôýðïé ÁðëÝò åêöñüóåéò, âáóéêïß ôýðïé ÁðëÝò åêöñüóåéò, âáóéêïß ôýðïé ÓçìáóéïëïãéêÞ áíüëõóç óôï bison Óêïðüò: õðïëïãéóìüò ôïõ ðåäßïõ type %{ 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 expression : T_intconst { $$.type = TY_int; } T_realconst { $$.type = TY_real; } '(' expression ')' { $$.type = $2.type; } ; expression : T_id { Entry id = lookup($1); if (id!= NULL && id->kind == K_variable) $$.type = id->type; else yyerror("identifier not found"); } ; expression : expression "mod" expression { if ($1.type == TY_int && $3.type == TY_int) $$.type = TY_int; else yyerror("type mismatch"); } ; statement : "while" expression "do" statement { if ($2.type!= TY_bool) yyerror("condition type mismatch") } ; 112 / 216 113 / 216 114 / 216

ÌåôáôñïðÝò ôýðùí Õðåñöüñôùóç ôåëåóôþí Ðïëõìïñöéêïß ôåëåóôýò ìåóç ìåôáôñïðþ (type casting) expression : '(' typename ')' expression { if (iscastallowed($2, $4.type)) $$.type = $2; else yyerror("illegal type cast"); } ; ììåóç ìåôáôñïðþ { åîáíáãêáóìüò (coercion) expression : expression '+' expression { if ($1.type == TY_int) if ($3.type == TY_int) $$.type = TY_int; else if ($3.type == TY_real) $$.type = TY_real; else yyerror("type mismatch"); else if ($1.type == TY_real) if ($3.type == TY_int) $$.type = TY_real; else if ($3.type == TY_real) $$.type = TY_real; else yyerror("type mismatch"); else yyerror("type mismatch"); } ; typedef struct type_str { enum { TY_integer, TY_real, TY_boolean, TY_ptr } code; struct type_str ptr_type; } Type; expression : expression '^' { if ($1.type.code == TY_ptr) $$.type = ($$.type.ptr_type); else yyerror("type mismatch"); } ; Óõíþíõìá êáé éóïäõíáìßá ôýðùí 115 / 216 Õðïóýíïëá ôýðùí êáé õðïôýðïé 116 / 216 Ðïëõìïñöéêïß ôýðïé 117 / 216 Óõíþíõìá ôýðùí (type aliases) type complex = record re, im : real end; Éóïäõíáìßá ôýðùí (type equivalence) ÄïìéêÞ éóïäõíáìßá ÏíïìáóôéêÞ éóïäõíáìßá (ÄçëùôéêÞ éóïäõíáìßá) Γ E : τ τ <: τ Γ E : τ var indexsmall : 1..10; indexlarge : 1..1000; indexgeneral : integer; indexgeneral := indexsmall; ( OK: 1..10 <: integer ) indexlarge := indexgeneral; ( äõíáìéêüò Ýëåã ïò! ) Õðïôýðïé êõñßùò óå áíôéêåéìåíïóôñåöåßò ãëþóóåò Ðáñáìåôñéêüò ðïëõìïñöéóìüò (templates, generics) template <class T> bool exists (int length, T array [], T element) { for (int i=0; i < length; i++) if (array[i] == element) return true; return false; } ÓõíáñôçóéáêÝò ãëþóóåò 118 / 216 119 / 216 120 / 216

Áíôéóôïß éóç ôýðùí ÅîáãùãÞ ôýðùí Äõíáìéêüò Ýëåã ïò ôýðùí ÓôáôéêÞ ñçôþ Ýììåóç ÄõíáìéêÞ x := 5; ( x : integer ) x := "hello"; ( ôþñá üìùò x : string ) val pi = 3.14159; ( pi : real ) fun inc x = x + 1; ( inc : int -> int ) fun add x y = x + y; ( add : int -> int -> int ) fun add1 (x : real) y = x + y; fun add2 x y : real = x + y; ( add1, add2 : real -> real -> real ) fun id x = x; ( id : 'a -> 'a ) ÅðéâÜëëåôáé üôáí õðüñ åé äõíáìéêþ áíôéóôïß éóç ôýðùí ÐïëëÝò öïñýò üìùò áðáéôåßôáé êáé óå óôáôéêþ áíôéóôïß éóç ôýðùí, ð.. Ýëåã ïò ïñßùí óå arrays: var a : array [0..100] of integer; a[i] := 42 if i 0 and i 100 then êþäéêáò ãéá ôçí áíüèåóç ôïõ 42 óôï a[i] else óöüëìá åêôýëåóçò end if 121 / 216 122 / 216 123 / 216 ÅíäéÜìåóïò êþäéêáò ÅíäéÜìåóïò êþäéêáò ÊåöÜëáéï 7: ÅíäéÜìåóïò êþäéêáò Ëüãïé ýðáñîçò Äéåõêïëýíåé ôï Ýñãï ôçò ìåôüöñáóçò Äéåõêïëýíåé ôç âåëôéóôïðïßçóç Äéåõêïëýíåé ôçí êáôüôìçóç óå åìðñüóèéï êáé ïðßóèéï ôìþìá ÌåôÜöñáóç ïäçãïýìåíç áðü ôç óýíôáîç (syntax-directed translation) Ãéá êüèå äïìþ ôçò ãëþóóáò ðñïóäéïñßæåôáé ï áíôßóôïé ïò åíäéüìåóïò êþäéêáò Äéåõñýíåôáé ï óõíôáêôéêüò áíáëõôþò ìå óçìáóéïëïãéêýò ñïõôßíåò ðïõ ðáñüãïõí åíäéüìåóï êþäéêá Ó Ýäéï ðáñáãùãþò åíäéüìåóïõ êþäéêá ÌåôáâëçôÝò éäéïôþôùí (attributes) ãéá êüèå óýìâïëï ôçò ãñáììáôéêþò 124 / 216 125 / 216 126 / 216

ÅíäéÜìåóç ãëþóóá ÅíäéÜìåóç ãëþóóá ÅíäéÜìåóç ãëþóóá ÔåôñÜäåò (quadruples) n: op, x, y, z ÔñéÜäåò (triples) n: op, x, y ÁöçñçìÝíá óõíôáêôéêü äýíôñá (abstract syntax trees) ÐáñÜäåéãìá: bb-4ac ÐáñÜäåéãìá: 1:, b, b, $1 2:, 4, a, $2 3:, $2, c, $3 4:, $1, $3, $4 bb-4ac ÐáñÜäåéãìá: 1:, b, b 2:, 4, a 3:, (2), c 4:, (1), (3) bb-4ac b b c 4 a 127 / 216 128 / 216 129 / 216 ÅíäéÜìåóç ãëþóóá (iv) ÅíäéÜìåóç ãëþóóá (v) Ãëþóóá ôåôñüäùí Ðñïèåìáôéêüò êáé åðéèåìáôéêüò êþäéêáò (prex/postx code) ÐáñÜäåéãìá: b b 4 a c b b 4 a c bb-4ac ðñïèåìáôéêüò åðéèåìáôéêüò Êáôåõèõíüìåíïé áêõêëéêïß ãñüöïé (directed acyclic graphs) ÐáñÜäåéãìá: b + b+(a+1)(a+1)+c-(a+1)(a+1)+2/(a+1) + c + + a 1 + c a 1 + a 1 2 / + b + + 2 / ÌïñöÞ ôåôñüäáò: n: op, x, y, z üðïõ: n: åôéêýôá ôåôñüäáò (öõóéêüò áñéèìüò) op: ôåëåóôþò x, y, z: ôåëïýìåíá ÁíÜëïãá ìå ôï åßäïò ôïõ ôåëåóôþ, êüðïéá ôåëïýìåíá åíäå ïìýíùò ðáñáëåßðïíôáé + + + a 1 a 1 a 1 130 / 216 131 / 216 132 / 216

Ôåëïýìåíá Ôåëïýìåíá ÔåëåóôÝò ÓôáèåñÜ áêýñáéá, ðñáãìáôéêþ, ëïãéêþ áñáêôþñáò, óõìâïëïóåéñü, nil ¼íïìá ìåôáâëçôþ, ðáñáìýôñïò, õðïðñüãñáììá ÐñïóùñéíÞ ìåôáâëçôþ: $n ÁðïôÝëåóìá óõíüñôçóçò: $$ Áðïäåéêôïäüôçóç: [x] x áðëü ôåëïýìåíï Äéåýèõíóç: {x} x áðëü ôåëïýìåíï ÅôéêÝôá åíôïëþò óôï áñ éêü ðñüãñáììá ôåôñüäáò Ôñüðïò ðåñüóìáôïò V : êáô' áîßá R : êáô' áíáöïñü RET : èýóç áðïôåëýóìáôïò óõíüñôçóçò Êåíü : ÐñïóùñéíÜ êåíü : (ãéá backpatching) unit, I,, endu, I,, áñ Þ êáé ôýëïò äïìéêþò ìïíüäáò op, x, y, z op {+, -,, /, %} z := x op y :=, x,, z z := x array, x, y, z z := ç äéåýèõíóç ôïõ óôïé åßïõ x[y] 133 / 216 134 / 216 135 / 216 ÔåëåóôÝò ÔåëåóôÝò ÌåôáâëçôÝò éäéïôþôùí op, x, y, z op {=, <>, >, <, >=, <=} áí x op y ôüôå ðþãáéíå óôçí ôåôñüäá z ifb, x,, z áí ç ëïãéêþ ôéìþ x åßíáé áëçèþò ôüôå ðþãáéíå óôçí ôåôñüäá z jump,,, z ðþãáéíå óôçí ôåôñüäá z label, I,, jumpl,,, I ïñéóìüò åôéêýôáò êáé Üëìá ðñïò áõôþí call,,, I êüëåóå ôç äïìéêþ ìïíüäá I par, x, m, ðýñáóå ôçí ðñáãìáôéêþ ðáñüìåôñï x ìå ôñüðï ðåñüóìáôïò m ret,,, åðéóôñïöþ áðü ôçí ôñý ïõóá äïìéêþ ìïíüäá PLACE: èýóç üðïõ âñßóêåôáé áðïèçêåõìýíç ç ôéìþ ìéáò l-value Þ ìéáò r-value TYPE: ôýðïò ìéáò l-value Þ ìéáò r-value NEXT : ëßóôá áðü åôéêýôåò ôåôñüäùí ðïõ ðåñéý ïõí Üëìáôá óôçí åðüìåíç åíôïëþ TRUE, FALSE: ëßóôåò áðü åôéêýôåò ôåôñüäùí ðïõ ðåñéý ïõí Üëìáôá óôïí êþäéêá ðïõ ðñýðåé íá åêôåëåóôåß áí ìéá óõíèþêç åßíáé áëçèþò Þ øåõäþò 136 / 216 137 / 216 138 / 216

ÂïçèçôéêÝò õðïñïõôßíåò ÂïçèçôéêÝò õðïñïõôßíåò ÁñéèìçôéêÝò åêöñüóåéò NEXTQUAD() ÅðéóôñÝöåé ôïí áñéèìü ôçò åðüìåíçò ôåôñüäáò GENQUAD(op, x, y, z) ÃåííÜ ôçí åðüìåíç ôåôñüäá op, x, y, z NEWTEMP(t) Äçìéïõñãåß ìéá íýá ðñïóùñéíþ ìåôáâëçôþ ôýðïõ t EMPTYLIST() Äçìéïõñãåß ìéá êåíþ ëßóôá åôéêåôþí ôåôñüäùí MAKELIST(x) Äçìéïõñãåß ìéá ëßóôá åôéêåôþí ôåôñüäùí ðïõ ðåñéý åé ìüíï ôï óôïé åßï x MERGE(l 1,..., l n ) ÓõíÝíùóç ôùí ëéóôþí åôéêåôþí ôåôñüäùí l 1... l n BACKPATCH(l, z) ÁíôéêáèéóôÜ óå üëåò ôéò ôåôñüäåò ðïõ ðåñéý ïíôáé óôçí l ôçí Üãíùóôç åôéêýôá ôåôñüäáò ìå ôç z (backpatching) ÁêÝñáéåò óôáèåñýò r-value ::= integer-const { P 1 } P 1 : { r-value.place = integer-const ; } ÔåëåóôÝò ìå äýï ôåëïýìåíá r-value ::= expr binop expr { P 14 } P 14 : { W = NEWTEMP( r-value.type); GENQUAD( binop.name, expr 1.PLACE, expr 2.PLACE, W ); r-value.place = W ; } 139 / 216 140 / 216 141 / 216 ËïãéêÝò åêöñüóåéò ËïãéêÝò åêöñüóåéò ËïãéêÝò åêöñüóåéò <cond> jump,,, 31 jump,,, 42 jump,,, 31 jump,,, 31 jump,,, 42 ËïãéêÝò åêöñüóåéò óå óõìâïëéóìü 0/1 cond ::= expr <cond> <expr> ifb, <expr>.place,, jump,,, ËïãéêÝò åêöñüóåéò óå óõìâïëéóìü 0/1 cond ::= expr { P 21 } P 21 : { cond.true = MAKELIST(NEXTQUAD()); GENQUAD(ifb, expr.place,, ); cond.false = MAKELIST(NEXTQUAD()); GENQUAD(jump,,, ); } <cond>.false <cond>.true FALSE TRUE 142 / 216 143 / 216 144 / 216

ËïãéêÝò åêöñüóåéò (iv) ËïãéêÝò åêöñüóåéò (v) ËïãéêÝò åêöñüóåéò (vi) ÔåëåóôÝò óýãêñéóçò cond ::= expr 1 relop expr 2 <cond> ÔåëåóôÝò óýãêñéóçò cond ::= expr 1 relop expr 2 { P 23 } ñíçóç cond ::= \not" cond <expr> 1 <expr> 2 relop, <expr> 1.PLACE, <expr> 2.PLACE, jump,,, P 23 : { cond.true = MAKELIST(NEXTQUAD()); GENQUAD( relop.name, expr 1.PLACE, expr 2.PLACE, ); cond.false = MAKELIST(NEXTQUAD()); GENQUAD(jump,,, ); } <cond> TRUE FALSE <cond> FALSE TRUE FALSE TRUE 145 / 216 146 / 216 147 / 216 ËïãéêÝò åêöñüóåéò (vii) ËïãéêÝò åêöñüóåéò (viii) ÁðëÝò åíôïëýò Óýæåõîç cond ::= cond 1 \and" cond 2 Óýæåõîç ÊåíÞ åíôïëþ stmt ::= ɛ { P 29 } <cond> cond ::= cond 1 \and" { P 25 } cond 2 { P 26 } P 29 : { stmt.next = EMPTYLIST(); } FALSE FALSE FALSE <cond> 1 <cond> 2 TRUE TRUE TRUE P 25 : { BACKPATCH( cond 1.TRUE, NEXTQUAD()); } P 26 : { cond.false = MERGE( cond 1.FALSE, cond 2.FALSE); cond.true = cond 2.TRUE; } ÅíôïëÞ áíüèåóçò stmt ::= l-value \:=" expr { P 30 } P 30 : { GENQUAD(\:=", expr.place,, l-value.place); stmt.next = EMPTYLIST(); } 148 / 216 149 / 216 150 / 216

Óýíèåôç åíôïëþ Óýíèåôç åíôïëþ ÅíôïëÞ if stmt ::= block block ::= \begin" stmt ( \;" stmt ) <block> NEXT <stmt> 1 NEXT <stmt> 2 \end" stmt ::= block { P 34 } P 34 : { stmt.next = block.next ; } block ::= \begin" stmt 1 { P 35 } ( \;" { P 36 } stmt 2 { P 37 } ) \end" { P 38 } P 35 : { L = stmt 1.NEXT ; } P 36 : { BACKPATCH(L, NEXTQUAD()); } P 37 : { L = stmt 2.NEXT ; } P 38 : { block.next = L; } stmt ::= \if " cond \then" stmt [ \else" stmt ] <stmt> FALSE TRUE <cond> <stmt> NEXT <stmt> 1 TRUE FALSE <cond> jump,,, NEXT NEXT <stmt> 1 <stmt> 2 NEXT NEXT NEXT 151 / 216 152 / 216 153 / 216 ÅíôïëÞ if ÅíôïëÞ while ÅíôïëÞ while stmt ::= \if " cond { P 39 } \then" stmt 1 [ \else" { P 40 } stmt 2 { P 41 } ] { P 42 } P 39 : { BACKPATCH( cond.true, NEXTQUAD()); L 1 = cond.false; L 2 = EMPTYLIST(); } P 40 : { L 1 = MAKELIST(NEXTQUAD()); GENQUAD(jump,,, ); BACKPATCH( cond.false, NEXTQUAD()); } P 41 : { L 2 = stmt 2.NEXT ; } stmt ::= \while" cond \do" stmt <stmt> FALSE <cond> <stmt> 1 jump,,, TRUE NEXT stmt ::= \while" { P 43 } cond \do" { P 44 } stmt 1 { P 45 } P 43 : { Q = NEXTQUAD(); } P 44 : { BACKPATCH( cond.true, NEXTQUAD()); } P 45 : { BACKPATCH( stmt 1.NEXT, Q); GENQUAD(jump,,, Q); stmt.next = cond.false; } P 42 : { stmt.next = MERGE(L 1, stmt 1.NEXT, L 2 ); } NEXT 154 / 216 155 / 216 156 / 216

ÊëÞóç õðïðñïãñáììüôùí ÊëÞóç õðïðñïãñáììüôùí ÊëÞóç õðïðñïãñáììüôùí call ::= id \(" [ expr ( \," expr ) ] \)" r-value ::= call stmt ::= call ÐÝñáóìá ðáñáìýôñùí ìå ôåôñüäåò par ÐÝñáóìá èýóçò áðïôåëýóìáôïò ìå ôåôñüäá par áí ðñüêåéôáé ãéá óõíüñôçóç ÊëÞóç ìå ôåôñüäá call call ::= id \(" { P 46 } [ expr 1 { P 47 } ( \," expr 2 { P 48 } ) ] \)" { P 49 } P 46 : { N = 1; } P 47 : { GENQUAD(\par", expr 1.PLACE, PARAMMODE( id, N ), ); N = N + 1; } P 48 : { GENQUAD(\par", expr 2.PLACE, PARAMMODE( id, N ), ); N = N + 1; } call ::= id \(" { P 46 } [ expr 1 { P 47 } ( \," expr 2 { P 48 } ) ] \)" { P 49 } (óõíý åéá) P 49 : { if (ISFUNCTION( id )) { W = NEWTEMP(FUNCRESULT( id )); GENQUAD(par, RET, W, ); call.place = W ; } GENQUAD(call,,, id ); } 157 / 216 158 / 216 159 / 216 ÊëÞóç õðïðñïãñáììüôùí (iv) ÊëÞóç õðïðñïãñáììüôùí (v) ÐáñÜäåéãìá ÊëÞóç óõíüñôçóçò r-value ::= call { P 50 } P 50 : { r-value.place = call.place; } ÊëÞóç äéáäéêáóßáò stmt ::= call { P 51 } P 51 : { stmt.next = EMPTYLIST(); } ÅðéóôñïöÞ áðü õðïðñüãñáììá stmt ::= \return" [ expr { P 52 } ] { P 53 } P 52 : { GENQUAD(retv, expr.place,, ); } P 53 : { GENQUAD(ret,,, ); } ÄÞëùóç õðïðñïãñüììáôïò body ::= ( local ) { P 56 } block \;" { P 57 } P 56 : { GENQUAD(unit, I,, ); } P 57 : { BACKPATCH( block.next, NEXTQUAD()); GENQUAD(endu, I,, ); } procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; quicksort(a, m, j); quicksort(a, i, n) end; 160 / 216 161 / 216 162 / 216

ÐáñÜäåéãìá ÐáñÜäåéãìá ÐáñÜäåéãìá (iv) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 4 3: jump,,, 5 4: ret,,, 5: :=, m,, i 6: :=, n,, j while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, 27 24:, j, 1, $10 25: :=, $10,, j 26: jump,,, 18 if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 36: +, i, 1, $15 37: :=, $15,, i 38:, j, 1, $16 39: :=, $16,, j 163 / 216 164 / 216 165 / 216 ÐáñÜäåéãìá (v) ÐáñÜäåéãìá (vi) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; 7: <=, i, j, 9 8: jump,,, 41 27: <=, i, j, 29 28: jump,,, 7 40: jump,,, 7 quicksort(a, m, j); quicksort(a, i, n) end; 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 46: par, i, V, 47: par, n, V, 48: call,,, quicksort 49: endu, quicksort,, ÊåöÜëáéï 9: Ôåëéêüò êþäéêáò 166 / 216 167 / 216 168 / 216

Ôåëéêüò êþäéêáò Ôåëéêüò êþäéêáò Ôåëéêüò õðïëïãéóôþò Áðü èåùñçôéêþò Üðïøçò, ôï ðñüâëçìá ôçò êáôáóêåõþò âýëôéóôïõ ôåëéêïý êþäéêá äåí Ý åé ëýóç (undecidable) ÌïñöÝò ôåëéêïý êþäéêá: Ãëþóóá ìç áíþò óå áðüëõôç ìïñöþ (absolute) Ãëþóóá ìç áíþò óå åðáíáôïðïèåôþóéìç êáé äéáóõíäýóéìç ìïñöþ (relocatable, linkable) ÓõìâïëéêÞ ãëþóóá (assembly) ëëç ãëþóóá áìçëïý åðéðýäïõ ÅðéìÝñïõò ðñïâëþìáôá: ÅðéëïãÞ åíôïëþí Ðþò ìåôáöñüæåôáé êüèå åíôïëþ ôïõ åíäéüìåóïõ êþäéêá Ðþò ìåôáöñüæïíôáé áêïëïõèßåò ôýôïéùí åíôïëþí Äéá åßñéóç ôçò ìíþìçò óôï ñüíï åêôýëåóçò Ðïý áðïèçêåýïíôáé ôá äåäïìýíá Ðþò ãßíåôáé ç åðéêïéíùíßá áíüìåóá óôéò äïìéêýò ìïíüäåò áñáêôçñéóôéêü: ÅðåîåñãáóôÞò: Intel 8086 Ëåéôïõñãéêü óýóôçìá: MS-DOS ÌïíôÝëï ìíþìçò: COM / tiny ÓõíïëéêÞ ìíþìç 64 K ÏñãÜíùóç óå Ýíá segment Áñ éêþ äéåýèõíóç ôïõ ðñïãñüììáôïò ç 100h ÓõìâïëéêÞ ãëþóóá: óõìâáôþ ìå ôï óõìâïëïìåôáöñáóôþ MASM (Microsoft macro assembler) 169 / 216 170 / 216 171 / 216 Ôåëéêüò õðïëïãéóôþò Ôåëéêüò õðïëïãéóôþò Ôåëéêüò õðïëïãéóôþò (iv) Êáôá ùñçôýò, ìåãýèïõò 16 bit ÃåíéêÞò öýóçò: ax, bx, cx, dx óå æåýãç ôùí 8 bit: ah, al, ê.ëð. Êáôá ùñçôýò äåßêôåò: sp (äåßêôçò óôïßâáò) êáé bp (äåßêôçò âüóçò) Êáôá ùñçôýò áíáöïñüò: si êáé di Êáôá ùñçôýò ôìçìüôùí: cs (code), ds (data), ss (stack) êáé es (extra) Åéäéêïß êáôá ùñçôýò: ip (instruction pointer) êáé êáôá ùñçôþò óçìáéþí (ags) Äéåõèýíóåéò: address = segment 16 + offset ÌïñöÞ åíôïëþò: [ label ] opname [ operand 1 [, operand 2 ] ] ÅíôïëÝò: ÌåôáöïñÜò: mov, lea Áñéèìçôéêþí ðñüîåùí: add, sub, neg, imul, idiv, cmp, cwd Ëïãéêþí ðñüîåùí: and, or, xor, not, test ëìáôïò: jmp, jz, jnz, jl, jle, jg, jge Äéá åßñéóçò óôïßâáò: push, pop ÕðïðñïãñáììÜôùí: call, ret ÐñÜîåùí êéíçôþò õðïäéáóôïëþò (x87 FPU) 172 / 216 173 / 216 174 / 216

ÅíôïëÝò ìåôáöïñüò ÁñéèìçôéêÝò ðñüîåéò ËïãéêÝò ðñüîåéò mov destination, source mov ax, 42 mov ax, bx mov ax, [1000h] mov ax, [si] mov ax, [si + 6] mov ax, [bp + 6] mov ax, [si + bp + 6] lea destination, source Êáèïñéóìüò ìåãýèïõò äåäïìýíùí (move) (load eective address) add op 1, op 2 op 1 := op 1 + op 2 sub op 1, op 2 op 1 := op 1 op 2 neg op op := op imul op idiv op cwd (dx, ax) := ax op ax := (dx, ax) div op dx := (dx, ax) mod op åðýêôáóç ðñïóþìïõ ôïõ ax óôïí dx and op 1, op 2 op 1 := op 1 and op 2 or op 1, op 2 op 1 := op 1 or op 2 not op op := not op xor op 1, op 2 op 1 := op 1 xor op 2 test op 1, op 2 op 1 and op 2 åíçìýñùóå ôéò óçìáßåò mov ax, word ptr [bp + 6] mov al, byte ptr [bp + 6] cmp op 1, op 2 óýãêñéíå ôá op 1 êáé op 2 åíçìýñùóå ôéò óçìáßåò 175 / 216 176 / 216 177 / 216 ÅíôïëÝò Üëìáôïò ÅíôïëÝò óôïßâáò ÅíôïëÝò õðïðñïãñáììüôùí jmp address jz address Þ je address jnz address Þ jne address jl address jle address jg address jge address ùñßò óõíèþêç ìçäýí / ßóï ü é ìçäýí / äéüöïñï ìéêñüôåñï ìéêñüôåñï Þ ßóï ìåãáëýôåñï ìåãáëýôåñï Þ ßóï push op pop op ðñüóèåóç óôç óôïßâá sp := sp 2, [sp] := op áöáßñåóç áðü ôç óôïßâá op := [sp], sp := sp + 2 Ç óôïßâá áõîüíåé ðñïò ôá êüôù, äçëáäþ ðñïò ìéêñüôåñåò äéåõèýíóåéò call address ret êëþóç sp := sp 2, [sp] := ip, ip := address åðéóôñïöþ ip := [sp], sp := sp + 2 Ç ôéìþ ôïõ ip ðïõ ôïðïèåôåßôáé óôç óôïßâá áðü ôçí call åßíáé ç äéåýèõíóç ôçò åíôïëþò ðïõ áêïëïõèåß ôçí call 178 / 216 179 / 216 180 / 216

ÅíôïëÝò x87 FPU ÅíôïëÝò x87 FPU Äéá åßñéóç ìíþìçò ÅéäéêÞ óôïßâá 8 êáôá ùñçôþí: ST(0), ST(7) fld source fld tbyte ptr @real1 fild source fild word ptr [bp 2] fstp destination fld tbyte ptr [bp 10] fistp destination fild word ptr [bp 2] (load real & push) (load integer & push) (pop & store real) (pop & store integer) faddp ST(1), ST(0) fsubp ST(1), ST(0) fmulp ST(1), ST(0) fdivp ST(1), ST(0) fchs fcompp fstsw destination fstsw ax fstsw word ptr [bp 2] ST(1) := ST(1) + ST(0) & pop ST(1) := ST(1) ST(0) & pop ST(1) := ST(1) ST(0) & pop ST(1) := ST(1)/ST(0) & pop ST(0) := ST(0) ST(1) ST(0) & pop both (store x87 FPU ags) ÄïìÞ åíïôþôùí (block structure) Ìç ôïðéêü äåäïìýíá ÅããñÜöçìá äñáóôçñéïðïßçóçò (activation record / frame) ÐáñÜìåôñïé ÁðïôÝëåóìá Ðëçñïöïñßåò êáôüóôáóçò ìç áíþò ÔïðéêÝò ìåôáâëçôýò ÐñïóùñéíÝò ìåôáâëçôýò 181 / 216 182 / 216 183 / 216 Äéá åßñéóç ìíþìçò Äéá åßñéóç ìíþìçò ÐñïóðÝëáóç ïíïìüôùí bp+8 bp+6 bp+4 bp+2 bp bp-2 bp-4 Παράµετρος 1 Παράµετρος 2 Παράµετρος n ιεύθυνση αποτελέσµατος Σύνδεσµος προσπέλασης ιεύθυνση επιστροφής Προηγούµενο bp Τοπική µεταβλητή 1 Τοπική µεταβλητή 2 Τοπική µεταβλητή m Προσωρινή µεταβλητή 1 Προσωρινή µεταβλητή 2 Προσωρινή µεταβλητή k Παράµετρος 1 Παράµετρος 2 Παράµετρος n ιεύθυνση αποτελέσµατος ιεύθυνση επιστροφής Προηγούµενο display Προηγούµενο bp Τοπική µεταβλητή 1 Τοπική µεταβλητή 2 Τοπική µεταβλητή m Προσωρινή µεταβλητή 1 Προσωρινή µεταβλητή 2 Προσωρινή µεταβλητή k α) Σύνδεσµοι προσπέλασης β) Πίνακας δεικτών Παράµετροι Σταθερό Τµήµα Τοπικές µεταβλητές Προσωρινές µεταβλητές αρχή βάση τέλος Ε κύριου προγράµµατος Ε υποπρογράµµατος 1 Ε υποπρογράµµατος m µεταφρασµένος κώδικας στοίβα εκτέλεσης ελεύθερη µνήµη δυναµικό δεδοµένο k σωρός δυναµικό δεδοµένο 1 µνήµη για αποθήκευση δεδοµένων µνήµη για αποθήκευση του κώδικα του προγράµµατος συνολική διαθέσιµη µνήµη 64Κ 0Κ ÔïðéêÜ: [bp + offset] Ìç ôïðéêü: [si + offset] ï si ðñýðåé íá äåß íåé óôç âüóç ôïõ åããñáöþìáôïò äñáóôçñéïðïßçóçò üðïõ ôá äåäïìýíá åßíáé ôïðéêü Ôï ðñüâëçìá áíüãåôáé óôïí åíôïðéóìü ôïõ áíôßóôïé ïõ åããñáöþìáôïò äñáóôçñéïðïßçóçò Ëýóåéò ðïõ âáóßæïíôáé óôï âüèïò öùëéüóìáôïò: Óýíäåóìïé ðñïóðýëáóçò (access links) Ðßíáêåò äåéêôþí (link tables / displays) 184 / 216 185 / 216 186 / 216

Óýíäåóìïé ðñïóðýëáóçò Óýíäåóìïé ðñïóðýëáóçò ÐÝñáóìá ðáñáìýôñùí Áñ Þ ëåéôïõñãßáò óôù üôé ç äïìéêþ ìïíüäá p âñßóêåôáé öùëéáóìýíç ìýóá óôç äïìéêþ ìïíüäá q Óôï ÅÄ ôçò p ôïðïèåôåßôáé Ýíá óýíäåóìïò ðñïò ôç âüóç ôïõ ÅÄ ôçò ðéï ðñüóöáôçò êëþóçò ôçò q ÊáôÜ ôçí êëþóç õðïðñïãñáììüôùí, áðáéôåßôáé ôåëéêüò êþäéêáò ãéá ôçí åíçìýñùóç ôùí óõíäýóìùí ðñïóðýëáóçò Ôñüðïò ñþóçò óôù üôé æçôåßôáé ôï äåäïìýío a ðïõ åßíáé ôïðéêü óå ìéá äïìéêþ ìïíüäá ìå âüèïò öùëéüóìáôïò n a óôù üôé âñéóêüìáóôå óå ìéá äïìéêþ ìïíüäá p ìå âüèïò öùëéüóìáôïò n p n a Áêïëïõèïýìå n p n a óõíäýóìïõò ðñïóðýëáóçò ÊáôÜ ôçí ðñïóðýëáóç ïíïìüôùí, áðáéôåßôáé ôåëéêüò êþäéêáò ãéá ôçí õëïðïßçóç ôùí ðáñáðüíù ÊëÞóç êáô' áîßá ÊëÞóç êáô' áíáöïñü ÊëÞóç êáô' üíïìá ÊëÞóç êáô' áíüãêç ÊëÞóç êáô' áîßá êáé áðïôýëåóìá Ôñüðïò õëïðïßçóçò êáèåíüò (call by value) (call by reference) (call by name) (call by need) (call by value-result) 187 / 216 188 / 216 189 / 216 ÄÝóìåõóç êáôá ùñçôþí ÄÝóìåõóç êáôá ùñçôþí ÅðéëïãÞ åíôïëþí Ðñüâëçìá 1: åðéëïãþ ôåëïõìýíùí ðïõ èá áðïèçêåõôïýí óå êáôá ùñçôýò Ðñüâëçìá 2: åðéëïãþ êáôá ùñçôþí üðïõ èá áðïèçêåõôïýí ôá ôåëïýìåíá Ôï ðñüâëçìá ôçò âýëôéóôçò ñþóçò êáôá ùñçôþí åßíáé NP-complete, áêüìá êáé ùñßò åéäéêïýò ðåñéïñéóìïýò Ç ëýóç ôïõ áíüãåôáé óôçí êáôáóêåõþ ôïõ ãñüöïõ áëëçëåðéäñüóåùí ìåôáîý ôùí ìåôáâëçôþí êáé óôï ñùìáôéóìü áõôïý ìå ôüóá ñþìáôá üóïé ïé êáôá ùñçôýò ÐáñÜäåéãìá: 1:, b, b, $1 2:, 4, a, $2 3:, $2, c, $3 4:, $1, $3, $4 5: :=, $4,, d $1 $3 d := bb-4ac $2 ax $4 bx ÁðëÞ áëëü êáêþ ðñïóýããéóç: åíéáßï ó Þìá ðáñáãùãþò ôåëéêïý êþäéêá ãéá êüèå äïìþ ôïõ åíäéüìåóïõ êþäéêá Êáëýôåñç ðñïóýããéóç: ðëáêüóôñùóç (tiling) ôåìá éóìüò ôïõ åíäéüìåóïõ êþäéêá óå ôìþìáôá êüèå ôìþìá áíôéóôïé åß óå ìéá åíôïëþ ÂÝëôéóôç áëëü ñïíïâüñá ðñïóýããéóç: äõíáìéêüò ðñïãñáììáôéóìüò (dynamic programming) 190 / 216 191 / 216 192 / 216

ÅðéëïãÞ åíôïëþí ÅðéëïãÞ åíôïëþí ÅðéëïãÞ åíôïëþí (iv) ÐáñÜäåéãìá: d := bb-4ac ÐáñÜäåéãìá: tiling ìå åíôïëýò ôïõ 8086 ÐáñÜäåéãìá: tiling ìå åíôïëýò ôïõ 80386 d := b b 4 a c bp mem + offset d := mem + 4 mem bp offset b bp + offset a mem + bp offset c R 1 mem + CONST R bi mov R 1,[R bi +CONST] ax ax R 1 imul R 1 mem + bp offset d := ax ax mem ax ax bx ax bx mem ax bx + 4 mem + bp offset b + bp offset c bp offset a mem CONST 2 + R bi CONST 1 imul R 1,[R bi +CONST 1 ],CONST 2 R 1 mem + bp offset d := ax ax bx ax ax mem + 4 mem bp offset b + bp offset a mem + bp offset c 193 / 216 194 / 216 195 / 216 Ôï ôåëéêü ðñüãñáììá Ôï ôåëéêü ðñüãñáììá ÂïçèçôéêÝò ñïõôßíåò Óêåëåôüò: xseg segment public code assume cs : xseg, ds : xseg, ss : xseg org 100h main proc near call near ptr program mov ax, 4C00h int 21h main endp ôåëéêüò êþäéêáò ðïõ ðáñüãåôáé xseg ends end main ÂéâëéïèÞêç ñüíïõ åêôýëåóçò (run-time library) extrn function : proc ÓôáèåñÝò óõìâïëïóåéñýò êáé êéíçôþò õðïäéáóôïëþò @str1 db this is db 10 db an example db 0 @real1 dt 1e 10 @real2 dt 2.0 getar(a) (öüñôùóç äéåýèõíóçò ÅÄ) mov si, word ptr [bp + 4] mov si, word ptr [si + 4]... (n cur n a 1 öïñýò) mov si, word ptr [si + 4] updateal() (åíçìýñùóç óõíäýóìùí ðñïóðýëáóçò) (á) push bp áí n p < n x (â) push word ptr [bp + 4] áí n p = n x (ã) mov si, word ptr [bp + 4] mov si, word ptr [si + 4] áí n p > n x... mov si, word ptr [si + 4] (n p n x 1 öïñýò) push word ptr [si + 4] 196 / 216 197 / 216 198 / 216

ÂïçèçôéêÝò ñïõôßíåò ÂïçèçôéêÝò ñïõôßíåò ÂïçèçôéêÝò ñïõôßíåò (iv) load(r, a) (öüñôùóç ôåëïõìýíïõ) Åßäïò ôïõ a Êþäéêáò ðïõ ðáñüãåôáé (á1) áñéèìçôéêþ óôáèåñü mov R, a (á2) ëïãéêþ óôáèåñü true mov R, 1 (á3) ëïãéêþ óôáèåñü false mov R, 0 (á4) óôáèåñü áñáêôþñá mov R, ASCII(a) (á6) óôáèåñü nil mov R, 0 (â1) ôïðéêþ ïíôüôçôá: ìåôáâëçôþ, mov R, size ptr [bp + offset] (â2) ðáñüìåôñïò êáô' áîßá, Þ ðñïóùñéíþ ìåôáâëçôþ ôïðéêþ ïíôüôçôá: ðáñüìåôñïò êáô' áíáöïñü mov si, word ptr [bp + offset] mov R, size ptr [si] load(r, a) (ã1) Åßäïò ôïõ a ìç ôïðéêþ ïíôüôçôá: ìåôáâëçôþ, ðáñüìåôñïò êáô' áîßá, Þ (öüñôùóç ôåëïõìýíïõ) Êþäéêáò ðïõ ðáñüãåôáé getar(a) mov R, size ptr [si + offset] ðñïóùñéíþ ìåôáâëçôþ (ã2) ìç ôïðéêþ ïíôüôçôá: getar(a) ðáñüìåôñïò êáô' áíáöïñü mov si, word ptr [si + offset] mov R, size ptr [si] (ä) [x] load(di, x) mov R, size ptr [di] (å) {x} loadaddr(r, x) loadaddr(r, a) (öüñôùóç äéåýèõíóçò ôåëïõìýíïõ) Åßäïò ôïõ a Êþäéêáò ðïõ ðáñüãåôáé (á5) óôáèåñþ óõìâïëïóåéñü lea R, byte ptr a (â1) ôïðéêþ ïíôüôçôá: ðáñüìåôñïò êáô' áîßá, Þ lea R, size ptr [bp + offset] ðñïóùñéíþ ìåôáâëçôþ (â2) ôïðéêþ ïíôüôçôá: mov R, word ptr [bp + offset] ðáñüìåôñïò êáô' áíáöïñü (ã1) ìç ôïðéêþ ïíôüôçôá: getar(a) ðáñüìåôñïò êáô' áîßá, Þ lea R, size ptr [si + offset] ðñïóùñéíþ ìåôáâëçôþ (ã2) ìç ôïðéêþ ïíôüôçôá: getar(a) ðáñüìåôñïò êáô' áíáöïñü mov R, word ptr [si + offset] (ä) [x] load(r, x) 199 / 216 200 / 216 201 / 216 ÂïçèçôéêÝò ñïõôßíåò (v) ÐáñáãùãÞ êþäéêá ÐáñáãùãÞ êþäéêá Ðáñüìïéá õëïðïßçóç ãéá ôéò: loadreal(a) store(r, a) storereal(a) Ñïõôßíåò ãéá åôéêýôåò ôåëéêïý êþäéêá: name(p) p num endof(p) @p num label(n) @n label(l) @p num l ÔåôñÜäá load(r, x) store(r, z) ÔåôñÜäá :=, x,, z load(ax, y) mov cx, size imul cx loadaddr(cx, x) add ax, cx store(ax, z) array, x, y, z loadreal(x) storereal(z) ÔåôñÜäåò +, x, y, z, x, y, z load(ax, x) load(dx, y) instr ax, dx store(ax, z) instr = add Þ sub loadreal(x) loadreal(y) finstr ST(1), ST(0) storereal(z) ÔåôñÜäåò, x, y, z /, x, y, z %, x, y, z load(ax, x) load(cx, y) imul cx store(ax, z) load(ax, x) cwd load(cx, y) idiv cx store(ax, z) finstr = faddp ê.ëð. load(ax, x) cwd load(cx, y) idiv cx store(dx, z) 202 / 216 203 / 216 204 / 216