Κεφάλαιο 2 :: Σύνταξη των γλωσσών προγραμματισμού

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Προγραμματισμός PASCAL
Advertisements

Copyright © 2005 Elsevier Κεφάλαιο 2 :: Σύνταξη των γλωσσών προγραμματισμού Πραγματολογία των Γλωσσών Προγραμματισμού Michael L. Scott.
ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΥΠΟΡΟΥΤΙΝΕΣ
Μάθημα 4ο: Συντακτική Ανάλυση
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Διάλεξη 4: Δείκτες, συναρτήσεις και διαδικασίες Εαρινό εξάμηνο 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ.
Διαφάνειες παρουσίασης #5
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος ε
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος δ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Διάλεξη 5: Επαναληπτικές και εξωτερικές συναρτήσεις και διαδικασίες Εαρινό εξάμηνο 2009.
Γενική μορφή προγράμματος Pascal
Εισαγωγή Ειδικά Θέματα Μεταγγλωτιστών Χειμερινό Εξάμηνο / Κατασκευή compiler για την γλώσσα Minijava.
Προγραμματισμός ΙΙ Διάλεξη #6: Απλές Δομές Ελέγχου Δρ. Νικ. Λιόλιος.
ΕΠΛ Θεωρία και Πρακτική Μεταγλωττιστών5-1 Επίλυσης ασάφειας με εισαγωγή μη-τερματικών Π.χ. stmt = “if”, expr, “then”, stmt | “if”, expr, “then”,
Διαφάνειες παρουσίασης #3
ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου
Δυναμικη Δεσμευση Μνημης Συνδεδεμενες Λιστες (dynamic memory allocation, linked lists) Πως υλοποιουμαι προγραμματα που δεν γνωριζουμε πριν την εκτελεση.
ΘΠ06 - Μεταγλωττιστές Εισαγωγή στον Bison Φροντιστήριο - 30/03/2009.
ΘΠ06 - Μεταγλωττιστές Συντακτική Ανάλυση, Bison 1.
HY340 : ΓΛΩΣΣΕΣ ΚΑΙ ΜΕΤΑΦΡΑΣΤΕΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ, ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ, ΤΜΗΜΑ ΕΠΙΣΤΗΜΗΣ ΥΠΟΛΟΓΙΣΤΩΝ ΔΙΔΑΣΚΩΝ Αντώνιος Σαββίδης.
ΣΑ από κάτω-προς-τα-πάνω
Διαφάνειες παρουσίασης Πίνακες (συνέχεια) Αριθμητικοί υπολογισμοί Αναδρομή.
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ
ΘΠ06 - Μεταγλωττιστές Εισαγωγή στον Bison Φροντιστήριο - 23/03/2010.
ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου
Διαφάνειες παρουσίασης #2
Τεχνολογία ΛογισμικούSlide 1 Κλάση Μηνυμάτων Ταχυδρομείου Τεχνολογία Λογισμικού Slide 14.
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου
9-1 ΜΑΘΗΜΑ 9 ο Δυαδικά Δένδρα, Διάσχιση Δυαδικών Δένδρων Υλικό από τις σημειώσεις Ν. Παπασπύρου, 2006.
ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Διδάσκοντες:Στάθης Ζάχος Νίκος Παπασπύρου
Τεχνολογία ΛογισμικούSlide 1 Σχεδιασμός Λογισμικού ATM loop Print_input_message (” Welcome - Please enter your card”) ; exit when Card_input ; end loop.
ΘΠ06 - Μεταγλωττιστές Ενδιάμεσος Κώδικας – Μεταφραστικά Σχήματα.
Εισαγωγή στον προγραμματισμό Μέρος 1 ο Ιστορική αναδρομή γλωσσών προγραμματισμού §§ 6.1 – 6.2.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Συντακτική Ανάλυση II Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
LOGO Προγραμματισμός Η/Υ β’ εξάμηνο – εργαστήριο ΚΑΛΟΓΙΑΝΝΗΣ ΓΡΗΓΟΡΙΟΣ Ηλεκτρολόγος Μηχανικός και Μηχανικός Υπολογιστών Α.Π.Θ. Msc Τηλεπικοινωνίες Πολυτεχνική.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Συντακτική Ανάλυση Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Συντακτική Ανάλυση με το Εργαλείο BISON Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Copyright © 2005 Elsevier Κεφάλαιο 1 :: Εισαγωγή Πραγματολογία των Γλωσσών Προγραμματισμού Michael L. Scott.
Η καθημερινή ζωή στο Βυζάντιο Εργασία της μαθήτριας: Τζένη Αλουσάι στο μάθημα της Ιστορίας ΥΠΕΥΘΥΝΗ ΚΑΘΗΓΗΤΡΙΑ:κα.Τσαούση.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Σημασιολογική Ανάλυση Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
ΑΡΧΑΪΚΟ ΕΠΟΣ: ΟΜΗΡΟΣ ΣΤΟΙΧΕΙΑ ΟΜΗΡΙΚΗΣ ΔΙΑΛΕΚΤΟΥ Α. Τσοπανάκης, Εισαγωγή στον Όμηρο, Θεσ/νίκη 2004, σ
1 Προγραμματισμός Ι Ενότητα 7 : Πίνακες I Αλέξανδρος Τζάλλας Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου.
Εργαστήριο «Διαχείριση & Ασφάλεια Δικτύων» Επισκόπηση Βασικών Δικτυακών Λειτουργιών Διδάσκων: Δρ. Γενειατάκης Δημήτρης Τμήμα Επιστήμης.
Εισαγωγή στον Προγ/μό Η/Υ
Η Γλώσσα Pascal Εντολή If
Διδάσκων: Δρ. Τσίντζα Παναγιώτα
Καθορίζουν το είδος των υπό δημιουργία περιπτώσεων ελέγχου.

