Σύνταξη & Συντακτική Ανάλυση

Σχετικά έγγραφα
Σύνταξη & Συντακτική Ανάλυση

Σύνταξη & Συντακτική Ανάλυση

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

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στις βασικές έννοιες που σχετίζονται με τη λεξική ανάλυση. Στη δήλωση ορισμό κανονικών εκφράσεων

Ανάπτυξη και Σχεδίαση Λογισμικού

Σχεδίαση Γλωσσών Προγραμματισμού Συντακτική Ανάλυση ΙII. Εαρινό Εξάμηνο Lec 11 26/03/2019 Διδάσκων: Γεώργιος Χρ. Μακρής

2.1. Εντολές Σχόλια Τύποι Δεδομένων

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

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 2 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

Σχολικό Βιβλίο - Κεφάλαιο 7 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ PASCAL ΠΑΡΟΥΣΙΑΣΗ 13

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 1 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

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

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

Εισαγωγή στον Προγραμματισμό

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

Η γλώσσα προγραμματισμού Strange

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 8 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Ηλεκτρολόγων Μηχανικών & Μηχανικών Υπολογιστών

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Έστω συμβολοσειρά Το σύνολο FIRST περιέχει τα τερματικά σύμβολα από τα οποία αρχίζουν οι συμβολοσειρές που παράγονται από την

Εισαγωγή στον Προγραμματισμό