Εφαρμογές Υπολογιστών
Ενισχυτική διδασκαλία
Ενότητα 5 : Υποπρογράμματα II Αλέξανδρος Τζάλλας
Ενότητα 1 : Εισαγωγικά Στοιχεία της Pascal Αλέξανδρος Τζάλλας
Ενισχυτική διδασκαλία
Δομές διακλάδωσης, επαναλήψεις, μέθοδοι
Νικήτας Σγούρος Μεταγλωττιστές Νικήτας Σγούρος
Νικήτας Σγούρος Μεταγλωττιστές Νικήτας Σγούρος
ΠΕΤΡΟΛΟΓΙΑ ΜΑΓΜΑΤΙΚΩΝ & ΜΕΤΑΜΟΡΦΩΜΕΝΩΝ ΠΕΤΡΩΜΑΤΩΝ
Δομημένος Προγραμματισμός
Πρότυπα Προγραμματισμού
Σχεδιασμός με αναζήτηση στο χώρο πλάνων
Η χιονονιφάδα και το τρίγωνο του Pascal
ΓΛΩΣΣΕΣ & ΕΡΓΑΛΕΙΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ
Η στήριξη και η κίνηση στους ζωικούς οργανισμούς
Η Κωνσταντινα και οι αραχνεσ τησ
της ενότητας « Ταξιδεύω με πυξίδα το “Χρόνο” »
Κεφάλαιο 7 10/11/2018 Ξένιος Αντωνιάδης.
Εισαγωγή στον αλγεβρικό λογισμό
Δομές Δεδομένων (Data Structures)
Max-Flow: Non-terminating example with irrational capatcities
Μεταγράφημα παρουσίασης:

Κεφάλαιο 2 :: Σύνταξη των γλωσσών προγραμματισμού Κεφάλαιο 2 :: Σύνταξη των γλωσσών προγραμματισμού Πραγματολογία των Γλωσσών Προγραμματισμού Michael L. Scott Copyright © 2005 Elsevier

Μια κανονική έκφραση είναι ένα από τα εξής: Κανονικές Εκφράσεις Μια κανονική έκφραση είναι ένα από τα εξής: Ένας χαρακτήρας Η κενή συμβολοσειρά, που συμβολίζεται με  Δύο κανονικές εκφράσεις η μια δίπλα στην άλλη Δυο κανονικές εκφράσεις διαχωρισμένες με μια κατακόρυφη γραμμή, | (“ή”) Μια κανονική έκφραση ακολουθούμενη από το άστρο του Kleene (συνένωση καμίας ή περισσότερων συμβολοσειρών) Copyright © 2005 Elsevier

Κανονικές Εκφράσεις Οι αριθμητικές σταθερές στην Pascal μπορούν να παραχθούν από τις εξής κανονικές εκφράσεις: Copyright © 2005 Elsevier

Γραμματικές χωρίς συμφραζόμενα Η σημειογραφία των γραμματικών χωρίς συμφραζόμενα ονομάζεται συχνά μορφή Backus-Naur (Backus-Naur Form, BNF) Μια γραμματική χωρίς συμφραζόμενα αποτελείται από Ένα σύνολο τερματικών συμβόλων T Ένα σύνολο μη τερματικών συμβόλων N Ένα αρχικό σύμβολο S (μη τερματικό) Ένα σύνολο συντακτικών κανόνων Copyright © 2005 Elsevier

Γραμματικές χωρίς συμφραζόμενα Γραμματική εκφράσεων με προτεραιότητα και προσεταιριστικότητα Copyright © 2005 Elsevier

Γραμματικές χωρίς συμφραζόμενα Συντακτικό δένδρο για τη γραμματική των εκφράσεων (με προτεραιότητα) για το 3 + 4 * 5 Copyright © 2005 Elsevier

Γραμματικές χωρίς συμφραζόμενα Συντακτικό δένδρο για τη γραμματική των εκφράσεων (με αριστερή προσεταιριστικότητα) για το 10 - 4 - 3 Copyright © 2005 Elsevier

Θυμηθείτε ότι η λεκτική ανάλυση Λεκτική ανάλυση Θυμηθείτε ότι η λεκτική ανάλυση ομαδοποιεί τους χαρακτήρες εισόδου σε λεκτικές μονάδες αφαιρεί τα σχόλια (συνήθως) χειρίζεται τις οδηγίες (σημαντικά σχόλια) αποθηκεύει το κείμενο των αναγνωριστικών, των αριθμητικών σταθερών και των συμβολοσειρών αποθηκεύει τα σημεία του αρχικού κώδικα (αρχείο, γραμμή, στήλη) για την παραγωγή μηνυμάτων σφάλματος Copyright © 2005 Elsevier

Αν είναι . κοιτάζουμε τον επόμενο χαρακτήρα Λεκτική ανάλυση Θεωρήστε ότι κατασκευάζουμε έναν αυτοσχέδιο λεκτικό αναλυτή για την Pascal: Διαβάζουμε τους χαρακτήρες έναν-έναν (διαβάζουμε μπροστά τον επόμενο χαρακτήρα όταν χρειάζεται) Αν είναι κάποια από τις λεκτικές μονάδες του ενός χαρακτήρα { ( ) [ ] < > , ; = + - κλπ } την επιστρέφουμε Αν είναι . κοιτάζουμε τον επόμενο χαρακτήρα Αν είναι . επιστρέφουμε .. Διαφορετικά επιστρέφουμε . και ξαναχρησιμοποιούμε την προανάγνωση Copyright © 2005 Elsevier

Αν είναι < κοιτάζουμε τον επόμενο χαρακτήρα Λεκτική Ανάλυση Αν είναι < κοιτάζουμε τον επόμενο χαρακτήρα αν είναι = επιστρέφουμε <= διαφορετικά επιστρέφουμε < και ξαναχρησιμοποιούμε την προανάγνωση, κλπ. Αν είναι γράμμα διαβάζουμε οσαδήποτε επόμενα γράμματα, αριθμούς ή και “_” μέχρι να μην υπάρχει επόμενο στη συνέχεια ελέγχουμε αν είναι λέξη κλειδί Copyright © 2005 Elsevier

Λεκτική Ανάλυση Αν είναι ψηφίο, συνεχίζουμε την ανάγνωση μέχρι να βρούμε κάτι που δεν είναι ψηφίο αν δεν είναι . επιστρέφουμε μια ακέραια σταθερά διαφορετικά συνεχίζουμε να διαβάζουμε μια πραγματική σταθερά αν ο χαρακτήρας μετά το . δεν είναι ψηφίο επιστρέφουμε μια ακέραια σταθερά και ξαναχρησιμοποιούμε το . και την πρόγνωση Copyright © 2005 Elsevier

Λεκτική Ανάλυση Σχηματική αναπαράσταση ενός λεκτικού αναλυτή για την Pascal ως πεπερασμένου αυτομάτου Copyright © 2005 Elsevier

Είναι ένα Ντετερμινιστικό Πεπερασμένο Αυτόματο (ΝΠΑ) Λεκτική Ανάλυση Είναι ένα Ντετερμινιστικό Πεπερασμένο Αυτόματο (ΝΠΑ) Τα εργαλεία lex, scangen, κλπ. τα παράγουν αυτόματα από ένα σύνολο κανονικών εκφράσεων Ειδικότερα, κατασκευάζουν μια μηχανή που αποδέχεται τη γλώσσα identifier | int const | real const | comment | symbol | ... Copyright © 2005 Elsevier

Λεκτική Ανάλυση Εκτελούμε συνεχώς τη μηχανή για να παράγουμε συνεχόμενες λεκτικές μονάδες Σχεδόν καθολικός κανόνας: πάντα διάβαζε τη μεγαλύτερη πιθανή λεκτική μονάδα από την είσοδο δηλαδή το foobar είναι foobar, ποτέ f ή foo ή foob ειδικότερα, το 3.14159 είναι πραγματική σταθερά και ποτέ 3, ., και 14159 Οι κανονικές εκφράσεις “παράγουν” μια κανονική γλώσσα· τα ΝΠΑ την “αναγνωρίζουν” Copyright © 2005 Elsevier