Μεταγλωττιστές. Ενότητα 6: Λεκτική ανάλυση (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Τεχνητή Νοημοσύνη. 21η διάλεξη ( ) Ίων Ανδρουτσόπουλος.

Σχεδίαση Γλωσσών Προγραμματισμού Λεξική Ανάλυση Ι. Εαρινό Εξάμηνο Lec 05 & & 26 /02/2019 Διδάσκων: Γεώργιος Χρ.

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

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

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Στοιχειώδης προγραμματισμός σε C++

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

Ανάπτυξη και Σχεδίαση Λογισμικού

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

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

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

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

Μεταγλωττιστές. Ενότητα 7: Συντακτική ανάλυση (Μέρος 1 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Διαδικασιακός Προγραμματισμός

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 3 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Μέρος 2 Κατασκευή Συντακτικού Αναλυτή

Κεφάλαιο 3 Η Σημασιολογία των Γλωσσών Προγραμματισμού

3. Εκφράσεις και έλεγχος ροής

Κεφάλαιο 4 Σημασιολογία μιας Απλής Προστακτικής Γλώσσας

Γλώσσες Προγραμματισμού Μεταγλωττιστές

Βασικές έννοιες προγραμματισμού

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

Η γλώσσα προγραμματισμού EEL

Προγραμματισμός Ι (HY120)

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

Πίνακας Περιεχοµένων Πρόλογος Κεφάλαιο Βασικές εισαγωγικές έννοιες

Πανεπιστήμιο Θεσσαλίας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση

a = 10; a = k; int a,b,c; a = b = c = 10;

Εισαγωγή στον Προγραμματισμό

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

Δομημένος Προγραμματισμός (ΤΛ1006)

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΙΓΑΙΟΥ ΤΜΗΜΑ ΠΟΛΙΤΙΣΜΙΚΗΣ ΤΕΧΝΟΛΟΓΙΑΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΑΣ. Διδάσκουσα Δρ Β.

2 ΟΥ και 7 ΟΥ ΚΕΦΑΛΑΙΟΥ

Εργαστήριο 08 Εισαγωγή στo Yacc

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ. Λογισμικό Συστήματος. Κλειώ Σγουροπούλου

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

Στοιχεία Θεωρίας Υπολογισµού (1): Τυπικές Γλώσσες, Γραµµατικές

ΜΕΡΙΚΑ ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΙΣ ΓΛΩΣΣEΣ ΠPOΓPAMMATIΣMOY

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

Ποιές οι θεµελιώδεις δυνατότητες και ποιοί οι εγγενείς περιορισµοί των υπολογιστών ; Τί µπορούµε και τί δε µπορούµε να υπολογίσουµε (και γιατί);

Διαδικασιακός Προγραμματισμός

Πρόβλημα 29 / σελίδα 28

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

Αντίρριο, 14/03/2017 Προδιαγραφές Εργαστηριακής Εργασίας για το μάθημα «Μεταγλωττιστές»

Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών: Εργαστηριακή Άσκηση

Αυτόματα. Παράδειγμα: πωλητής καφέ (iii) Παράδειγμα: πωλητής καφέ (iv) Εισαγωγή στην Επιστήμη των Υπολογιστών 6

Θέματα Μεταγλωττιστών

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι περιλαμβάνει μια μεταβλητή; ΔΕΙΚΤΕΣ. Διεύθυνση μεταβλητής. Δείκτης

ΚΕΦΑΛΑΙΟ 6: Γλώσσες. 6.1 Ιστορική εξέλιξη 6.4 Υλοποίηση γλώσσας. Κεφάλαιο 6: «Γλώσσες Προγραµµατισµού»

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

Θέματα Μεταγλωττιστών

Σειρά Προβλημάτων 3 Λύσεις

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΡΑΞΕΙΣ ΜΕΤΑΒΛΗΤΕΣ. Ακέραιοι αριθμοί (int) Πράξεις μεταξύ ακεραίων αριθμών

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

Εισαγωγή στην PHP. ΕΣΔ 516 Τεχνολογίες Διαδικτύου. Περιεχόμενα. Περιεχόμενα. ΕΣ 516: Τεχνολογίες ιαδικτύου. ΕΣ 516: Τεχνολογίες ιαδικτύου

Λογικός τύπος Τελεστές σύγκρισης Λογικοί τελεστές Εντολές επιλογής Εμβέλεια Μαθηματικές συναρτήσεις Μιγαδικός τύπος ΔΕΥΤΕΡΗ ΔΙΑΛΕΞΗ

Μοντελοποίηση Υπολογισμού. Γραμματικές Πεπερασμένα Αυτόματα Κανονικές Εκφράσεις

Πρόβλημα 37 / σελίδα 207

Τυπικές χρήσεις της Matlab

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

Απάντηση: (func endfunc)-([a-za-z])+

Φυσικές και τεχνητές γλώσσες. Το αλφάβητο της ΓΛΩΣΣΑΣ, Τύποι Δεδομένων. Σταθερές, Μεταβλητές, Τελεστές, Συναρτήσεις, Δομή Προγράμματος

Ενότητα 5: ΜΕΤΑΒΛΗΤΕΣ

ΕΝΟΤΗΤΑ 4 Λήψη Αποφάσεων και Συναρτήσεις Ελέγχου

Σημαντικές δυνατότητες των σύγχρονων υπολογιστικών μηχανών: Αξιόπιστη καταγραφή πολύ μεγάλου όγκου δεδομένων

3 Αλληλεπίδραση Αντικειμένων

Μεταγλωττιστές. Ενότητα 2: Τυπικές γλώσσες (Μέρος 1 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

Εισαγωγή στην Επιστήμη των Υπολογιστών

ΜΕΤΑΓΛΩΤΤΙΣΤΕΣ. Στην εξοικείωση με τη διαδικασία κατασκευής ενός Λεξικού Αναλυτή κάνοντας χρήση του lex.

Ψευδοκώδικας. November 7, 2011

Transcript:

Μια γραμματική για τα Αγγλικά Σύνταξη & Συντακτική Ανάλυση Rene Mgritte, Le Seize Septemre Μια πρόταση αποτελείται από μια ουσιαστική φράση, ένα ρήμα, και μια ουσιαστική φράση Μια ουσιαστική φράση αποτελείται από ένα άρθρο και ένα ουσιαστικό Ρήματα είναι τα εξής Άρθρα είναι τα εξής Ουσιαστικά είναι τα εξής... <S> ::= <NP> <V> <NP> <NP> ::= <A> <N> <V> ::= loves htes ets <A> ::= the <N> ::= dog t rt Κωστής Σαγώνας <kostis@s.ntu.gr> Σύνταξη και Συντακτική Ανάλυση 2 Πως δουλεύει μια γραμματική Γραμματική για αριθμητικές εκφράσεις Μια γραμματική είναι ένα σύνολο κανόνων που ορίζουν το πως κατασκευάζεται ένα συντακτικό δένδρο Ξεκινάμε βάζοντας το <S> στη ρίζα του δένδρου Οι κανόνες της γραμματικής λένε πως μπορούμε να προσθέσουμε παιδιά σε κάθε σημείο του δένδρου Για παράδειγμα, ο κανόνας <S> ::= <NP> <V> <NP> λέει ότι μπορούμε να προσθέσουμε κόμβους <NP>, <V>, και <NP>, με αυτή τη σειρά, ως παιδιά του κόμβου <S> <expr> ::= <expr> + <expr> <expr> * <expr> ( <expr> ) Η παραπάνω γραμματική ορίζει ότι μια αριθμητική έκφραση μπορεί να είναι το άθροισμα δύο άλλων εκφράσεων, ή το γινόμενο δύο εκφράσεων, ή μια έκφραση που περικλείεται από παρενθέσεις, ή κάποια από τις μεταβλητές,, ή Σύνταξη και Συντακτική Ανάλυση 3 Σύνταξη και Συντακτική Ανάλυση 4

Συντακτικό δένδρο Συστατικά μιας γραμματικής <expr> ( <expr> ) <expr> * <expr> ( <expr> ) <expr> + <expr> αρχικό σύμβολο κανόνας παραγωγής μη τερματικά σύμβολα <S> ::= <NP> <V> <NP> <NP> ::= <A> <N> <V> ::= loves htes ets <A> ::= the <N> ::= dog t rt Σύνταξη και Συντακτική Ανάλυση 5 τερματικά σύμβολα (λεκτικές μονάδες) Σύνταξη και Συντακτική Ανάλυση 6 Ορισμός γραμματικών σε μορφή Bkus-Nur Μια γραμματική σε μορφή Bkus-Nur αποτελείται από Ένα σύνολο από λεκτικές μονάδες (tokens) Συμβολοσειρές που αποτελούν τα μικρότερα αδιαίρετα κομμάτια της σύνταξης του προγράμματος Ένα σύνολο από μη τερματικά σύμβολα (non-terminls) Συμβολοσειρές που εγκλείονται σε αγκύλες, π.χ. <NP>, και αντιπροσωπεύουν κομμάτια του συντακτικού της γλώσσας Δε συναντιούνται στο πρόγραμμα, αλλά είναι σύμβολα που βρίσκονται στο αριστερό μέρος κάποιων κανόνων της γραμματικής Το αρχικό σύμβολο (strt symol) της γραμματικής Ένα συγκεκριμένο μη τερματικό σύμβολο που αποτελεί τη ρίζα του συντακτικού δένδρου για κάθε αποδεκτό από τη γλώσσα πρόγραμμα Ένα σύνολο από κανόνες παραγωγής (prodution rules) Κανόνες παραγωγής Οι κανόνες παραγωγής χρησιμοποιούνται για την κατασκευή του συντακτικού δένδρου Κάθε κανόνας έχει τη μορφή Α ::= Δ Το αριστερό μέρος Α αποτελείται από ένα μη τερματικό σύμβολο Το δεξί μέρος Δ είναι μια ακολουθία από τερματικά (λεκτικές μονάδες) και μη τερματικά σύμβολα Κάθε κανόνας προσδιορίζει έναν πιθανό τρόπο κατασκευής του συντακτικού υποδένδρου που έχει ως ρίζα του το μη τερματικό σύμβολο στο αριστερό μέρος Α του κανόνα και έχει ως παιδιά αυτής της ρίζας (με την ίδια σειρά εμφάνισης) τα σύμβολα στο δεξί μέρος Δ του κανόνα Σύνταξη και Συντακτική Ανάλυση 7 Σύνταξη και Συντακτική Ανάλυση 8

Επιλογές στη γραφή των κανόνων παραγωγής Όταν υπάρχουν περισσότεροι από ένας κανόνες παραγωγής με το ίδιο αριστερό μέρος, μπορούμε να κάνουμε χρήση της παρακάτω συντομογραφίας Στη BNF γραμματική μπορούμε να δώσουμε το αριστερό μέρος, το διαχωριστή ::=, και μετά μια ακολουθία από δεξιά μέρη που διαχωρίζονται από το ειδικό σύμβολο Οι δύο γραμματικές είναι ίδιες <expr> ::= <expr> + <expr> <expr> * <expr> ( <expr> ) <expr> ::= <expr> + <expr> <expr> ::= <expr> * <expr> <expr> ::= ( <expr> ) <expr> ::= <expr> ::= <expr> ::= Σύνταξη και Συντακτική Ανάλυση 9 Κανόνεςπαραγωγήςτουκενού Το ειδικό μη τερματικό <empty> χρησιμοποιείται σε περιπτώσεις που θέλουμε κάποιος κανόνας να μην παράγει τίποτα Για παράδειγμα, οι παρακάτω κανόνες ορίζουν τη δομή if-then των περισσοτέρων γλωσσών, η οποία επιτρέπει την ύπαρξη ενός προαιρετικού else <if-stmt> ::= if <expr> then <stmt> <else-prt> <else-prt> ::= else <stmt> <empty> Σύνταξη και Συντακτική Ανάλυση 10 Κατασκευή συντακτικών δένδρων Αρχίζουμε την κατασκευή βάζοντας το αρχικό σύμβολο της γραμματικής στη ρίζα του δένδρου Προσθέτουμε παιδιά σε κάθε μη τερματικό σύμβολο, χρησιμοποιώντας κάποιον από τους κανόνες παραγωγής της γλώσσας για το συγκεκριμένο μη τερματικό Η διαδικασία τερματίζει όταν όλα τα φύλλα του δένδρου αποτελούνται από λεκτικές μονάδες Η συμβολοσειρά που αντιστοιχεί στο δένδρο που κατασκευάσαμε βρίσκεται διαβάζοντας τα φύλλα του δένδρου από αριστερά προς τα δεξιά Σύνταξη και Συντακτική Ανάλυση 11 Παραδείγματα <expr> ::= <expr> + <expr> <expr> * <expr> ( <expr> ) Τα συντακτικά δένδρα για τις παρακάτω εκφράσεις + (+) (+()) +* Η κατασκευή των συντακτικών δένδρων είναι η δουλειά του συντακτικού αναλυτή ενός μεταγλωττιστή Υπάρχουν διάφοροι αποδοτικοί αλγόριθμοι και εργαλεία για ημιαυτόματη κατασκευή του συντακτικού αναλυτή Σύνταξη και Συντακτική Ανάλυση 12

Τυπικός ορισμός σύνταξης γλωσσών Παράδειγμα κατασκευής γραμματικής (1) Για να ορίσουμε τη σύνταξη των γλωσσών προγραμματισμού χρησιμοποιούμε γραμματικές Η γλώσσα που ορίζεται από μια γραμματική είναι το σύνολο των συμβολοσειρών για τα οποία η γραμματική μπορεί να παράξει συντακτικά δένδρα Τις περισσότερες φορές το σύνολο αυτό είναι άπειρο (παρόλο που η γραμματική είναι πεπερασμένη) Η κατασκευή μιας γραμματικής για μια γλώσσα μοιάζει λίγο με προγραμματισμό... Σύνταξη και Συντακτική Ανάλυση 13 Συνήθως γίνεται με χρήση της τεχνικής διαίρει και βασίλευε (divide nd onquer) Παράδειγμα: κατασκευή της γλώσσας των δηλώσεων της Jv (η οποία είναι παρόμοια με αυτή της C): αρχικά, η δήλωση έχει ένα όνομα τύπου στη συνέχεια μια ακολουθία από μεταβλητές που διαχωρίζονται με κόμματα (όπου κάθε μεταβλητή μπορεί να πάρει μια αρχική τιμή) και στο τέλος ένα ερωτηματικό (semiolon) flot ; oolen,, ; int = 1,, = 1 + 2; Σύνταξη και Συντακτική Ανάλυση 14 Παράδειγμα κατασκευής γραμματικής (2) Παράδειγμα κατασκευής γραμματικής (3) Αρχικά ας αγνοήσουμε την πιθανή ύπαρξη αρχικοποιητών: <vr-del> ::= <type-nme> <delrtor-list> ; Ο κανόνας για τα ονόματα των πρωτόγονων τύπων (primitive types) της Jv είναι απλούστατος: <type-nme> ::= oolen yte short int long hr flot doule Η ακολουθία των μεταβλητών που διαχωρίζονται με κόμματα έχει ως εξής: <delrtor-list> ::= <delrtor> <delrtor>, <delrtor-list> Όπου ξανά, έχουμε προς το παρόν αγνοήσει τους πιθανούς αρχικοποιητές των μεταβλητών Σημείωση: δεν παίρνουμε υπόψη κατασκευασμένους τύπους (onstruted types): ονόματα κλάσεων, ονόματα διεπαφών (interfes), και τύπους πινάκων Σύνταξη και Συντακτική Ανάλυση 15 Σύνταξη και Συντακτική Ανάλυση 16

Παράδειγμα κατασκευής γραμματικής (4) Οι δηλωτές μεταβλητών, με ή χωρίς αρχικοποιήσεις, ορίζονται ως: <delrtor> ::= <vrile-nme> <vrile-nme> = <expr> Για ολόκληρη τη Jv: Πρέπει να επιτρέψουμε και ζεύγη από αγκύλες μετά το όνομα των μεταβλητών για τη δήλωση των πινάκων Πρέπει επίσης να ορίσουμε και τη σύνταξη των αρχικοποιητών πινάκων (Φυσικά θέλουμε και ορισμούς για τα μη τερματικά σύμβολα <vrile-nme> και <expr>) Τί αποτελεί λεκτική μονάδα (token); Όποια κομμάτια της γλώσσας επιλέξουμε να θεωρήσουμε ως μη κατασκευαζόμενα από μικρότερα κομμάτια Μεταβλητές (i, j), λέξεις κλειδιά (if), τελεστές (==,++), σταθερές (123.4), κ.λπ. Οι γραμματικές που έχουμε ορίσει δίνουν τη δομή των φράσεων (phrse struture): πως το πρόγραμμα κατασκευάζεται από μια σειρά λεκτικών μονάδων Πρέπει επιπλέον να ορίσουμε και τη λεκτική δομή (lexil struture): πως ένα αρχείο χωρίζεται σε λεκτικές μονάδες Σύνταξη και Συντακτική Ανάλυση 17 Σύνταξη και Συντακτική Ανάλυση 18 Δύο επιλογές ορισμού της λεκτικής δομής Με μια κοινή γραμματική Οι χαρακτήρες είναι οι μοναδικές λεκτικές μονάδες Συνήθως δεν ακολουθείται αυτή η επιλογή: κενά και σχόλια περιπλέκουν αρκετά τη γραμματική και την καθιστούν μη αναγνώσιμη Με ξεχωριστές γραμματικές 1. Μία που ορίζει πώς προκύπτουν οι λεκτικές μονάδες από ένα αρχείο με χαρακτήρες Η γραμματική αυτή συνήθως είναι μια κανονική γραμματική (regulr grmmr) και χρησιμοποιείται από το λεκτικό αναλυτή (snner) 2. Μία που ορίζει πως προκύπτουν τα συντακτικά δένδρα από μία ακολουθία λεκτικών μονάδων Η γραμματική αυτή συνήθως είναι μια γραμματική ελεύθερη συμφραζομένων (ontext-free grmmr) και χρησιμοποιείται από το συντακτικό αναλυτή (prser) Σύνταξη και Συντακτική Ανάλυση 19 Ιστορικές σημειώσεις (1) Παλιά, κάποιες γλώσσες προγραμματισμού δε διαχώριζαν τη λεκτική από την φραστική δομή Παλιές εκδόσεις της Fortrn και της Algol επέτρεπαν κενά σε οποιοδήποτε σημείο, ακόμα και στο μέσο μιας λέξης κλειδί! Άλλες γλώσσες, π.χ. η PL/I, επιτρέπουν τη χρήση λέξεων κλειδιών ως μεταβλητές (Το ίδιο συμβαίνει και στην ML, αλλά εκεί δεν αποτελεί πρόβλημα.) Τα παραπάνω προσθέτουν δυσκολία στην λεκτική και συντακτική ανάλυση και μειώνουν την αναγνωσιμότητα των προγραμμάτων Σύνταξη και Συντακτική Ανάλυση 20

Ιστορικές σημειώσεις (2) Κάποιες γλώσσες έχουν λεκτική δομή σταθερής μορφής (fixed-formt ) τα κενά είναι σημαντικά Μία εντολή ανά γραμμή (π.χ. της διάτρητης κάρτας) Οι πρώτες 7 θέσεις κάθε γραμμής για την ταμπέλα (lel) Οι πρώτες διάλεκτοι της Fortrn, Cool, και της Bsi Σχεδόν οι περισσότερες μοντέρνες γλώσσες είναι ελεύθερης μορφής (free-formt ): τα κενά αγνοούνται Π.χ. Algol, Psl, Jv Μερικές άλλες (C, C++) διαφέρουν λίγο λόγω του προεπεξεργαστή Σύνταξη και Συντακτική Ανάλυση 21 Άλλες μορφές γραμματικών Μικρές διαφοροποιήσεις της μορφής Bkus-Nur (BNF) Χρήση ή = αντί για ::= Όχι <> αλλά κάποιο ειδικό font ή χρήση αποστρόφων για τις λεκτικές μονάδες ώστε να ξεχωρίζονται εύκολα από τα μη τερματικά σύμβολα Επεκτάσεις της μορφής Bkus-Nur (EBNF) Πρόσθετος συμβολισμός για την απλοποίηση κάποιων κανόνων: {x} υποδηλώνει μηδέν ή περισσότερες επαναλήψεις του x [x] υποδηλώνει ότι το x είναι προαιρετικό (δηλαδή x <empty>) () για ομαδοποίηση οπουδήποτε για να υποδηλώσει επιλογή Αποστρόφους γύρω από τις λεκτικές μονάδες ούτως ώστε να ξεχωρίζονται από τα παραπάνω μετασύμβολα Συντακτικά διαγράμματα Σύνταξη και Συντακτική Ανάλυση 22 Παραδείγματα EBNF <if-stmt> ::= if <expr> then <stmt> [else <stmt>] <stmt-list> ::= {<stmt> ;} <thing-list> ::= { (<stmt> <delrtion>) ;} Συντακτικά διαγράμματα (1) Έστω ότι έχουμε μια γραμματική σε EBNF Ο κάθε κανόνας παραγωγής μετατρέπεται σε μια σειρά από κουτιά Ορθογώνια για τα μη τερματικά σύμβολα Οβάλ για τα τερματικά σύμβολα Τα παραπάνω ενώνονται με βέλη (Πιθανώς κάποια βέλη να παρακάμπτουν κάποια από τα κουτιά.) <if-stmt> ::= if <expr> then <stmt> [ else <stmt> ] if-stmt if then else expr stmt stmt Σύνταξη και Συντακτική Ανάλυση 23 Σύνταξη και Συντακτική Ανάλυση 24

Συντακτικά διαγράμματα (2) Παράδειγμα διαφορετικού συμβολισμού EBNF Πολλαπλοί κανόνες παραγωγής χρησιμοποιούν διακλαδώσεις (rnhing) exp exp + exp exp * exp ( exp ) WhileSttement: while ( Expression ) Sttement DoSttement: do Sttement while ( Expression ); ForSttement: for ( ForInit opt ; Expression opt ; ForUpdte opt ) Sttement Η επανάληψη υποδηλώνεται με χρήση βρόχων <exp> ::= <ddend> {+ <ddend>} exp ddend + από το βιβλίο The Jv Lnguge Speifition, Jmes Gosling et l. Σύνταξη και Συντακτική Ανάλυση 25 Σύνταξη και Συντακτική Ανάλυση 26 Τρεις ισοδύναμες γραμματικές G1: <suexp> ::= <suexp> - <suexp> Από τη Σύνταξη προς τη Σημασιολογία G2: <suexp> ::= <vr> - <suexp> <vr> <vr> ::= G3: <suexp> ::= <suexp> - <vr> <vr> <vr> ::= Και οι τρεις γραμματικές ορίζουν την ίδια γλώσσα: τη γλώσσα όλων των συμβολοσειρών που περιλαμβάνουν ένα ή περισσότερα,, ή τα οποία διαχωρίζονται από ένα μείον. Αλλά... Σύνταξη και Συντακτική Ανάλυση 27 Σύνταξη και Συντακτική Ανάλυση 28

<suexp> Γιατί είναι σημαντικά τα συντακτικά δένδρα; G2 prse tree: <vr> - <suexp> <vr> - <suexp> Θέλουμε η δομή του συντακτικού δένδρου να αντικατοπτρίζει τη σημασιολογία της συμβολοσειράς <vr> που αντιπροσωπεύει Αυτό κάνει το σχεδιασμό της γλώσσας πιο δύσκολο: <suexp> ενδιαφερόμαστε για τη δομή του κάθε συντακτικού δένδρου όχι μόνο για τη συμβολοσειρά των φύλλων του <suexp> - <vr> G3 prse tree: <suexp> - <vr> Τα συντακτικά δένδρα είναι το μέρος που η σύνταξη <vr> αρχίζει να συναντά τη σημασιολογία των γλωσσών Σύνταξη και Συντακτική Ανάλυση 29 Σύνταξη και Συντακτική Ανάλυση 30 Τελεστές (opertors) Προτεραιότητα (preedene) τελεστών Τελεστές χρησιμοποιούνται για λειτουργίες που γίνονται συχνά, π.χ. πρόσθεση, αφαίρεση, πολλαπλασιασμό, Ο όρος τελεστής αναφέρεται τόσο στη λεκτική μονάδα (π.χ. +, *) όσο και στη λειτουργία αυτή καθ αυτή Μοναδιαίοι τελεστές δέχονται ένα όρισμα: -1 Δυαδικοί τελεστές δέχονται δύο ορίσματα: 1+2 Τριαδικοί τελεστές δέχονται τρία ορίσματα:?: Στις περισσότερες γλώσσες Οι δυαδικοί τελεστές γράφονται σε infix μορφή: π.χ. 1+2 Οι μοναδιαίοι τελεστές γράφονται σε prefix (-2) ή σεpostfix μορφή (i++) Σύνταξη και Συντακτική Ανάλυση 31 Έστω η γραμματική G4: Ένα συντακτικό δένδρο για τη συμβολοσειρά +* είναι το <exp> ::= <exp> + <exp> <exp> * <exp> ( <exp> ) <exp> <exp> * <exp> <exp> + <exp> Στο δένδρο αυτό η πρόσθεση γίνεται πριν από τον πολλαπλασιασμό, κάτι που δεν είναι σε αρμονία με τις συνήθεις προτεραιότητες των τελεστών + και * Σύνταξη και Συντακτική Ανάλυση 32

Προτεραιότητα τελεστών στη γραμματική Για να έχουμε τη σωστή προτεραιότητα τελεστών, αλλάζουμε τη γραμματική με τέτοιο τρόπο ώστε ο τελεστής με την μεγαλύτερη προτεραιότητα να καταλήγει πιο κάτω στο συντακτικό δένδρο G5: <exp> ::= <exp> + <exp> <mulexp> <mulexp> ::= <mulexp> * <mulexp> ( <exp> ) Παραδείγματα προτεραιότητας τελεστών C (15 επίπεδα προτεραιότητας πάρα πολλά;) = <? * p + * : 1 << d () Psl (5 επίπεδα όχι αρκετά;) <= 0 or 100 <= Συντακτικό λάθος! Smlltlk (1 επίπεδο για όλους τους δυαδικούς τελεστές) + * Σύνταξη και Συντακτική Ανάλυση 33 Σύνταξη και Συντακτική Ανάλυση 34 Συντακτικό δένδρο με σωστή προτεραιότητα Προσεταιριστικότητα (ssoitivity) τελεστών <exp> <exp> <exp> G5 prse tree: <exp> + <exp> <mulexp> <mulexp> <exp> + <exp> <mulexp> <exp> + <exp> <mulexp> <mulexp> <exp> + <exp> <exp> + <exp> <mulexp> <mulexp> <mulexp> <mulexp> * <mulexp> Η γραμματική G5 παράγει μόνο αυτό το δένδρο για +* Αναγνωρίζει την ίδια γλώσσα με τη G4, αλλά δεν παράγει πλέον δένδρα με λάθος προτεραιότητα τελεστών Σύνταξη και Συντακτική Ανάλυση 35 Η γραμματική G5 παράγει τα παραπάνω δένδρα για ++ Το πρώτο από αυτά δεν αντικατοπτρίζει τη συνήθη προσεταιριστικότητα του τελεστή + Σύνταξη και Συντακτική Ανάλυση 36

Προσεταιριστικότητα τελεστών Έχουν χρησιμότητα όταν η σειρά της αποτίμησης δεν καθορίζεται από παρενθέσεις ή προτεραιότητα τελεστών Οι αριστερά προσεταιριστικοί τελεστές ομαδοποιούν από αριστερά προς τα δεξιά: +++d = ((+)+)+d Οι δεξιά προσεταιριστικοί τελεστές ομαδοποιούν από δεξιά προς τα αριστερά: +++d = +(+(+d)) Στις περισσότερες γλώσσες, οι περισσότεροι τελεστές είναι αριστερά προσεταιριστικοί, αλλά υπάρχουν και εξαιρέσεις Παραδείγματα προσεταιριστικότητας C ML <<<< ==0 Fortrn τελεστές είναι αριστερά προσεταιριστικοί δεξιά προσεταιριστικός (ανάθεση) 3-2-1 τελεστές είναι αριστερά προσεταιριστικοί 1::2::nil δεξιά προσεταιριστικός (κατασκευή λίστας) /* **** τελεστές είναι αριστερά προσεταιριστικοί δεξιά προσεταιριστικός (ύψωση σε δύναμη) Σύνταξη και Συντακτική Ανάλυση 37 Σύνταξη και Συντακτική Ανάλυση 38 Προσεταιριστικότητα στη γραμματική G5: <exp> ::= <exp> + <exp> <mulexp> <mulexp> ::= <mulexp> * <mulexp> ( <exp> ) Για να διορθώσουμε το πρόβλημα, τροποποιούμε τη γραμματική ώστε να κάνουμε δένδρα με τελεστές + να μεγαλώνουν προς τα αριστερά (παρόμοια για τον *) Δένδρο με σωστή προσεταιριστικότητα <exp> <mulexp> <rootexp> <exp> <exp> + <mulexp> + <mulexp> <rootexp> <rootexp> G6: <exp> ::= <exp> + <mulexp> <mulexp> <mulexp> ::= <mulexp> * <rootexp> <rootexp> <rootexp> ::= ( <exp> ) Η γραμματική G6 παράγει μόνο αυτό το δένδρο για ++ Παράγει την ίδια γλώσσα με τη G5, αλλά δεν παράγει πλέον δένδρα με λάθος προσεταιριστικότητα τελεστών Σύνταξη και Συντακτική Ανάλυση 39 Σύνταξη και Συντακτική Ανάλυση 40

Πρακτική άσκηση Ξεκινώντας από τη γραμματική G6: <exp> ::= <exp> + <mulexp> <mulexp> <mulexp> ::= <mulexp> * <rootexp> <rootexp> <rootexp> ::= ( <exp> ) 1. Προσθέστε έναν αριστερά προσεταιριστικό τελεστή &, με προτεραιότητα μικρότερη από όλους τους άλλους 2. Στη συνέχεια προσθέστε ένα δεξιά προσεταιριστικό τελεστή **, με προτεραιότητα μεγαλύτερη από όλους τους άλλους Διφορούμενη ερμηνεία (miguity) Η γραμματική G4 είναι διφορούμενη (miguous): παράγει περισσότερα από ένα συντακτικά δένδρα για την ίδια συμβολοσειρά Όμως η επιδιόρθωση των προβλημάτων προτεραιότητας και προσεταιριστικότητας των τελεστών εξαφάνισε όλη την ασάφεια στη συγκεκριμένη γραμματική Αυτό είναι επιθυμητό: το συντακτικό δένδρο υποδηλώνει τη σημασιολογία του προγράμματος και δε θέλουμε αυτή να είναι διφορούμενη Όμως υπάρχουν και άλλοι λόγοι που μια γραμματική είναι διφορούμενη, όχι μόνο λόγοι σχετικοί με τους τελεστές Σύνταξη και Συντακτική Ανάλυση 41 Σύνταξη και Συντακτική Ανάλυση 42 Το πρόβλημα του ξεκρέμαστου else <stmt> ::= <if-stmt> s1 s2 <if-stmt> ::= if <expr> then <stmt> else <stmt> if <expr> then <stmt> <expr> ::= e1 e2 Η γραμματική αυτή είναι διφορούμενη ως προς τo ξεκρέμαστο else ( dngling-else miguity ). Η παρακάτω εντολή if e1 then if e2 then s1 else s2 έχει δύο συντακτικά δένδρα Σύνταξη και Συντακτική Ανάλυση 43 <if-stmt> if <ex p> then <stmt> else <stmt> e1 if <ex p> then <stmt> e2 <if-stmt> s1 <if-stmt> if <ex p> then <stmt> e1 if <ex p> then <stmt> else <stmt> e2 <if-stmt> s1 s2 s2 Οι περισσότερες γλώσσες που έχουν αυτό το πρόβλημα επιλέγουν το κάτω συντακτικό δένδρο: το else πηγαίνει με το κοντινότερο αταίριαστο then Σύνταξη και Συντακτική Ανάλυση 44

Διόρθωση του προβλήματος (1) <stmt> ::= <if-stmt> s1 s2 <if-stmt> ::= if <expr> then <stmt> else <stmt> if <expr> then <stmt> <expr> ::= e1 e2 Θέλουμε να επιβάλλουμε ότι εάν αυτό επεκταθεί σε ένα if, τότε το if πρέπει ήδη να έχει το δικό του else. Πρώτα, δημιουργούμε ένα νέο μη τερματικό <full-stmt> που παράγει όλες τις εντολές που παράγονται από το <stmt>, αλλά απαγορεύει τις if εντολές χωρίς else Διόρθωση του προβλήματος (2) Μετά χρησιμοποιούμε το νέο μη τερματικό εδώ <stmt> ::= <if-stmt> s1 s2 <if-stmt> ::= if <expr> then <full-stmt> else <stmt> if <expr> then <stmt> <expr> ::= e1 e2 Το αποτέλεσμα είναι ότι η παραπάνω γραμματική μπορεί να ταιριάξει ένα else με ένα if μόνο όταν όλα τα κοντινά if έχουν ήδη κάποιο else ως ταίρι τους. <full-stmt> ::= <full-if> s1 s2 <full-if> ::= if <expr> then <full-stmt> else <full-stmt> Σύνταξη και Συντακτική Ανάλυση 45 Σύνταξη και Συντακτική Ανάλυση 46 Τώρα παράγουμε μόνο το συντακτικό δένδρο Ξεκρέμαστα else και αναγνωσιμότητα <if-stmt> if <exp> then <stmt> e1 <if-stmt> Διορθώσαμε τη γραμματική, αλλά Το πρόβλημα στη γραμματική αντικατοπτρίζει κάποιο πρόβλημα στη γλώσσα, την οποία δεν αλλάξαμε Μια ακολουθία από if-then-else δεν είναι εύκολα αναγνώσιμη, ειδικά εάν κάποια από τα else λείπουν if <exp> then <full-stmt> else <stmt> e2 s1 s2 int =0; if (0==0) if (0==1) =17; else =42; Ποια είναι η τιμή του μετά την εκτέλεση του προγράμματος; Σύνταξη και Συντακτική Ανάλυση 47 Σύνταξη και Συντακτική Ανάλυση 48

Καλύτερα στυλ προγραμματισμού Γλώσσες χωρίς ξεκρέμαστα else int =0; if (0==0) if (0==1) =17; else =42; int =0; if (0==0) { if (0==1) =17; else =42; } Καλύτερο: σωστή στοίχιση Ακόμα καλύτερο: ηχρήση μπλοκ δείχνει καθαρά τη δομή του κώδικα Μερικές γλώσσες ορίζουν τα if-then-else με τρόπο τέτοιο που να επιβάλλει τη σαφήνεια στη χρήση τους Η Algol δεν επιτρέπει μέσα στο then να αρχίζει άμεσα κάποιο άλλο if (αλλά μπορεί να αρχίζει ένα μπλοκ με ένα άλλο if) Η Algol 68 επιβάλλει σε κάθε if να τερματίζεται με ένα fi (υπάρχουν επίσης do-od και se-es) Η Ad επιβάλλει σε κάθε if να τερματίζεται με ένα end if Σύνταξη και Συντακτική Ανάλυση 49 Σύνταξη και Συντακτική Ανάλυση 50 Γραμματική για ολόκληρη τη γλώσσα Κάθε ρεαλιστική γλώσσα περιέχει πολλά μη τερματικά σύμβολα Ειδικά εάν από τη γραμματική έχει εξαλειφθεί η ασάφεια Τα επιπλέον μη τερματικά καθορίζουν τον τρόπο με τον οποίο προκύπτει ένα μοναδικό συντακτικό δένδρο Όταν κατασκευαστεί το συντακτικό δένδρο, τα επιπλέον μη τερματικά δεν έχουν κάποια χρησιμότητα πλέον Οι υλοποιήσεις των γλωσσών συνήθως αποθηκεύουν μια συνεπτυγμένη μορφή του συντακτικού δένδρου, η οποία ονομάζεται αφηρημένο συντακτικό δένδρο Σύνταξη και Συντακτική Ανάλυση 51 Συγκεκριμένο συντακτικό δένδρο <exp> <exp> + <mulexp> <exp> + <mulexp> <rootexp> <mulexp> <rootexp> <rootexp> + + Αφηρημένο συντακτικό δένδρο Σύνταξη και Συντακτική Ανάλυση 52

Συμπερασματικά Για τον ορισμό του συντακτικού (και όχι μόνο!) των γλωσσών προγραμματισμού χρησιμοποιούμε γραμματικές Οι γραμματικές ορίζουν το ποια είναι τα επιτρεπτά προγράμματα μιας γλώσσας, αλλά και το συντακτικό δένδρο για αυτά τα προγράμματα το δένδρο με τη σειρά του ορίζει τη σειρά εκτέλεσης των εντολών και κατά συνέπεια συνεισφέρει στον ορισμό της σημασιολογίας Υπάρχει ισχυρή σύνδεση μεταξύ θεωρίας και πράξης Δύο γραμματικές, δύο μέρη του μεταγλωττιστή (ompiler) Σημείωση: Υπάρχουν προγράμματα, γεννήτριες συντακτικών αναλυτών (prser genertors), που μπορούν να δημιουργήσουν αυτόματα τον κώδικα του λεκτικού και του συντακτικού αναλυτή απότηγραμματικήμιαςγλώσσας Σύνταξη και Συντακτική Ανάλυση 53