Οι λεκτικοί αναλυτές συνήθως κατασκευάζονται με τρείς τρόπους Λεκτική Ανάλυση Οι λεκτικοί αναλυτές συνήθως κατασκευάζονται με τρείς τρόπους αυτοσχέδιοι ημι-αυτόματα αμιγή ΝΠΑ (συνήθως υλοποιημένα με ένθετες εντολές case) ΝΠΑ που κάνουν χρήση πινάκων Οι αυτοσχέδιοι είναι πιο γρήγοροι και μικροί σε μέγεθος κώδικα και με ειδικές λειτουργίες· όμως, καλοί λεκτικοί αναλυτές που έχουν παραχθεί αυτόματα τους πλησιάζουν Copyright © 2005 Elsevier

Το lex και το scangen παράγουν ΝΠΑ με πίνακες Λεκτική Ανάλυση Η συγγραφή ενός αγνού ΝΠΑ σαν ένα σύνολο ένθετων εντολών case είναι μια πραγματικά χρήσιμη προγραμματιστική τεχνική αν και συνήθως είναι ευκολότερο να χρησιμοποιείτε perl, awk, sed για λεπτομέρειες δείτε την εικόνα 2.11 Το lex και το scangen παράγουν ΝΠΑ με πίνακες το lex (flex) σε κώδικα C το scangen σε μορφή αριθμητικών πινάκων και μιας ξεχωριστής συνάρτησης-οδηγού (για λεπτομέρειες δείτε την εικόνα 2.12) Copyright © 2005 Elsevier

Λεκτική Ανάλυση Ο κανόνας για τις λεκτικές μονάδες μέγιστου μήκους σημαίνει ότι επιστρέφετε μόνο όταν ο επόμενος χαρακτήρας δε μπορεί να χρησιμοποιηθεί για να συνεχίσει την τρέχουσα λεκτική μονάδα γενικά ο επόμενος χαρακτήρας πρέπει να αποθηκεύεται για την επόμενη λεκτική μονάδα Σε μερικές περιπτώσεις, ίσως χρειαστεί να κοιτάξετε παραπάνω από έναν χαρακτήρες μπροστά για να δείτε αν θα συνεχίσετε Στην Pascal, για παράδειγμα, όταν έχετε ένα 3 και βλέπετε μια τελεία συνεχίζετε (ελπίζοντας να διαβάσετε 3.14); ή σταματάτε (για να μη διαβάσετε 3..5); Copyright © 2005 Elsevier

DO 5 I = 1,25 loop DO 5 I = 1.25 assignment Λεκτική Ανάλυση Σε πιο δύσκολες καταστάσεις, ίσως να μην αρκεί ένα συγκεκριμένο μήκος προανάγνωσης. Για παράδειγμα στην Fortran, έχουμε DO 5 I = 1,25 loop DO 5 I = 1.25 assignment Εδώ χρειάζεται να θυμόμαστε πότε είμαστε σε μια δυνητικά τελική κατάσταση και να αποθηκεύουμε πληροφορίες στις οποίες να μπορούμε να επιστρέψουμε αν κάποια στιγμή δε μπορέσουμε να προχωρήσουμε άλλο Copyright © 2005 Elsevier

Ορολογία: Συντακτική Ανάλυση γραμματική χωρίς συμφραζόμενα (context-free grammar, CFG) σύμβολα τερματικά (λεκτικές μονάδες) μη-τερματικά συντακτικός κανόνας παραγωγές (αριστερότερες και δεξιότερες - κανονικές) δένδρα συντακτικής δομής προτασιακή μορφή Copyright © 2005 Elsevier

Υπάρχει άπειρο πλήθος γραμματικών για κάθε γλώσσα χωρίς συμφραζόμενα Συντακτική Ανάλυση Κατ’ αναλογία με τις κανονικές εκφράσεις και τα ΝΠΑ, μια γραμματική χωρίς συμφραζόμενα (CFG) είναι μια γεννήτρια για μια γλώσσα χωρίς συμφραζόμενα (context-free language, CFL) ο συντακτικός αναλυτής είναι ο αναγνωριστής αυτής της γλώσσας Υπάρχει άπειρο πλήθος γραμματικών για κάθε γλώσσα χωρίς συμφραζόμενα δεν είναι όμως όλες οι γραμματικές ίδιες Copyright © 2005 Elsevier

Υπάρχουν δύο πολύ γνωστοί αλγόριθμοι συντακτικής ανάλυσης για αυτό Συντακτική Ανάλυση Αποδεικνύεται ότι για κάθε CFG μπορούμε να κατασκευάσουμε ένα συντακτικό αναλυτή που να τρέχει σε χρόνο O(n3) Υπάρχουν δύο πολύ γνωστοί αλγόριθμοι συντακτικής ανάλυσης για αυτό Ο αλγόριθμος του Early Ο αλγόριθμος των Cooke-Younger-Kasami (CYK) Ο χρόνος O(n3) δεν είναι αποδεκτός για χρήση σε ένα μεταγλωττιστή – πολύ αργός Copyright © 2005 Elsevier

Συντακτική Ανάλυση Ευτυχώς υπάρχουν μεγάλες κλάσεις γραμματικών για τις οποίες μπορούμε να κατασκευάσουμε συντακτικούς αναλυτές που εκτελούνται σε γραμμικό χρόνο Οι δύο σημαντικότερες από αυτές τις κλάσεις είναι η LL και η LR LL σημαίνει “αριστερά προς τα δεξιά, αριστερότερη παραγωγή” (Left-to-right, Leftmost derivation). LR σημαίνει “αριστερά προς τα δεξιά, δεξιότερη παραγωγή” (Left-to-right, Rightmost derivation). Copyright © 2005 Elsevier

Υπάρχουν πολλές σημαντικές υποκλάσεις συντακτικών αναλυτών LR Συντακτική Ανάλυση Οι συντακτικοί αναλυτές LL ονομάζονται επίσης “καθοδικοί” ή συντακτικοί αναλυτές “πρόβλεψης” και οι συντακτικοί αναλυτές LR ονομάζονται “ανοδικοί” ή συνθετικοί συντακτικοί αναλυτές Υπάρχουν πολλές σημαντικές υποκλάσεις συντακτικών αναλυτών LR SLR LALR Δε θα ασχοληθούμε με τις λεπτομέρειες σχετικά με τις διαφορές μεταξύ τους Copyright © 2005 Elsevier

Συντακτική Ανάλυση Κάθε γραμματική LL(1) είναι και LR(1), αν και η δεξιά αναδρομή στον συντακτικό κανόνα τείνει να χρειάζεται πολύ μεγάλες στοίβες και δυσχεραίνει τη σημασιολογική ανάλυση Κάθε CFL που μπορεί να αναλυθεί συντακτικά με ντετερμινιστικό τρόπο έχει μια γραμματική SLR(1) (που είναι LR(1)) Κάθε ντετερμινιστική CFL με την ιδιότητα προθέματος (μια έγκυρη συμβολοσειρά δε μπορεί να είναι πρόθεμα άλλης έγκυρης συμβολοσειράς) έχει μια γραμματική LR(0) Copyright © 2005 Elsevier

Συντακτική Ανάλυση Συνήθως βλέπετε τον όρο LL ή LR (ή άλλους) γραμμένο με έναν αριθμό σε παρενθέσεις μετά από αυτόν Ο αριθμός δείχνει πόσες λεκτικές μονάδες προανάγνωσης χρειάζονται για τη συντακτική ανάλυση Σχεδόν όλοι οι πραγματικοί μεταγλωττιστές χρησιμοποιούν προανάγωση μιας λεκτικής μονάδας Η γραμματική των εκφράσεων (με προτεραιότητα και προσεταιριστικότητα) που είδατε πριν είναι LR(1), αλλά όχι LL(1) Copyright © 2005 Elsevier

Μια γραμματική LL(1) (Εικόνα 2.15): program  stmt_list $$$ stmt_list  stmt stmt_list |  stmt  id := expr | read id | write expr expr  term term_tail term_tail  add op term term_tail Copyright © 2005 Elsevier

Μια γραμματική LL(1) (συνέχεια) 10. term  factor fact_tail 11. fact_tail  mult_op fact fact_tail |  factor  ( expr ) | id | number add_op  + | - mult_op  * | / Copyright © 2005 Elsevier

Πώς αναλύουμε συντακτικά μια συμβολοσειρά με αυτήν τη γραμματική; Συντακτική Ανάλυση LL Όπως η ανοδική γραμματική, μπορεί να εκφράσει την προσεταιριστικότητα και την προτεραιότητα αλλά πολλοί άνθρωποι δεν τη βρίσκουν εύχρηστη οι τελεστέοι ενός τελεστή δεν είναι μαζί στο δεξιό μέλος! όμως η απλότητα του αλγόριθμου συντακτικής ανάλυσης μας αποζημιώνει για αυτό το μειονέκτημα Πώς αναλύουμε συντακτικά μια συμβολοσειρά με αυτήν τη γραμματική; σταδιακά χτίζοντας το δένδρο συντακτικής ανάλυσης Copyright © 2005 Elsevier

Παράδειγμα (πρόγραμμα μέσου όρου) read A read B sum := A + B write sum Συντακτική Ανάλυση LL Παράδειγμα (πρόγραμμα μέσου όρου) read A read B sum := A + B write sum write sum / 2 Αρχίζουμε στο πάνω μέρος και προβλέπουμε τους συντακτικούς κανόνες που θα χρειαστούμε με βάση το τρέχον αριστερότερο μη-τερματικό στο δένδρο και το τρέχον λεκτικό εισόδου Copyright © 2005 Elsevier

Δένδρο συντακτικής δομής για το πρόγραμμα μέσου όρου (Εικόνα 2.17) Συντακτική Ανάλυση LL Δένδρο συντακτικής δομής για το πρόγραμμα μέσου όρου (Εικόνα 2.17) Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Συντακτική ανάλυση LL με χρήση πίνακα: έχετε ένα μεγάλο βρόχο που επαναλαμβανόμενα αναζητά μια ενέργεια σε ένα διδιάστατο πίνακα με βάση το τρέχον αριστερότερο μη-τερματικό και την τρέχουσα λεκτική μονάδα εισόδου. Οι ενέργειες είναι (1) ταύτιση με τερματικό (2) πρόβλεψη συντακτικού κανόνα (3) παραγωγή ενός σφάλματος σύνταξης Copyright © 2005 Elsevier

Πίνακας συντακτικής ανάλυσης LL(1) για τη γλώσσα της αριθμομηχανής Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Για το χειρισμό του αριστερότερου μη-τερματικού, τοποθετείτε σε μια στοίβα τα άγνωστα τμήματα (που δεν έχετε δει ακόμα) των συντακτικών κανόνων για λεπτομέρειες δείτε την Εικόνα 2.20 Η βασική αρχή που πρέπει να θυμάστε είναι ότι η στοίβα περιέχει οτιδήποτε περιμένετε να δείτε από τώρα ως το τέλος του προγράμματος θα δείτε ό,τι προβλέπετε Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Προβλήματα που προκύπτουν όταν προσπαθούμε να κάνουμε μια γραμματική LL(1) αριστερή αναδρομή παράδειγμα: id_list  id | id_list , id ισοδύναμα id_list  id id_list_tail id_list_tail  , id id_list_tail | epsilon μπορούμε να απαλλαγούμε από όλες τις αριστερές αναδρομές με μηχανικό τρόπο σε οποιαδήποτε γραμματική Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Προβλήματα που προκύπτουν όταν προσπαθούμε να κάνουμε μια γραμματική LL(1) κοινά προθέματα: άλλο ένα πράγμα που οι συντακτικοί αναλυτές LL δε μπορούν να χειριστούν επιλύεται με “αριστερή παραγοντοποίηση” παράδειγμα: stmt  id := expr | id ( arg_list ) ισοδύναμα stmt  id id_stmt_tail id_stmt_tail  := expr | ( arg_list) μπορούμε να απαλείψουμε την αριστερή παραγοντοποίηση με μηχανικό τρόπο Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Η απαλοιφή της αριστερής αναδρομής και των κοινών προθεμάτων ΔΕΝ κάνει μια γραμματική LL υπάρχουν άπειρες μη-LL ΓΛΩΣΣΕΣ, και οι μηχανικοί μετασχηματισμοί δουλεύουν σε αυτές κανονικά τις λίγες γλώσσες που εμφανίζονται στην πράξη όμως, μπορούμε να τις χειριστούμε με ευρετικούς κανόνες Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Προβλήματα που προκύπτουν όταν προσπαθούμε να κάνουμε μια γραμματική LL(1) το πρόβλημα του “αιωρούμενου else” δεν επιτρέπει σε γραμματικές να είναι LL(1) (ή γενικότερα LL(k) για κάθε k) το ακόλουθο απόσπασμα φυσικής γραμματικής είναι διφορούμενο (Pascal) stmt  if cond then_clause else_clause | other_stuff then_clause  then stmt else_clause  else stmt | epsilon Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Το λιγότερο φυσικό απόσπασμα γραμματικής μπορεί να αναλυθεί συντακτικά ανοδικά αλλά όχι καθοδικά stmt  balanced_stmt | unbalanced_stmt balanced_stmt  if cond then balanced_stmt else balanced_stmt | other_stuff unbalanced_stmt  if cond then stmt | if cond then balanced_stmt else unbalanced_stmt Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Η συνήθης προσέγγιση, είτε ανοδική είτε καθοδική, είναι να χρησιμοποιούμε τη διφορούμενη γραμματική μαζί με έναν κανόνα αποφυγής αμφισημίας που να λέει το else ταιριάζει με το πλησιέστερο then ή γενικότερα, ο πρώτος από δύο πιθανούς συντακτικούς κανόνες είναι αυτός που θα προβλεφθεί (ή θα ελαττωθεί) Copyright © 2005 Elsevier

Στη Modula-2, για παράδειγμα, μπορείτε να πείτε: Συντακτική Ανάλυση LL Ακόμα καλύτερα, οι γλώσσες (από την Pascal και έπειτα) γενικά χρησιμοποιούν ρητά σύμβολα τερματισμού, που λύνουν το πρόβλημα Στη Modula-2, για παράδειγμα, μπορείτε να πείτε: if A = B then if C = D then E := F end else G := H end Η Ada λέει “end if”, άλλες γλώσσες λένε “fi” Copyright © 2005 Elsevier

Με σύμβολα τερματισμού αυτό γίνεται Συντακτική Ανάλυση LL Ένα πρόβλημα με τα σύμβολα τερματισμού είναι ότι έχουν την τάση να συσσωρεύονται. Στην Pascal λέμε if A = B then … else if A = C then … else if A = D then … else if A = E then … else ...; Με σύμβολα τερματισμού αυτό γίνεται if A = B then … else if A = C then … else if A = D then … else if A = E then … else ...; end; end; end; end; Copyright © 2005 Elsevier

Αποτελείται από 3 φάσεις: Συντακτική Ανάλυση LL Ο αλγόριθμος για την κατασκευή συνόλων πρόβλεψης είναι πολύπλοκος (για μια γραμματική “πραγματικού” μεγέθους), αλλά σχετικά απλός Αποτελείται από 3 φάσεις: (1) υπολογισμός των συνόλων FIRST για τα σύμβολα (2) υπολογισμός των συνόλων FOLLOW για τα μη-τερματικά (αυτό απαιτεί τον υπολογισμό των συνόλων FIRST κάποιων συμβολοσειρών) (3) υπολογισμός των συνόλων πρόβλεψης ή του πίνακα για όλους τους συντακτικούς κανόνες Copyright © 2005 Elsevier

Είναι σύνηθες στις γραμματικές να χρησιμοποιούμε Συντακτική Ανάλυση LL Είναι σύνηθες στις γραμματικές να χρησιμοποιούμε μικρά γράμματα κοντά στην αρχή του αλφαβήτου για τερματικά μικρά γράμματα κοντά στο τέλος του αλφαβήτου για συμβολοσειρές από τερματικά κεφαλαία γράμματα στην αρχή του αλφαβήτου για μη-τερματικά κεφαλαία γράμματα στο τέλος του αλφαβήτου για αυθαίρετα σύμβολα ελληνικά γράμματα για αυθαίρετες συμβολοσειρές συμβόλων Copyright © 2005 Elsevier

Αλγόριθμοι First/Follow/Predict: FIRST() == {a :  * a }  (if  =>*  THEN {} ELSE NULL) FOLLOW(A) == {a : S +  A a }  (if S *  A THEN {} ELSE NULL) Predict (A  X1 ... Xm) == (FIRST (X1 ... Xm) - {})  (if X1, ..., Xm *  then FOLLOW (A) ELSE NULL) Ακολουθούν λεπτομέρειες… Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Copyright © 2005 Elsevier

Συντακτική Ανάλυση LL Copyright © 2005 Elsevier

Μια διένεξη μπορεί να συμβεί όταν Συντακτική Ανάλυση LL Αν κάποια λεκτική μονάδα ανήκει στο σύνολο πρόβλεψης περισσότερων του ενός συντακτικών κανόνων με το ίδιο αριστερό μέλος, τότε η γραμματική δεν είναι LL(1) Μια διένεξη μπορεί να συμβεί όταν η ίδια λεκτική μονάδα μπορεί να αρχίζει με περισσότερα του ενός αριστερά μέρη μπορεί να αρχίζει ένα δεξιό μέλος και ταυτόχρονα να εμφανίζεται μετά το αριστερό μέλος σε κάποιο έγκυρο πρόγραμμα και ένα πιθανό δεξιό μέλος να είναι το  Copyright © 2005 Elsevier

Οι συντακτικοί αναλυτές LR συνήθως λειτουργούν με πίνακες: ομοιότητα με ένα συντακτικό αναλυτή LL με πίνακες: ένας συντακτικός αναλυτής LR χρησιμοποιεί ένα μεγάλο βρόχο που επαναλαμβανόμενα ελέγχει ένα διδιάστατο πίνακα για να βρει την επόμενη ενέργεια διαφορά με ένα συντακτικό αναλυτή LL: ο οδηγός LR έχει μη-τετριμμένη κατάσταση (σαν ΝΠΑ), και ο πίνακας δεικτοδοτείται από την τρέχουσα λεκτική μονάδα εισόδου και την τρέχουσα κατάσταση η στοίβα περιέχει μια εγγραφή με ό,τι έχει δει ΜΕΧΡΙ ΣΤΙΓΜΗΣ (ΟΧΙ ό,τι περιμένει ακόμα να δει στην είσοδο) Copyright © 2005 Elsevier

Ένας συντακτικός αναλυτής είναι ένα ΝΠΑ Συντακτική Ανάλυση LR Ένας συντακτικός αναλυτής είναι ένα ΝΠΑ μπορεί να οριστεί από ένα διάγραμμα καταστάσεων Ένας συντακτικός αναλυτής LL ή LR είναι ένα ΑΣ Οι αλγόριθμοι των Early και CYK ΔΕΝ χρησιμοποιούν ΑΣ ένα ΑΣ μπορεί να οριστεί με ένα διάγραμμα καταστάσεων και μια στοίβα το διάγραμμα καταστάσεων μοιάζει με ένα διάγραμμα καταστάσεων ΝΠΑ αλλά οι ακμές του έχουν ετικέτες-ζεύγη της μορφής <σύμβολο εισόδου, πάνω σύμβολο στη στοίβα> και, εκτός της μετακίνησης σε νέα κατάσταση, το ΑΣ μπορεί να τοποθετεί ή να αποκτά ένα πεπερασμένο σύνολο συμβόλων προς/από τη στοίβα Copyright © 2005 Elsevier

Ένα LL(1) ΑΣ έχει μόνο μια κατάσταση! Συντακτική Ανάλυση LR Ένα LL(1) ΑΣ έχει μόνο μια κατάσταση! στην πραγματικότητα έχει δύο· απλά χρειάζεται μια δεύτερη για να αποδέχεται (είναι πολύ εύκολο) όλες οι ακμές είναι κλειστοί βρόχοι· η μόνη διαφορά μεταξύ τους είναι η επιλογή μεταξύ της ανάγνωσης από τη στοίβα και της εγγραφής σε αυτήν η τελική κατάσταση είναι προσβάσιμη από μια μετάβαση που βλέπει το τέλος αρχείου (EOF) στην είσοδο και στη στοίβα Copyright © 2005 Elsevier

Ένα SLR/LALR/LR ΑΣ έχει πολλαπλές καταστάσεις είναι ένας “αναγνωριστής”, δεν “προβλέπει” δημιουργεί ένα δένδρο συντακτικής ανάλυσης ανοδικά οι καταστάσεις εντοπίζουν τους συντακτικούς κανόνες στους όποιους υπάρχει πιθανότητα να βρισκόμαστε Η συντακτική ανάλυση της Χαρακτηριστικής Μηχανής Πεπερασμένων Καταστάσεων βασίζεται στις εξής τεχνικές Ολίσθηση Ελάττωση Copyright © 2005 Elsevier

Συντακτκή Ανάλυση LR Για την απεικόνιση της συντακτικής ανάλυσης LR, θεωρήστε τη γραμματική (Εικόνα 2.24, Σελίδα 73): program  stmt list $$$ stmt_list  stmt_list stmt | stmt stmt  id := expr | read id | write expr expr  term | expr add op term Copyright © 2005 Elsevier

Γραμματική LR (συνέχεια): 9. term  factor | term mult_op factor factor  ( expr ) | id | number add op  + | - mult op  * | / Copyright © 2005 Elsevier

Συντακτική Ανάλυση LR Αυτή η γραμματική είναι SLR(1), μια αρκετά χρήσιμη κλάση ανοδικών γραμματικών δεν είναι αυτό ακριβώς που είχαμε δει έχουμε απαλείψει τον συντακτικό κανόνα έψιλον για να απλοποιήσουμε την παρουσίαση Για λεπτομέρειες σχετικά με τη συντακτική SLR(1) ανάλυση με πίνακα δείτε τις έπόμενες διαφάνειες Copyright © 2005 Elsevier

Συντακτική Ανάλυση LR Copyright © 2005 Elsevier

Συντακτική Ανάλυση LR Εικόνα 2.26: Σχηματική αναπαράσταση της ΧΜΠΚ της εικόνας 2.25. Τα ονόματα των συμβόλων έχουν συντμηθεί για λόγους διάταξης. Οι ενέργειες ελάττωσης δεν παρουσιάζονται. Copyright © 2005 Elsevier

Συντακτική Ανάλυση LR Copyright © 2005 Elsevier

Συντακτική Ανάλυση LR Η συντακτική ανάλυση SLR βασίζεται σε Ολίσθηση Ελάττωση και επίσης Ολίσθηση & Ελάττωση (για βελτιστοποίηση) Copyright © 2005 Elsevier