ASPA JFlex JavaCC Antlr ActiveX... 13

Σχετικά έγγραφα
ASPA: A translator from ASP to PHP

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

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

Κεφάλαιο 10 ο Υποπρογράµµατα

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

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

Επιµέλεια Θοδωρής Πιερράτος

ΕΠΛ 012. JavaScripts

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων

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

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

Μαλούτα Θεανώ Σελίδα 1

Σου προτείνω να τυπώσεις τις επόμενες τέσσερις σελίδες σε ένα φύλο διπλής όψης και να τις έχεις μαζί σου για εύκολη αναφορά.

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

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

Αντικειµενοστρεφής Προγραµµατισµός

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

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

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

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

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

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

Α. Ερωτήσεις Ανάπτυξης

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

ΑΕΠΠ Ερωτήσεις θεωρίας

Περιεχόµενα. Ανασκόπηση - Ορισµοί. Ο κύκλος ανάπτυξης προγράµµατος. Γλώσσες Προγραµµατισµού Ασκήσεις

Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω:

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

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

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

Επιλογή και επανάληψη. Λογική έκφραση ή συνθήκη

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

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

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

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

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2. Α1. Ο αλγόριθμος είναι απαραίτητος μόνο για την επίλυση προβλημάτων πληροφορικής

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

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

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

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

Προγραμματισμός I (Θ)

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τα επιμέρους τμήματα Η ΟΜΗ TOY ΥΠΟΛΟΓΙΣΤΗ. Αναπαράσταση μεγεθών. Αναλογική αναπαράσταση ΚΕΝΤΡΙΚΗ ΜΝΗΜΗ ΜΟΝΑ Α ΕΛΕΓΧΟΥ

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

Τμήμα Χρηματοοικονομικής & Ελεγκτικής ΤΕΙ Ηπείρου Παράρτημα Πρέβεζας. Πληροφορική Ι. Μάθημα 4 ο Πράξεις με bits. Δρ.

6. Εισαγωγή στον προγραµµατισµό

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών

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

if(συνθήκη) {... // οµάδα εντολών } C: Από τη Θεωρία στην Εφαρµογή 5 ο Κεφάλαιο

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

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

Προγραμματισμός Η/Υ. Προτεινόμενα θέματα εξετάσεων Εργαστήριο. Μέρος 1 ό. ΤΕΙ Λάρισας- Σχολή Τεχνολογικών Εφαρμογών Τμήμα Πολιτικών Έργων Υποδομής

Αντικειμενοστρεφής Προγραμματισμός

ΗΥ-150. Προγραμματισμός

FAIL PASS PASS οριακά

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

ΗΥ-150. Προγραμματισμός

Οι εντολές ελέγχου της ροής ενός προγράμματος.

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

4.4 Μετατροπή από μία μορφή δομής επανάληψης σε μία άλλη.

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

Τεχνικές σχεδίασης προγραμμάτων, Προγραμματιστικά Περιβάλλοντα

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

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

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

Κλάσεις και Αντικείµενα

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

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

Προγραµµατισµός Η/Υ. Μέρος2

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

Ε Ι Α Γ Ω Γ Η Σ Ο Ν Π Ρ Ο Γ Ρ Α Μ Μ Α Σ Ι Μ Ο Κ Ε Υ Α Λ Α Ι Ο 6. Σο πρόγραμμα γράφεται σε κάποια γλώσσα προγραμματισμού.

Λογισµικό (Software SW) Γλώσσες

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

4. Συντακτικό μιας γλώσσας είναι το σύνολο των κανόνων που ορίζει τις μορφές με τις οποίες μια λέξη είναι αποδεκτή.

for for for for( . */

1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες εντολές (μορφές) της;

Γραφικά υπολογιστών Εργαστήριο 1 Εισαγωγή στην Python

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Γιάννης Σαμωνάκης. 1 ο ΣΧΟΛΕΙΟ ΚΩΔΙΚΑ «Βασικά Θέματα Προγραμματισμού στην Ανάπτυξη Δυναμικών Διαδικτυακών Εφαρμογών» (Part 4 - PHP)

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

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

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

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

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

o AND o IF o SUMPRODUCT

ΜΑΘΗΜΑ: Εργαλεία Ανάπτυξης εφαρμογών internet.

Εισαγωγή στην γλώσσα προγραμματισμού C

ΕΡΩΤΗΣΕΙΣ ΑΞΙΟΛΟΓΗΣΗΣ

Κεφ. 1: Εισαγωγή στην έννοια του Αλγορίθμου και στον Προγραμματισμό. Η έννοια του προβλήματος

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Γλώσσες υψηλού επιπέδου Περιέχουν περισσότερες εντολές για την εκτέλεση πολύπλοκων εργασιών Τα προγράµµατα µεταφράζονται σε γλώσσα µηχανής είτε από το

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

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

Transcript:

ASPA Ανακρέων Μεντής 15 Σεπτεµβρίου 2004 Περιεχόµενα 1 Εισαγωγή 4 2 Ερευνα 6 2.1 Γλώσσα Προγραµµατισµού.................... 7 2.2 Αναλυτές............................. 8 2.2.1 JFlex............................ 8 2.2.2 JavaCC.......................... 8 2.2.3 Antlr............................ 9 2.3 Αναπαράσταση δέντρων..................... 9 2.4 Χειρισµός XML αρχείων..................... 9 2.5 Ελεγχος Εγκυρότητας...................... 10 2.6 Εργαλεία Αυτοµατοποίησης (build tools)............ 10 3 Σχεδιασµός 10 3.1 Είσοδος προγράµµατος...................... 11 3.2 Λεκτική Ανάλυση......................... 12 3.3 Συντακτική Ανάλυση....................... 12 3.4 Μετάφραση............................ 12 3.4.1 Τελεστές.......................... 13 3.4.2 Συναρτήσεις και κλάσεις του χρήστη........... 13 3.4.3 ActiveX.......................... 13 3.4.4 Κανόνες ορατότητας.................... 13 3.5 Παραγωγή κώδικα........................ 14 3.6 Σχηµατική αναπαράσταση της µετάφρασης........... 14 4 Υλοποίηση 15 4.1 Λεκτικοί Αναλυτές........................ 15 4.1.1 Λεκτικός αναλυτής της HTML............... 15 1

4.1.2 Κοινά στοιχεία λεκτικών αναλυτών της JavaScript και VbScript.......................... 15 4.1.3 JavaScript......................... 16 4.1.4 VbScript.......................... 17 4.2 Σύνθεση ϱοής token....................... 18 4.2.1 AspStreamSelector.................... 18 4.3 Συντακτικοί Αναλυτές...................... 20 4.3.1 Συντακτικός αναλυτής της JavaScript.......... 21 4.3.2 Συντακτικός αναλυτής της VbScript........... 30 4.4 οµή αρχείων XML........................ 35 4.5 Μοντελοποίηση Κλάσεων..................... 39 4.5.1 Κατασκευή αναπαραστάσεων των κλάσεων από XML.. 44 4.6 Μεταφραστές........................... 45 4.6.1 Συντακτικές µετατροπές της JavaScript......... 45 4.6.2 Συντακτικές µετατροπές της VbScript.......... 48 4.7 Παραγωγή κώδικα........................ 51 5 Ελεγχος Εγκυρότητας 52 6 Εγχειρίδιο Χρήσης 55 7 Περαιτέρω Ανάπτυξη 56 7.1 Προς υλοποίηση......................... 56 7.2 Πιθανές χρήσεις τµηµάτων του ASPA.............. 57 8 Συµπεράσµατα 58 9 Ευχαριστίες 58 Α ικτυακοί Τόποι 59 2

Περίληψη Το έργο που επιτελεί το ASPA είναι η µετάφραση σελίδων που χρησιµοποιούν την ASP σε ισοδύναµες λειτουργικά σελίδες PHP. Στόχος του ASPA είναι η διευκόλυνση της µετάβασης διαδικτυακών εφαρµογών υλοποιηµένων σε ASP στην ανοιχτού λογισµικού γλώσσα PHP. Η ASP υποστηρίζει πολλές γλώσσες προγραµµατισµού, από τις οποίες το ASPA ερµηνεύει µόνο κώδικα γραµµένο σε Java Script ή VB Script, µετατρέποντάς τον σε PHP. Η PHP εκτελείται σε πληθώρα υπολογιστικών πλατφορµών και λειτουργικών συστηµάτων, δίνοντας περισσότερες επιλογές για το περιβάλλον ανάπτυξης και εκτέλεσης της εφαρµογής. Η PHP, που είναι ταχύτερη από την ASP, αναπτύσσεται και ϐελτιώνεται ϱαγδαία, απαιτεί λιγότερους πόρους και επιπλέον διαθέτει µεγάλο πλήθος ϐιβλιοθηκών, που αυξάνουν την παραγωγικότητα του προγραµµατιστή. 3

1 Εισαγωγή Την τελευταία δεκαετία, η ευρεία εξάπλωση του Internet γέννησε την ανάγκη ανάπτυξης ιστοσελίδων που ϑα παρείχαν δυναµικό περιεχόµενο. Για την επίτευξη του στόχου αυτού προτάθηκε το πρότυπο CGI. Το CGI ορίζει τον τρόπο αλληλεπίδρασης ενός προγράµµατος µε τον εξυπηρετητή του πρωτοκόλλου HTTP (HTTP Server). Το CGI πρόγραµµα µπορεί να υλοποιηθεί σε οποιαδήποτε γλώσσα γνωστή στο σύστηµα όπου ϐρίσκετε ο HTTP Server. Υπάρχει η δυνατότητα υλοποίησης CGI προγραµµάτων σε C/C++ Fortran PERL TCL κέλυφος Unix Python και άλλα Η κάθε γλώσσα από τις παραπάνω και όσες άλλες δεν αναφέραµε χάριν συντοµίας, προσφέρουν πλεονεκτήµατα σε κάποια σηµεία και µειονεκτούν σε άλλα. Ωστόσο υπάρχουν µειονεκτήµατα που απορρέουν από την άµεση χρήση του CGI ανεξάρτητα από την γλώσσα υλοποίησης του προγράµµατος. Το CGI πρόγραµµα ενεργοποιείται από εξωτερικές αιτήσεις προς το σύστηµα. Το ϕαινόµενο είναι ανάλογο µε ένα πρόγραµµα που ο καθένας στον κόσµο µπορεί να το εκτελέσει οποτεδήποτε. Καθίσταται ϕανερό πως πρόκειται για τον εφιάλτη του διαχειριστή συστήµατος. Για να αποφευχθούν δυσάρεστες καταστάσεις, το CGI πρόγραµµα οφείλει να είναι εξαιρετικά ασφαλές. Η ανάπτυξη προγραµµάτων που εκτός από εύρυθµη λειτουργία, επιτυγχάνουν υψηλά επίπεδα ασφάλειας, απαιτεί πολύ χρόνο για την υλοποίηση και εξφαλµάτωση, και µεγάλη εµπειρία. Συνήθως, ο χρόνος ενός έµπειρου προγραµµατιστή κοστίζει πολύ. Αντίθετα, η ASP και PHP παρέχουν ασφαλέστερο περιβάλλον εκτέλεσης για τις σελίδες. Το πρόβληµα της ασφάλειας δεν έχει αντιµετωπιστεί πλήρως, αλλά ο προγραµµατιστής χρειάζεται να µεριµνά για λιγότερα πιθανά σενάρια άλωσης του συστήµατος. 4

Καµία από τις γλώσσες δεν έχει σχεδιαστεί για να αντιµετωπίσει προ- ϐλήµατα ιδιαίτερα στο CGI. Είναι γλώσσες γενικής χρήσης. Συχνά το κείµενο που παράγεται από το CGI περιέχει δυναµικά και στατικά µέ- ϱη. Τα στατικά τµήµατα του κειµένου υπάρχουν ως αλφαριθµητικά στον κώδικα του προγράµµατος. Στην ASP και PHP τα στατικά µέρη µπορούν να τοποθετηθούν εκτός του κώδικα που παράγει τα δυναµικά κοµµάτια, µε αποτέλεσµα ο κώδικας να είναι πιο ευανάγνωστος. εδοµένα που στάλθηκαν στην σελίδα µε τις µεθόδους GET και PO- ST είναι προσβάσιµα στο CGI µέσω µεταβλητών περιβάλλοντος (environment variable) και της προκαθορισµένης εισόδου (standard input) αντίστοιχα. Για την απόκτηση της πληροφορίας που υπάρχει σε αυτά τα δεδοµένα, απαιτείται η συγγραφή ϱουτινών στην γλώσσα του CGI προγράµµατος ή η χρήση επιπλέον ϐιβλιοθηκών. Τόσο η ASP όσο και η PHP προσφέρουν τις παραπάνω πληροφορίες στον προγραµµατιστή, χωρίς επιπλέον κόπο. Πρέπει να τονίσουµε πως η χρήση µεταβλητών περιβάλλοντος για τα δεδοµένα απεσταλµένα µε την µέθοδο GET πα- ϱουσιάζει το ενδεχόµενο κορεσµού των ενταµιευτών (buffer overflow) µε πιθανές σοβαρές συνέπειες για την ασφάλεια. Λόγω των όσων αναφέραµε, η ανάπτυξη εφαρµογών Internet µε άµεση χρήση του CGI αποδεικνύεται δύσκολη, χρονοβόρα και ενίοτε επικίνδυνη. Για τη διευκόλυνση και την αύξηση της παραγωγικότητας στον παραπάνω τοµέα παρουσιάστηκαν νεότερες τεχνολογίες, που ϐασίζονται σε ερµηνευόµενες γλώσσες (Scripting Languages). ύο από αυτές είναι η ASP και η PHP, που είναι αρκετά διαδεδοµένες. Στόχος της παρούσας εφαρµογής είναι η αυτοµατοποίηση της µετατροπής του κώδικα εφαρµογών υλοποιηµένων σε ASP στη γλώσσα ανοιχτού λογισµικού PHP. Επειδή η PHP, είναι, όπως αναφέρθηκε, γλώσσα ανοιχτού λογισµικού, αποκτά πλεονεκτήµατα και µόνο από το γεγονός αυτό. Ο πηγαίος κώδικας της PHP είναι διαθέσιµος, αποκλείοντας την ύπαρξη κρυφών και ανεπιθύµητων χαρακτηριστικών. Η οµάδα των ατόµων ανά την υφήλιο που ασχολούνται µε την ανάπτυξη και ϐελτίωση της PHP είναι πολυπληθής, γεγονός που συντελεί στον άµεσο εντοπισµό λαθών και στη γρήγορη διόρθωσή τους. Επιπλέον, το µέλλον της PHP δεν καθορίζεται από κάποια εταιρία, µε αποτέλεσµα η πορεία της να είναι ανεξάρτητη από εκείνη της εταιρίας. Από µετρήσεις που έχουν πραγµατοποιηθεί, έχει διαπιστωθεί πως η PHP εκτελείται ταχύτερα, απαιτώντας συνάµα λιγότερους πόρους. Επιπρόσθετα, το µεγάλο πλήθος ϐιβλιοθηκών διαθέσιµων στην PHP αυξάνουν την παραγωγικότητα του προγραµµατιστή. Βιβλιοθήκες ϐέβαια είναι διαθέσιµες και στην ASP, σε µορφή ActiveX, όµως οι ϐιβλιοθήκες της PHP είναι στην πλειοψηφία τους προϊόντα ανοιχτού λογισµικού και προσφέρονται δωρεάν. 5

Για τους παραπάνω λόγους, η επιλογή της PHP στην ανάπτυξη web εφαρ- µογών είναι προτιµητέα. Επειδή η ASP είναι αρκετά διαδεδοµένη στον τοµέα της ανάπτυξης web εφαρµογών, όσοι την υιοθέτησαν και αποφασίζουν να µεταβούν σε PHP, καλούνται να µεταφράσουν τις εφαρµογές τους. Η παραπάνω διαδικασία είναι χρονοβόρα και επιρρεπής σε λάθη, γι αυτό το κόστος της µετάβασης, ανάλογα µε το µέγεθος της εφαρµογής, είναι ιδιαίτερα υψηλό. Αυτό αποτελεί ανασταλτικό παράγοντα στην υιοθέτηση της PHP, παρ όλα τα σηµαντικά της πλεονεκτήµατα. Το ASPA αυτοµατοποιεί τη διαδικασία µετάφρασης της εφαρµογής, µειώνοντας κατά πολύ τον απαιτούµενο για τη µετάφραση χρόνο, ενώ συνάµα αποφεύγονται τα λάθη. ίνει λοιπόν τη δυνατότητα να διαπιστώσει κάποιος έµπρακτα τα πλεονεκτήµατα της PHP. Αναµένεται πως η διευκόλυνση που παρέχει η εφαρµογή στη µετάφραση, ϑα άρει τον ανασταλτικό παράγοντα του κόστους, µε αποτέλεσµα την ευρύτερη χρήση της PHP. Αυτό µε τη σειρά του ϑα επιφέρει την ενίσχυση του κινήµατος του ανοιχτού λογισµικού. 2 Ερευνα Η αναγκαιότητα ύπαρξης µεταφραστή από ASP σε PHP έχει αναγνωριστεί και από άλλους µηχανικούς λογισµικού. Υπάρχουν τουλάχιστον δυο άλλες προσπάθειες κατασκευής ενός µεταφραστή. Ο δηµοφιλέστερος µεταφραστής είναι ο asp2php 59. Το πρόγραµµα είναι ανοιχτού λογισµικού και διανέµετε υπό την άδεια GPL. Το asp2php υποστη- ϱίζει µόνο την VbScript ενώ η υποστήριξη JavaScript ϐρίσκετε στα πρώτα της ϐήµατα. Η στρατηγική µετάφρασης που ακολουθεί το asp2php περιορίζει σηµαντικά την αποτελεσµατικότητά του. Η έλλειψη υποστήριξης της JavaScript αποκλείει την αξιοποίηση του προγράµµατος για µετάφραση σελίδων που κάνουν χρήση της παραπάνω γλώσσας. Επιπλέον, το asp2php υποστηρίζει λίγα µόνα ActiveX. Εάν µία σελίδα αναφέρετε σε ιδιότητες ή µεθόδους ενός ActiveX που δεν υποστηρίζει το asp2php τότε η µοναδική επιλογή που αποµένει είναι η συγγραφή µεθόδων σε C και η επαναµεταγλώττιση του προγράµµατος. Το πρόγραµµα δεν επιχει- ϱεί να κατανοήσει τον κώδικα της σελίδας αλλά αντικαθιστά γνωστές µορφές και δοµές κώδικα µε προκαθορισµένες αντίστοιχες δοµές της PHP. Η τεχνική αυτή αποδεικνύεται στην πράξη ανεπαρκής. Ο δεύτερος µεταφραστής 59 είναι υλοποιηµένος σε JavaScript και εκτελείται µέσα στο περιβάλλον που παρέχει ένας ϕυλλοµετρητής (Browser).Το πρόγραµµα χρησιµοποιεί κανονικές εκφράσεις για να αντικαταστήσει τα ονό- µατα των µεταβλητών µε ονόµατα συµβατά µε την PHP. Ουσιαστικά δεν πρόκειται για µεταφραστή αφού το µόνο που κάνει είναι η τυφλή αντικατάσταση 6

ορισµένων χαρακτήρων από άλλους. Η εξέταση των δυο διαθέσιµων προγραµµάτων, συνηγορεί υπέρ της άποψης πως δεν έχει δοθεί ακόµη µία ικανοποιητική λύση στο πρόβληµα του αυτοµατισµού της µετάφρασης της ASP σε PHP. Το ASPA επιχειρεί να δώσει µια ικανοποιητικότερη λύση στο πρόβληµα. Ο παράγοντας που συνέβαλε καθοριστικά στην µικρή επιτυχία των παραπάνω προγραµµάτων είναι η προσέγγιση που ακολούθησαν για την επίλυση του προβλήµατος της µετάφρασης. Επρεπε να ϐρεθεί µία στρατηγική η οποία αποδεδειγµένα έχει πετύχει σε παρόµοια προβλήµατα και εργαλεία που ϑα έκαναν το εγχείρηµα ευκολότερο στην υλοποίηση του. Η δική µας προσέγγιση έπρεπε να παρέχει την δυνατότητα κατανόησης του κώδικα της ASP σελίδας ώστε να είναι εφικτή η αντικατάσταση εκφράσεων της ASP µε ισοδύναµες εκφράσεις της PHP. Επιπλέον, η αρχιτεκτονική του προγράµµατος έπρεπε να είναι ανοιχτή ώστε να διευκολύνεται η περαιτέρω ανάπτυξη και επέκταση των δυνατοτήτων του. Τέλος, επειδή η ASP ϐασίζετε στην χρήση ActiveX ϐιβλιοθηκών ϑα ήταν ϑεµιτό η απαραίτητη γνώση για την µετάφραση των µεθόδων και ιδιοτήτων των ActiveX να µην είναι ενσωµατωµένη στο πρόγραµµα, αλλά να παρέχεται κατά την εκτέλεση του προγράµµατος. Η παραπάνω δυνατότητα ϑα εξασφάλιζε την εύκολη επέκταση των δυνατοτήτων του προγράµµατος, χωρίς να απαιτείται αλλαγή του πηγαίου κώδικα και κατανόηση των εσωτερικών δοµών του. Η αναζήτηση εργαλείων και τεχνολογιών που ϑα ικανοποιούσαν τις παραπάνω απαιτήσεις απέδωσε. Το ASPA σχεδιάστηκε µε πρότυπο την µεθοδολογία ανάπτυξης µεταγλωττιστών, µία τεχνολογία δοκιµασµένη στην πράξη για πολλές δεκαετίες και µε πλούσια τεχνογνωσία. 2.1 Γλώσσα Προγραµµατισµού Η γλώσσα προγραµµατισµού είναι η Java. Η Java επιλέχτηκε για τους πα- ϱακάτω λόγους : Είναι αντικειµενοστραφής γλώσσα. Το πρόγραµµα αποτελείται από µία συλλογή αντικειµένων που αλληλεπιδρούν και συνεργάζονται για την παραγωγή του τελικού αποτελέσµατος. Κάθε αντικείµενο αναλαµβάνει να ϕέρει εις πέρας την επίλυση ενός καλώς καθορισµένου υποπρο- ϐλήµατος. Ο σχεδιασµός του προγράµµατος εν γένει είναι ευκολότερα κατανοητός. Η σωστή λειτουργία κάθε αντικειµένου µπορεί να ελεγχθεί ανεξάρτητα από τα υπόλοιπα αντικείµενα, µε αποτέλεσµα ο έλεγχος της αξιόπιστης λειτουργίας του προγράµµατος να καθίσταται εφικτός και σχετικά εύκολος. 7

Τα προγράµµατα υλοποιηµένα σε Java εκτελούνται σε µια νοητή µηχανή (virtual machine), µε αποτέλεσµα την αποφυγή επικίνδυνων λαθών τα οποία προέρχονται από εσφαλµένες υποθέσεις για την δοµή της µηχανής και υπηρεσιών που προσφέρει το λειτουργικό σύστηµα. Τα προγράµµατα γραµµένα σε Java εκτελούνται σε πολλά λειτουργικά συστήµατα χωρίς να απαιτείται επαναµεταγλώττιση, οπότε δεν αποτρέπεται η χρήση του ASPA λόγω διαφορετικού λειτουργικού συστήµατος. 2.2 Αναλυτές Για τη συγγραφή του λεκτικού αναλυτή εξετάστηκαν τα εργαλεία JFlex, JavaCC και Antlr. Το καθένα από αυτά χρησιµοποιεί µια γλώσσα µε τη ϐοήθεια της οποίας δηµιουργείται ο λεκτικός αναλυτής. Σε αντιδιαστολή µε τη Java, οι γλώσσες των παραπάνω εργαλείων σχεδιάστηκαν µε σκοπό την εύκολη πε- ϱιγραφή λεκτικών αναλυτών, µε αποτέλεσµα την ταχύτερη και ευκολότερη ανάπτυξη του λεκτικού αναλυτή. 2.2.1 JFlex Η οµοιότητα της σύνταξης της γλώσσας του JFlex µε εκείνη του flex, ενός καθιερωµένου εργαλείου για την παραγωγή λεκτικών αναλυτών, αποτελεί σηµαντικό πλεονέκτηµα, διότι δεν ϑα ήταν αναγκαία η εκµάθηση κάποιας νέας σύνταξης άλλου εργαλείου. Επιπλέον, το JFlex έχει πλήρη υποστήριξη Unicode και παράγει γρήγορους αναλυτές. Παρ όλα τα πλεονεκτήµατά του, το JFlex απορρίφθηκε, διότι δεν κατασκευάζει συντακτικούς αναλυτές, µε αποτέλεσµα να απαιτείται η χρήση και άλλων εργαλείων. 2.2.2 JavaCC Σε αντίθεση µε το JFlex, το JavaCC παρέχει τη δυνατότητα παραγωγής λεκτικών, αλλά και συντακτικών αναλυτών. Επιπλέον, µε τη ϐοήθεια επιπρόσθετων εργαλείων, διευκολύνει στο έργο κατασκευής AST δέντρων. Υποστηρίζει πλήρως το Unicode και έχει σύνταξη όµοια µε το EBNF, που είναι ευρέως γνωστή στην τεχνολογία ανάπτυξης µεταγλωττιστών. Οµως απορρίφθηκε, διότι όταν ξεκίνησε η ανάπτυξη του ASPA το JavaCC δεν ήταν εφαρµογή ανοιχτού λογισµικού. Εκτός από αυτό, το JavaCC δεν προσφέρει εργαλεία για την κατασκευή αναλυτών δέντρων AST. 8

2.2.3 Antlr Τελικά, αυτό που επιλέχθηκε είναι το Antlr, λόγω των πλεονεκτηµάτων που συγκεντρώνει. Κατ αρχήν, το Antlr στηρίζει όλα τα στάδια ανάπτυξης των αναλυτών που χρησιµοποιεί το ASPA. Κατασκευάζει λεκτικούς και συντακτικούς αναλυτές, καθώς και αναλυτές δέντρων. Είναι επίσης πρόγραµµα ανοιχτού λογισµικού, το οποίο στηρίζεται από µια µεγάλη κοινότητα χρηστών, που υπήρξε πρόθυµη να απαντήσει σε ερωτήσεις που προέκυπταν κατά την ανάπτυξη του ASPA. Ενα µειονέκτηµα που παρουσιάζει το Antlr είναι το γεγονός πως οι λεκτικοί αναλυτές που παράγει υπολείπονται σε ταχύτητα αυτών που παράγουν τα προαναφερθέντα εργαλεία. Το πρόβληµα αναµένεται να επιλυθεί στην επόµενη έκδοση του Antlr. 2.3 Αναπαράσταση δέντρων Για την περιγραφή των ActiveX ϐιβλιοθηκών, επιλέχθηκε η γλώσσα XML. Τα ActiveX αντικείµενα περιέχουν µεθόδους και ιδιότητες, στην κάθε µια εκ των οποίων αντιστοιχούµε ένα υποδέντρο AST. Αναζητήσαµε ένα τρόπο αποθήκευσης και απεικόνισης της παραπάνω αντιστοιχίας. Η ιδανική απάντηση σε αυτή την απαίτηση ϐρέθηκε στη γλώσσα XML, λόγω της οµοιότητας που παρουσιάζει µε το AST, όσον αφορά τη δενδρική τους δοµή. Επιπρόσθετα, η ευρεία διάδοση της XML εξασφαλίζει την άµεση κατανόηση της περιγραφής των ActiveX και εποµένως την εύκολη τροποποίηση του XML εγγράφου. Τέλος, υπάρχουν έτοιµες ϐιβλιοθήκες που αναλαµβάνουν την αποκωδικοποίηση των XML εγγράφων, οπότε δε χρειάστηκε η ανάπτυξή τους εκ µέρους µας. 2.4 Χειρισµός XML αρχείων Αναζητήσαµε ϐιβλιοθήκες σε Java που µετατρέπουν τα XML αρχεία σε δο- µές δεδοµένων εύκολων στον χειρισµό τους. Από το W3C έχουν οριστεί δύο τρόποι επεξεργασίας XML αρχείων, το DOM και το SAX. Ηταν ϑεµιτό να απο- ϕευχθεί η χρήση ϐιβλιοθηκών που ϐασίζονται στην απευθείας αξιοποίηση των παραπάνω ορισµών, καθώς υπάρχουν ϐιβλιοθήκες που παρέχουν δοµές δεδοµένων ευκολότερες για των χειρισµό της πληροφορίας που αποθηκεύεται στα XML έγγραφα. Εξετάστηκαν οι ϐιβλιοθήκες JDOM και dom4j που λαµ- ϐάνουν υπόψιν ιδιαίτερες ανάγκες της Java και είναι ανοιχτού λογισµικού. Τελικά επιλέχθηκε το dom4j διότι καταναλώνει λιγότερη µνήµη και υποστη- ϱίζει και τα δύο µοντέλο επεξεργασίας που προτείνει το W3C. 9

2.5 Ελεγχος Εγκυρότητας Κατά τη διάρκεια ανάπτυξης του ASPA κάθε τροποποίηση ενείχε τον κίνδυνο πρόκλησης δυσλειτουργίας σε ένα από τα τµήµατά του. Ηταν λοιπόν απαραίτητο να ϐρεθεί µια µέθοδος που ϑα αυτοµατοποιούσε τον έλεγχο της άρτιας λειτουργίας του προγράµµατος. Για τον παραπάνω έλεγχο χρησιµοποιήθηκε το JUnit, µια ϐιβλιοθήκη η οποία παρέχει το περιβάλλον για την υλοποίηση των ελέγχων. Το JUnit, ανοιχτού λογισµικού, είναι ένα από τα αρχικά περιβάλλοντα που παρείχαν υπηρεσίες ελέγχου εγκυρότητας για τη Java. 2.6 Εργαλεία Αυτοµατοποίησης (build tools) Το Ant είναι ένα εργαλείο που αυτοµατοποιεί συχνά εκτελούµενες διαδικασίες, όπως τη µεταγλώττιση του πηγαίου κώδικα, την κατασκευή jar αρχείων, την εκτέλεση του ελέγχου εγκυρότητας κ. α. Εναλλακτικό εργαλείο για την εκτέλεση των παραπάνω εργασιών είναι το make σε Unix συστήµατα. Το πλεονέκτηµα του Ant έγκειται στο ότι χρησιµοποιεί ένα XML αρχείο για την περιγραφή των εργασιών και είναι υλοποιηµένο σε Java, µε αποτέλεσµα οι εργασίες να µπορούν να εκτελεστούν και σε άλλα λειτουργικά συστήµατα. Επιπλέον, το Ant συνεργάζεται άµεσα µε τα υπόλοιπα εργαλεία που αξιοποιεί το ASPA. 3 Σχεδιασµός Το ASPA αξιοποιεί την εµπειρία που έχει αποκοµισθεί στον τοµέα της ανάπτυξης µεταγλωττιστών και χρησιµοποιεί µεθοδολογίες που έχουν εφαρµοστεί µε επιτυχία στο παρελθόν. Με ϐάση τις τεχνολογίες αυτές, η ανάλυση του κώδικα πραγµατοποιείται σε ξεχωριστά επίπεδα. Κάθε επίπεδο ανάλυσης ϕέρει εις πέρας µια συγκεκριµένη εργασία και είναι ανεξάρτητο από τα υπόλοιπα. Αυτό το µοντέλο επεξεργασίας διασφαλίζει την ταχύτερη ανάπτυξη του µεταγλωττιστή και διευκολύνει τη διαδικασία διόρθωσης προγραµµατιστικών λαθών και τη µελλοντική επέκταση της εφαρµογής. Το µοντέλο ανάπτυξης µεταγλωττιστών υπαγορεύει τέσσερα ϐασικά επίπεδα ανάλυσης : Λεκτική Ανάλυση. Σε αυτό το στάδιο ο πηγαίος κώδικας µετατρέπεται σε µια σειρά από απλές δοµές δεδοµένων, που στη διεθνή ϐιβλιογραφία αποκαλούνται tokens. Η λεκτική ανάλυση ϑα εξασφαλίσει ότι ο πηγαίος κώδικας περιέχει λέξεις έγκυρες για τη γλώσσα του µεταγλωττιστή. Συντακτική Ανάλυση. Στο επίπεδο της συντακτικής ανάλυσης ελέγχεται αν η σειρά των tokens που παρήχθησαν στο προηγούµενο στάδιο είναι 10

συντακτικά ορθή. Παράγωγο αυτής της διαδικασίας είναι ένα δέντρο, το οποίο αντανακλά τις συντακτικές δοµές του πηγαίου κώδικα. Μετάφραση. Στο τρίτο στάδιο ανάλυσης γίνεται η µετατροπή του πα- ϱαπάνω δέντρου σε ένα δεύτερο, που υπακούει στη σύνταξη της προς µετατροπή γλώσσας, στην προκειµένη περίπτωση της PHP. Επιπλέον, κατά τη µετατροπή συντελούνται ϐελτιώσεις του κώδικα. Παραγωγή Κώδικα. Στο τέταρτο επίπεδο, το τελικό δέντρο µετατρέπεται σε πηγαίο κώδικα της PHP. Το τελευταίο αυτό στάδιο εξασφαλίζει την εγκυρότητα των ονοµάτων των µεταβλητών, µετονοµάζοντας όσες παρα- ϐιάζουν κανόνες ονοµατοδοσίας της PHP. 3.1 Είσοδος προγράµµατος Η εφαρµογή δέχεται ως είσοδο αρχεία ASP. Κάθε σελίδα ASP περιέχει : Τον καθορισµό της γλώσσας του κώδικα. Η πρώτη εντολή της ASP ορίζει τη γλώσσα του κώδικα που περιέχεται στη σελίδα. Για παράδειγµα, η εντολή <%@Language="VbScript"%> ορίζει ως γλώσσα τη VbScript. Αν παραλείπεται ο καθορισµός της γλώσσας της σελίδας, τότε υπονοείται η προκαθορισµένη γλώσσα. Εντολές που εισάγουν κώδικα από άλλα αρχεία. Για παράδειγµα η εντολή <! #include file="file1.asp" > εισάγει το περιεχόµενο του αρχείου file1.asp Απλό κείµενο(συνήθως είναι κώδικας HTML) Κώδικας σε κάποια ερµηνευόµενη γλώσσα όπως - Java Script - VB Script - Perl - Python - και άλλα Το πρόγραµµα ερµηνεύει µόνο κώδικα γραµµένο σε Java Script ή VB Script 11

3.2 Λεκτική Ανάλυση Λεκτική ανάλυση είναι η διαδικασία αναγνώρισης τµηµάτων του κειµένου εισόδου ως λέξεις της γλώσσας προγραµµατισµού. Παράγωγα αυτής της διαδικασίας είναι τα tokens. Υπάρχουν διάφοροι τύποι token, όπως µεταβλητές, λέξεις κλειδιά, τελεστές κ. α. Ουσιαστικά είναι δοµές δεδοµένων που περιέχουν τις παρακάτω πληροφορίες : Εναν κωδικό αριθµό που καθορίζει τον τύπο του. Το κείµενο που αντιστοιχεί στο token Τη γραµµή και στήλη όπου ϐρέθηκε Αν κάποιο τµήµα του κειµένου δεν αποτελεί λέξη της γλώσσας τότε δεν αναγνωρίζεται, δεν σχηµατίζει token και η διαδικασία τερµατίζεται. 3.3 Συντακτική Ανάλυση Κατά τη συντακτική ανάλυση, η σειρά από tokens που παρήχθησαν ελέγχεται για τη συντακτική της ορθότητα. Τη διαδικασία αυτή υλοποιεί ο Συντακτικός Αναλυτής (Parser). Αν ο Συντακτικός Αναλυτής διαπιστώσει παραβίαση των συντακτικών κανόνων στη σειρά των tokens ενηµερώνει το χρήστη για το σφάλµα και τερµατίζει τη διαδικασία. Από τη συντακτική ανάλυση προκύπτουν δύο παράγωγα. Το πρώτο είναι µια δενδροειδής απεικόνιση του κώδικα. Η δενδροειδής δοµή αποκαλείται στη διεθνή ϐιβλιογραφία Abstract Syntax Tree (AST). Κάθε κόµβος του δένδρου περιέχει ένα token. Το δέντρο δεν αποτελεί αντιγραφή του αρχικού συνόλου των tokens διότι ορισµένοι κόµβοι ϕέρουν token το οποίο δεν προήλθε από το πηγαίο κώδικα, ενώ ορισµένα από τα αρχικά tokens αποβάλλονται διότι η πληροφορία που περιέχουν αντανακλάται στη δοµή του δέντρου. Το δεύτερο παράγωγο της συντακτικής ανάλυσης είναι πληροφορίες σχετικές µε τύπους µεταβλητών, κλάσεις και µεθόδους. Οι πληροφορίες αυτές ϑα χρησιµοποιηθούν στο επόµενο στάδιο ανάλυσης. 3.4 Μετάφραση Στο στάδιο της µετάφρασης κάθε συντακτική δοµή της JavaScript και VBScript µετατρέπεται στην αντίστοιχη δοµή της PHP. ιακρίνουµε τρεις συντακτικές δοµές προς µετάφραση, η καθεµιά από τις οποίες έχει διαφορετική αντιµετώπιση : 12

Εκφράσεις, τελεστές και εντολές. Συναρτήσεις και κλάσεις που ορίζονται στον κώδικα της σελίδας από το χρήστη. Συναρτήσεις και κλάσεις τις οποίες παρέχουν οι επιµέρους γλώσσες της ASP (VBScript, JavaScript), καθώς και µέθοδοι και ιδιότητες που παρέχονται από ActiveX ϐιβλιοθήκες. 3.4.1 Τελεστές Οσον αφορά τους τελεστές, διακρίνουµε δύο περιπτώσεις : Τελεστές της JavaScript ή VBScript που δεν έχουν αντίστοιχο στην PHP. Στην περίπτωση αυτή, οι τελεστές αντικαθιστώνται από ισοδύναµες εκφράσεις της PHP. Τελεστές που έχουν αντίστοιχο στην PHP, αλλά ο αντίστοιχος τελεστής της PHP διαφέρει ανάλογα µε τα συµφραζόµενα. Για παράδειγµα, ο τελεστής άθροισης της JavaScript άλλοτε αντιστοιχεί στον τελεστή άθροισης της PHP και άλλοτε στον τελεστή συνένωσης αλφαριθµητικών. 3.4.2 Συναρτήσεις και κλάσεις του χρήστη Οι συναρτήσεις και οι κλάσεις που ορίζονται στον κώδικα της ASP µετατρέπονται σε αντίστοιχες συναρτήσεις και κλάσεις της PHP. Οι συναρτήσεις (functions) υλοποιηµένες σε JavaScript ή VBScript ενδέχεται να µην επιστρέψουν τιµή. Σε αυτή την περίπτωση, µετά τη µετάφραση η αντίστοιχη συνάρτηση ϑα επιστρέψει την τιµή null. 3.4.3 ActiveX Για τη µετάφραση των κλάσεων, µεθόδων και ιδιοτήτων που παρέχει η ASP ή οι ActiveX ϐιβλιοθήκες χρησιµοποιούνται αρχεία XML, τα οποία ορίζουν τις αντίστοιχες µεθόδους της PHP. Τα XML αρχεία περιγράφουν το σύνολο των παραµέτρων της εκάστοτε µεθόδου και τον τύπο των επιστρεφόµενων τιµών, πληροφορία ουσιώδη για την επιλογή της καταλληλότερης µεθόδου. 3.4.4 Κανόνες ορατότητας Τέλος πρέπει να τονιστεί πως το ASPA σέβεται τους κανόνες ορατότητας (scope) των µεταβλητών, των µεθόδων και των κλάσεων της JavaScript και VBScript. Κατανοεί δηλαδή πότε µια µεταβλητή, µέθοδος ή κλάση είναι προσπελάσιµη 13

σε κάποιο συγκεκριµένο σηµείο του κώδικα. Στην περίπτωση µη έγκυρης προσπέλασης, το ASPA ενηµερώνει το χρήστη για το λάθος. 3.5 Παραγωγή κώδικα Σε αυτό το στάδιο πραγµατοποιείται η παραγωγή του κώδικα από το τελικό δέντρο που κατασκευάστηκε στο προηγούµενο επίπεδο. Λαµβάνοντας υπόψιν πως ο παραγόµενος κώδικας ενδέχεται να υποστεί αλλαγές, ήταν αναγκαίο να είναι ευανάγνωστος. Για το λόγο αυτό το παρόν στάδιο µεριµνά για τη σωστή µορφή και στοίχιση του κώδικα. Τα ονόµατα των µεταβλητών, µεθόδων και κλάσεων δεν αλλάζουν κατά την παραγωγή κώδικα, εκτός και αν παραβιάζεται κανόνας ονοµατοδοσίας της PHP. 3.6 Σχηµατική αναπαράσταση της µετάφρασης <% Response.write "Hello World" %> Lexer Multyplexing Lexer Parser XML <% Response DOT Write Hello World %> SubCall TreeParser DOT ARGLIST_VALUES Code Generator Response Write Hello World print <?php print("hello World");?> ARGLIST_VALUES Hello World 14

4 Υλοποίηση 4.1 Λεκτικοί Αναλυτές Το ASPA αξιοποιεί τρεις λεκτικούς αναλυτές για την µετατροπή του πηγαίου κώδικα µιας σελίδας ASP σε tokens. Καθένας από τους λεκτικούς αναλυτές αναλαµβάνει ένα τµήµα του πηγαίου κώδικα, όταν είναι υλοποιηµένο στην γλώσσα που αναγνωρίζει. 4.1.1 Λεκτικός αναλυτής της HTML Ο λεκτικός αναλυτής µετατρέπει το κείµενο που παρεµβάλλεται µεταξύ δύο τµηµάτων κώδικα σε JavaScript ή VbScript σε tokens. Το είδος του κειµένου γενικά δεν ενδιαφέρει την ASP, εκτός από κάποιες εξαιρέσεις. Κάποιες δοµές στο κείµενο σηµαδεύουν την αρχή του κώδικα. Ο λεκτικός αναλυτής πρέπει να µπορεί να αναγνωρίσει τις δοµές αυτές, ώστε να σταµατήσει την περαιτέρω ανάλυση του κειµένου. Οι δοµές που αναγνωρίζει ο αναλυτής είναι : <% σηµαδεύει την αρχή του κώδικα της ASP. Ο αναλυτής σταµατά την ανάλυση του κειµένου που ακολουθεί. <script language="lang" runat="server"> Ο κώδικας που ακολουθεί είναι στην γλώσσα που καθορίζεται από την τιµή της ιδιότητας language. Εάν η ιδιότητα runat δεν υπάρχει ή δεν έχει την τιµή Server, τότε ότι ακολουθεί ϑεωρείται απλό κείµενο και ο λεκτικός αναλυτής εξακολουθεί την ανάλυση του κειµένου. Πρέπει να επισηµάνουµε πως η παραπάνω δοµή δεν σηµαίνει πως το κείµενο είναι κώδικας HTML. Καθίσταται ϕανερό ωστόσο πως ο αναλυτής πρέπει να κατανοεί κώδικα HTML ώστε να µπορεί να διακρίνει πότε ξεκινά κώδικας της ASP και να σταµατήσει την περαιτέρω ανάλυση του κειµένου. <%@language="lang"%> ορίζει την γλώσσα της σελίδας. απλό κείµενο που µπορεί να είναι HTML, XML ή οτιδήποτε άλλο. 4.1.2 Κοινά στοιχεία λεκτικών αναλυτών της JavaScript και VbScript Το Antlr προσφέρει έναν εύκολο τρόπο ορισµού λέξεων κλειδιών. υστυχώς ο µηχανισµός αυτός δεν µπορεί να αξιοποιηθεί λόγω της ύπαρξης των ActiveX. Ενα ActiveX µπορεί να έχει µεθόδους ή ιδιότητες µε όνοµα ίδιο µε κάποια λέξη κλειδί της JavaScript ή VbScript. Για παράδειγµα οι εκφράσεις activex.dim και activex.var είναι σωστές εάν υποθέσουµε πως το activex 15

αναφέρετε σε κάποιο ActiveX αντικείµενο. Το πρόβληµα είναι πως η λέξη dim έχει ειδική σηµασία για την VbScript ενώ η var για την JavaScript. Εάν αξιοποιούσαµε τον µηχανισµό του Antlr για την αναγνώριση των λέξεων κλειδιών, τότε οι αντίστοιχοι αναλυτές ϑα ερµήνευαν λανθασµένα τις εκφράσεις που αναφέραµε. Το πρόβληµα επιλύεται εάν υιοθετήσουµε την παρακάτω στρατηγική. Οι λέξεις που έπονται της τελείας, ϑεωρούνται πάντα ως ιδιότητες κλάσεων, και δεν εξετάζετε εάν συµπίπτουν µε κάποια δεσµευµένη λέξη της γλώσσας που αναγνωρίζει ο αναλυτής. Οι δεσµευµένες λέξεις αποθηκεύονται σε µία δοµή πίνακα (HashTable) όπου το κλειδί είναι η δεσµευµένη λέξη, και η τιµή που αντιστοιχεί στο κλειδί είναι ένας αριθµός που χαρακτηρίζει το token της δεσµευµένης λέξης. Οταν οι λεκτικοί αναλυτές αναγνωρίσουν µία λέξη που δεν έπεται της τελείας, τότε εξετάζουν εάν η λέξη υπάρχει στον πίνακα των δεσµευµένων λέξεων. Εάν υπάρχει, οι λεκτικοί αναλυτές παράγουν ένα token µε τύπο τον αριθµό που αντιστοιχεί στο κλειδί στον πίνακα, και κείµενο την λέξη που αναγνωρίστηκε. Οι χαρακτήρες που δεν έχουν κάποια αξία για τα επόµενα στάδια ανάλυσης όπως το κενό (space) και tab, απορρίπτονται. Αν και τα σχόλια ορίζονται διαφορετικά σε κάθε γλώσσα, και οι δύο λεκτικοί αναλυτές τα απορρίπτουν µόλις τα αναγνωρίσουν. Θα ήταν ϑεµιτό τα σχόλια να διατηρούνται, αποβάλλονται όµως για να διευκολυνθεί το έργο στα ανώτερα επίπεδα ανάλυσης. 4.1.3 JavaScript Ο λεκτικός αναλυτής της JavaScript αναγνωρίζει τµήµατα της ASP σελίδας γραµµένα σε JavaScript. Αναγνωρίζει τελεστές, λέξεις κλειδιά, και άλλους χαρακτήρες µε ειδική σηµασία όπως {, ( και άλλους. Σε πολλές γλώσσες υπάρχει ένας ειδικός χαρακτήρας που χρησιµοποιείται για να σηµαδεύεται το σηµείο όπου τελειώνει µια δήλωση (statement). Στην JavaScript υπάρχει επίσης ο χαρακτήρας αυτός, και είναι το. Ωστόσο, είναι επιτρεπτό ο χαρακτήρας να παραλειφθεί και τότε το τέλος της δήλωσης συµπίπτει µε το τέλος της γραµµής. Συνάµα, κενές γραµµές µπορούν να παρεµβάλλονται στο σώµα µίας δήλωσης, αλλά τότε υποχρεωτικά πρέπει να χρησιµοποιηθεί ο ειδικός χαρακτήρας τερµατισµού δήλωσης. Είναι ϕανερό πως ο χαρακτήρας τερµατισµού γραµµής, γενικά πρέπει να αποβάλλεται, αλλά σε ειδικές περιπτώσεις είναι χρήσιµο να διατηρηθεί για τα επόµενα στάδια ανάλυσης. Ο λεκτικός αναλυτής, για να διευκολύνει το έργο τον ανώτερων σταδίων επεξεργασίας, κατασκευάζει το ίδιο τύπο token όταν αναγνωρίσει τον χα- ϱακτήρα τερµατισµού δηλώσεων και τον χαρακτήρα τερµατισµού γραµµής. 16

Επιπλέον, για να αποφευχθεί η δηµιουργία token χωρίς συντακτική αξία, οι χαρακτήρες τερµατισµού γραµµής απορρίπτονται, όταν είναι ϐέβαιον πως είναι πλεονάζοντες χαρακτήρες δίχως αξία για την συντακτική ανάλυση. Λόγω της εξαιρετικά µυωπικής γνώσης που έχουν οι λεκτικοί αναλυτές, η αποβολή όλων των πλεοναζόντων κενών γραµµών δεν είναι εφικτή. Ορισµένα token χωρίς συντακτική αξία διατηρούνται, οπότε είναι έργο της συντακτικής ανάλυσης να αποβάλει αυτά τα token. 4.1.4 VbScript Ο λεκτικός αναλυτής της VBScript, όπως και εκείνος της JavaScript, αναγνωρίζει τελεστές, λέξεις κλειδιά, και άλλους χαρακτήρες µε ειδική σηµασία όπως _, ( και άλλους. Σε αντίθεση µε την JavaScript, στην VBScript το τέλος της γραµµής έχει πάντα συντακτική αξία, και τερµατίζει µία δήλωση. Σε αυτόν τον κανόνα υπάρχει µονάχα µία εξαίρεση. Μία δήλωση µπορεί να συνεχίζεται στην επό- µενη γραµµή εφ όσον ο τελευταίος χαρακτήρας (αγνοώντας τα κενά ή τα tab) είναι το _, οπότε το τέλος γραµµής αποβάλλεται. Μία άλλη σηµαντική διαφορά ανάµεσα στις δύο γλώσσες, είναι το ότι στην JavaScript έχει σηµασία εάν οι λέξης κλειδιά και τα αναγνωριστικά (identifiers) είναι µε πεζά γράµµατα ή µε κεφαλαία, ενώ για την VBScript δεν έχει σηµασία. Για την διευκόλυνση του συντακτικού αναλυτή, ο λεκτικός αναλυτής αναλαµβάνει να παρουσιάσει τα αναγνωριστικά πάντα µε τον ίδιο τρόπο γραφής, σαν να επρόκειτο για γλώσσα όπου υπάρχει η διαφοροποίηση µεταξύ πεζών και κεφαλαίων. Επιπλέον, στην PHP όπως και στην JavaScript, τα αναγνωριστικά διαφοροποιούνται εάν περιέχουν µικρά ή κεφαλαία. Η µεταβλητή myvar είναι διαφορετική από την µεταβλητή myvar. Επιβάλλεται η γραφή των µεταβλητών της VBScript πάντα µε τον ίδιο τρόπο, διότι διαφορετικά η µετάφραση ϑα αποτύγχανε. Ενας τρόπος για να επιτευχθεί ο παραπάνω στόχος ϑα ήταν η µετατροπή των αναγνωριστικών σε λέξεις που περιέχουν µόνο πεζά ή µόνο κεφαλαία γράµµατα. Το πρόβληµα µε την επιλογή των κεφαλών γραµµάτων είναι ότι κατά σύµβαση, συνηθίζεται να γράφονται έτσι οι σταθερές (constants) που περιέχει το πρόγραµµα. Επίσης, από πολλούς ϑεωρείται αντιαισθητικό να γράφονται οι µεταβλητές µε κεφαλαία. Υπάρχει άλλο ένα πρόβληµα κοινό και για τα κεφαλαία και για τα πεζά. Συχνά οι µεταβλητές περιέχουν δύο ή παραπάνω λέξεις στο όνοµά τους, όπου κάθε νέα λέξη διαφοροποιείται από την προηγούµενη έχοντας το πρώτο της γράµµα κεφαλαίο (για παράδειγµα myid). Αν αλλάζαµε το όνοµα της µεταβλητής σε myid ή MYID, τότε οι λέξεις δεν ξεχωρίζουν πια. Τέλος, ένα πρόγραµµα όπου τα ονόµατα των µεταβλητών έχουν αλλάξει, ϑα ϕαινόταν ξένο στον προγραµµατιστή που το έγραψε. 17

Για να αποφύγουµε τα προβλήµατα που αναφέραµε παραπάνω, ακολου- ϑήσαµε έναν άλλον τρόπο. Ολα τα ονόµατα των µεταβλητών που αναγνωρίζει ο λεκτικός αναλυτής, αποθηκεύονται σε µία λίστα. Κάθε ϕορά που αναγνω- ϱίζεται ένα άλλο αναγνωριστικό, ο λεκτικός αναλυτής αναζητά στην λίστα, εάν υπάρχει κάποιο αναγνωριστικό µε το ίδιο όνοµα, χωρίς να λαµβάνετε υπόψιν η διαφορά κεφαλών και πεζών. Εάν το ϐρει, τότε εξοµοιώνει το όνοµα του αναγνωριστικού που ϐρήκε µε αυτό της λίστας, διαφορετικά προσθέτει το αναγνωριστικό στην λίστα. Ας δώσουµε ένα παράδειγµα : myid = 20 myid = 30 MYID = 40 anothervar = 10 Αν εξετάζαµε την έξοδο του λεκτικού αναλυτή, ϑα είχαµε την εντύπωση πως ο κώδικας που αναλύθηκε είναι myid = 20 myid = 30 myid = 40 anothervar = 10 Η λίστα που διατηρεί ο αναλυτής περιέχει τα στοιχεία myid και anothervar. 4.2 Σύνθεση ϱοής token Οπως έχουµε ήδη αναφέρει, οι σελίδες ASP ενδέχεται να περιέχουν απλό κείµενο, κώδικα JavaScript και VBScript. Κάθε τµήµα της σελίδας, πρέπει να αναλυθεί από τον κατάλληλο λεκτικό αναλυτή, και απαιτείται ένας µηχανισµός που ϑα αποφασίζει ποιος λεκτικός αναλυτής ϑα ενεργοποιείται κάθε ϕορά που ένα τµήµα σε διαφορετική γλώσσα από το προηγούµενο ξεκινά. Κάθε λεκτικός αναλυτής παράγει µία ϱοή από token. Οι επιµέρους ϱοές token πρέπει να συντµηθούν σε µία και µόνο ϱοή, ώστε να αναλυθεί από τους συντακτικούς αναλυτές. 4.2.1 AspStreamSelector Το AspStreamSelector είναι µία κλάση που συνθέτει τις ϱοές από token και ενεργοποιεί τους λεκτικούς αναλυτές κατά το δοκούν. Ο πρώτος λεκτικός αναλυτής που ενεργοποιείται είναι ο HtmlLexer. Εάν το αρχείο προς ανάλυση είναι αυτόνοµο, δεν αναλύεται δηλαδή επειδή απαιτείται για την ανάλυση κάποιου άλλου αρχείου, γίνεται προσπάθεια προσδιορισµού της γλώσσας της σελίδας. Να υπενθυµίσουµε πως η γλώσσα της σελίδας καθορίζεται από την εντολή <%@Language="lang"%> όπου lang είναι η γλώσσα. Ο λόγος που 18

το AspStreamSelector δεν επιχειρεί να προσδιορίσει την γλώσσα για αρχεία ϐοηθητικά του κυρίως αρχείου, είναι επειδή τα αρχεία που συµπεριλαµβάνονται από κάποιο άλλο, οφείλουν να είναι στην ίδια γλώσσα µε εκείνο που τα συµπεριέλαβε. Τα token που παράγει ο λεκτικός αναλυτής της HTML διακρίνονται σε δύο κατηγορίες, τα token που έχουν συντακτική αξία και εκείνα που χρησιµοποιεί το AspStreamSelector για να αποφασίσει ποιος ϑα είναι ο επόµενος λεκτικός αναλυτής που ϑα αναλάβει την επεξεργασία του εναποµείναντος κειµένου. Στην πρώτη κατηγορία ανήκουν τα παρακάτω token: HTML περιέχει το στατικό κείµενο που προηγείται, έπεται ή παρεµβάλλεται στον κώδικα. Οταν ο HtmlLexer παρέχει περισσότερα από ένα token αυτού του τύπου στη σειρά, τότε τα token συµπτύσσονται σε ένα του οποίου το κείµενο είναι η συνάθροιση των κειµένων των token που ελήφθησαν. Στην περίπτωση που δοθεί ένα µόνο token και το κείµενο περιέχει µόνο κενούς χαρακτήρες ή έναν χαρακτήρα αλλαγής γραµµής, τότε το token απορρίπτεται. INCLUDE δείχνει σε ένα αρχείο που απαιτείται για την ανάλυση του τρέχοντος αρχείου. Για να µπορέσουν οι συντακτικοί αναλυτές της VBScript και JavaScript να χρησιµοποιήσουν τα token του HtmlLexer, ο κωδικός αριθµός του token πρέπει να αλλάξει στον αντίστοιχο token που αναγνωρίζει ο αναλυτής. Ο κωδικός αριθµός για το token HTML για παράδειγµα, είναι 56 στην JavaScript και 81 στην VBScript. Εάν το token δεν έχει το σωστό κωδικό για το συντακτικό αναλυτή που ϑα το επεξεργαστεί, η συντακτική ανάλυση ϑα αποτύχει τελείως ή ϑα είναι εσφαλµένη. Τα token της δεύτερης κατηγορίες, όπως αναφέρθηκε, εξυπηρετούν στην διαχείρισή της σειράς µε την οποία ενεργοποιούνται οι λεκτικοί αναλυτές. Το AspStreamSelector, αφού λάβει αποφάσεις ϐασιζόµενος σε αυτά τα token, τα απορρίπτει διότι δεν έχουν συντακτική αξία. Μία άλλη λειτουργία που εκτελεί το AspStreamSelector, είναι η εισαγωγή εικονικών token, token δηλαδή που δεν προήλθαν από κανέναν λεκτικό αναλυτή. Η εισαγωγή τους επιβάλλεται από ανάγκες της συντακτικής ανάλυσης. Καθένας από τους δύο συντακτικούς αναλυτές, αναµένει ότι το τελευταίο token που ϑα λάβει ϑα είναι το EOF που σηµαδεύει το τέλος εισόδου. Από την άλλη, όταν οι δύο γλώσσες εναλλάσσονται στο ίδιο αρχείο εισόδου, είναι προφανές πως η είσοδος που προορίζεται για τον έναν από τους αναλυτές, ϑα τελειώσει στο σηµείο όπου εναλλάσσονται οι γλώσσες, ενώ αντίθετα το περιεχόµενο του αρχείου δεν ϑα έχει τελειώσει. Για να λύσει το πρόβληµα, το 19

AspStreamSelector εισάγει ένα εικονικό token του τύπου EOF, δίνοντας την ψευδαίσθηση του τέλους εισόδου στον συντακτικό αναλυτή. Ενα άλλο παράδειγµα είναι το token EQ_HTML. Το token κατασκευά- Ϲεται κάθε ϕορά που στο αρχείο εισόδου υπάρχει η έκφραση <%=, που ση- µαίνει ότι η έκφραση που έπεται ϑα πρέπει να σταλεί στον επισκέπτη της σελίδας ως συµβολοσειρά. Είναι ουσιαστικά συντοµογραφία της έκφρασης Response.write(someExpr) που επιτελεί τον ίδιο σκοπό. Το token EQ_HTML προκύπτει από την σύνθεση δύο token, του ASP_START µε κείµενο <% που παράγεται από το HtmlLexer, και του token που συµβολίζει τον τελεστή ανά- ϑεσης τιµής ή ισότητας (ανάλογα µε την γλώσσα), που παράγεται είτε από το JsLexer ή από το VbsLexer, ανάλογα µε το ποιος από τους δύο λεκτικούς αναλυτές είναι ενεργός. Τα δύο token, ASP_START και τελεστής ισότητας, αντικαθιστώνται µε το EQ_HTML. Εάν δεν λάµβανε χώρα η αντικατάσταση, οι γλώσσες που ϑα αναγνώριζαν οι συντακτικοί αναλυτές JavaScript και VbScript ϑα ήταν διφορούµενες, οπότε δεν ϑα µπορούσε να γίνει συντακτική ανάλυση σε αυτές. Επιπρόσθετα, ο τελεστής <%= δεν είναι στην πραγµατικότητα τελεστής των δύο γλωσσών, αλλά ένα τέχνασµα για την διευκόλυνση του προγραµµατιστή. 4.3 Συντακτικοί Αναλυτές Οι συντακτικοί αναλυτές της JavaScript και VBScript µετατρέπουν την ϱοή από token σε AST δέντρο. Κάθε συντακτικός αναλυτής αποτελείται από ένα σύνολο κανόνων που ορίζουν την σειρά των token που αναγνωρίζει ο κανόνας. Ορισµένα token µπορεί να είναι προαιρετικά, να επαναλαµβάνονται πολλές ϕορές ή να απαιτείται η ύπαρξη τους για να επιτύχει η αναγνώριση της σειράς ως έγκυρη συντακτική δοµή της γλώσσας. Επιπλέον, ένας κανόνας µπορεί να ϐασίζεται σε άλλους κανόνες για κάποιο τµήµα της αναγνώρισης που µε την σειρά τους ϐασίζονται σε άλλους κανόνες και ούτω καθεξής. Ενα ϐασικό έργο για την επιτυχή αναγνώριση της σειράς των token είναι η δήλωση των κανόνων που αναγνωρίζουν τις εκφράσεις της κάθε γλώσσας. Οι εκφράσεις είναι εξ ορισµού αναδροµικές και έχουν προκαθορισµένους κανόνες προτεραιοτήτων. Η αναδροµικότητα και οι κανόνες προτεραιοτήτων κάνουν δύσκολη την αναγνώριση των εκφράσεων, όµως αφού υλοποιηθούν οι παραπάνω κανόνες, το έργο που αποµένει για να ολοκληρωθεί ο συντακτικός αναλυτής είναι συγκριτικά µικρό. Οι εκφράσεις αποτελούνται από αριθµούς, αλφαριθµητικά και αναγνωριστικά που συνδέονται µεταξύ τους µε τελεστές. Οι τελεστές δεν είναι ισότιµοι διότι υπάρχουν κανόνες προτεραιοτήτων που καθορίζουν την εκτίµηση της τιµής µιας έκφρασης. Οι κανόνες προτεραιότητας µπορούν να παρακαµφθούν µε την κατάλληλη χρήση οµαδοποιήσεων των εκφράσεων µέσω παρενθέσεων. 20

Παρακάτω ϑα δείξουµε αναλυτικά τις δοµές που αναγνωρίζουν οι συντακτικοί αναλυτές της JavaScript και VbScript και την µορφή των δέντρων που κατασκευάζουν. Επίσης ϑα αναφερθούµε σε δοµές δεδοµένων που χρησιµοποιούν οι συντακτικοί αναλυτές για την αποθήκευση επιπλέον πληροφοριών που αξιοποιούνται από τους µεταφραστές κατά την διαδικασία µετατροπής των AST δέντρων σε δέντρα που αναπαριστούν PHP κώδικα. Οταν ϑα αναφε- ϱόµαστε σε δοµές δέντρων ϑα χρησιµοποιήσουµε την σηµασιολογία της Lisp για την περιγραφή. Για παράδειγµα η έκφραση (a (b c)) σηµαίνει πως το δέντρο έχει για ϱίζα το κόµβο a, του οποίου παιδί είναι ο κόµβος b που έχει για παιδί τον κόµβο c. 4.3.1 Συντακτικός αναλυτής της JavaScript Οπως αναφέραµε παραπάνω, η υλοποίηση των κανόνων που αναγνωρίζουν τις εκφράσεις αποτελούν ϐασικό µέρος του συντακτικού αναλυτή, οπότε ϑα ξεκινήσουµε µε την περιγραφή αυτών των κανόνων. Οι κανόνες είναι αναδροµικοί και καλούνται µε τέτοια σειρά ώστε να ακολουθούν τους κανόνες προτεραιότητας που ορίζει η γλώσσα για τους τελεστές. Κάθε κανόνας αναγνωρίζει έναν τελεστή και τις υποεκφράσεις που συνοδεύουν τον τελεστή. Αρχικά καλείται ο κανόνας που αναγνωρίζει τον τελεστή µε την µικρότερη προτεραιότητα. Ο κανόνας καλεί πρώτα τον αµέσως ισχυρότερο κανόνα από την άποψη της προτεραιότητας και έπειτα επιχειρεί να αναγνωρίσει τον δικό του τελεστή. Με αυτό τον τρόπο εξασφαλίζεται ότι οι κανόνες προτεραιοτήτων ακολουθούνται αφού οι κανόνες που αναγνωρίζουν τελεστές µε µεγαλύτερη προτεραιότητα έχουν πρώτοι την ευκαιρία να αναγνωρίσουν την έκφραση. Ο πρώτος κανόνας που καλείτε ονοµάζεται expression. Ο κανόνας καλεί τον ασθενέστερο κανόνα που αναγνωρίζει την ανάθεση τιµής. Ο κανόνας υπάρχει διότι µόλις η έκφραση αναγνωρισθεί από τους άλλους κανόνες που καλεί, κατασκευάζει ένα δέντρο του οποίου ϱίζα ϑα είναι πάντα ο κόµβος. Τα δέντρα που προκύπτουν από τις εκφράσεις ϑα έχουν πάντα την δοµή ( expression). Η JavaScript έχει 12 τελεστές ανάθεσης τιµής. Οι τελεστές είναι : = ϑέτει στην έκφραση που ϐρίσκεται αριστερά του τελεστή την τιµή της έκ- ϕρασης που ϐρίσκεται δεξιά. +=, -=, *=, =, %= οι τελεστές ϑέτουν την τιµή της έκφρασης που ϐρίσκεται αριστερά του τελεστή ίση µε το άθροισµα, την διαφορά, το γινόµενο, το πηλίκο ή το υπόλοιπο της διαίρεσης της έκφρασης στα αριστερά και της έκφρασης στα δεξιά αντίστοιχα. 21

<<=, >>=, >>>= ϑέτει νέα τιµή στην έκφραση αφού πρώτα εκτελεστούν πράξεις στα bits της έκφρασης. &=, =, ˆ= ϑέτουν νέα τιµή στην έκφραση στα αριστερά αφού πρώτα εκτελεστούν λογικές πράξεις επί των δύο εκφράσεων. Οι δώδεκα τελεστές έχουν την ίδια προτεραιότητα. Ο κανόνας της ανάθεσης τιµής, καλεί πρώτα τον κανόνα αναγνώρισης λογικών εκφράσεων διότι έχει µεγαλύτερη προτεραιότητα. Επειτα επιχειρεί να αναγνωρίσει έναν από τους δώδεκα τελεστές. Αν κάποιος από τους τελεστές αναγνωρισθεί, τότε ο κανόνας καλεί τον εαυτό του. Εάν δεν αναγνωρισθεί κανένας από τους τελεστές, ο κανόνας έχει ολοκληρώσει το έργο του. Η αναγνώριση των τελεστών είναι προαιρετική διότι ειδάλλως κάθε έκφραση ϑα έπρεπε να είναι έκφραση ανά- ϑεσης τιµής. Εάν η έκφραση προς αναγνώριση δεν είναι έκφραση ανάθεσης τιµής, ο κανόνας που µπορεί να την αναγνωρίσει κάποια στιγµή ϑα κληθεί. Ο αµέσως ισχυρότερος κανόνας είναι εκείνος που αναγνωρίζει εκφράσεις του τύπου boolexpr? expressiona : expressionb. Η έκφραση αποτελείται από τρεις υποεκφράσεις και δύο τελεστές. Η πρώτη έκφραση πρέπει να έχει τιµή αληθή ή ψευδή. Εάν η τιµή της πρώτης έκφρασης είναι αληθής, τότε εκτιµάτε η τιµή της δεύτερης έκφρασης, διαφορετικά εκτιµάτε η τιµή της τρίτης. Ο κανόνας αρχικά καλεί τον κανόνα αναγνώρισης λογικών εκφράσεων µε τον τελεστή διάζευξης (or) και έπειτα επιχειρεί να αναγνωρίσει τους δύο τελεστές και τις υποεκφράσεις τους. Ο κανόνας λογικής διάζευξης καλεί τον κανόνα λογικής σύζευξης (and) και επιχειρεί να αναγνωρίσει τον τελεστή (or). Εάν ο τελεστής αναγνωρισθεί, τότε καλείται και πάλι ο κανόνας λογικής σύζευξης. Η ίδια διαδικασία ακολουθείτε για τους κανόνες λογικής σύζευξης, δυαδικής διάζευξης, αποκλειστικής διάζευξης (xor) και δυαδικής σύζευξης. Ο επόµενος κανόνας αναγνωρίζει τους τελεστές ελέγχου ισότητας και ταυτότητας. Οι τελεστές ελέγχου ισότητας είναι οι ==,!= που εξετάζουν αν οι εκφράσεις εκατέρωθεν των τελεστών είναι ίσες ή αν είναι άνισες αντίστοιχα. Οι τελεστές ελέγχου ταυτότητας εξετάζουν αν δύο αναγνωριστικά αναφέρονται στην ίδια ϑέση µνήµης. Η τακτική που ακολουθεί ο κανόνας δεν διαφέρει από όσους αναφέραµε παραπάνω. Ακολουθεί ο κανόνας που αναγνωρίζει τελεστές σύγκρισης τιµών που είναι οι : < ελέγχει εάν η τιµή της έκφρασης στα αριστερά είναι µικρότερη από εκείνης στα δεξιά του τελεστή. > ελέγχει εάν η τιµή της έκφρασης στα αριστερά είναι µεγαλύτερη από εκείνης στα δεξιά του τελεστή. 22

<= ελέγχει εάν η τιµή της έκφρασης στα αριστερά είναι µικρότερη ή ίση µε εκείνης στα δεξιά του τελεστή. >= ελέγχει εάν η τιµή της έκφρασης στα αριστερά είναι ή ίση µε εκείνης στα δεξιά του τελεστή. instanceof εξετάζει εάν ένα αντικείµενο έχει κατασκευαστεί από κάποια κλάση. Αµέσως µετά, ϐρίσκονται οι τελεστές που εκτελούν πράξεις επί των δυαδικών ψηφίων των µεταβλητών (bit operation). Οι τελεστές παρατίθενται παρακάτω : << προκαλεί ολίσθηση προς τα αριστερά των δυαδικών ψηφίων της τιµής της µεταβλητής >> προκαλεί ολίσθηση προς τα δεξιά. >>>> προκαλεί ολίσθηση προς τα δεξιά ενώ διατηρεί το πρόσηµο της αρχικής τιµής. Μετά τους τελεστές δυαδικών πράξεων, ακολουθούν οι τελεστές άθροισης και αφαίρεσης, και στην συνέχεια οι τελεστές πολλαπλασιασµού, διαίρεσης και ακεραίου υπολοίπου. Παραπάνω παραθέσαµε τους τελεστές που δρουν επί δύο εκφράσεων ή δυαδικούς τελεστές. Παρακάτω ϑα δείξουµε τους µονήρης τελεστές, τελεστές που δρουν επί µίας µόνο έκφρασης, µε την σειρά προτεραιότητας τους. Οι τελεστές είναι : ++ αυξάνει κατά ένα την τιµή της έκφρασης. µειώνει κατά ένα την τιµή της έκφρασης. - το πρόσηµο της έκφρασης είναι αρνητικό. + το πρόσηµο της έκφρασης είναι ϑετικό. αντιστρέφει τα δυαδικά ψηφία της έκφρασης.! είναι ο τελεστής λογικής άρνησης. Εάν η τιµή της έκφρασης είναι αληθής, τότε ϑα γίνει ψευδής και αντιστρόφως. delete διαγράφει την µεταβλητή, και αποδεσµεύει το χώρο που κατείχε στην µνήµη. typeof επιστρέφει το όνοµα του τύπου µίας έκφρασης. 23

new κατασκευάζει ένα αντικείµενο κάποιας κλάσης. Στην ιεραρχία προτεραιοτήτων ακολουθεί ο τελεστής αρχικοποίησης πινάκων. Ας δώσουµε ένα παράδειγµα για να γίνει κατανοητός ο ϱόλος και η συντακτική δοµή του τελεστή. Η έκφραση a = [12, 3, true, "string"] αρχικοποιεί έναν πίνακα που τα στοιχεία του είναι το 12 το 13 το.... Η διαδικασία αναγνώρισης της έκφρασης απαιτεί την αναγνώριση του token [, έπειτα την αναγνώριση µίας σειράς εκφράσεων που διαχωρίζονται από κόµµατα, και τέλος το token ]. Οι εκφράσεις µπορεί να περιέχουν το τελεστή. που σηµατοδοτεί την αίτηση ανάκτησης ενός µέλους µίας κλάσης, όπως για παράδειγµα η έκφραση "string".length που καλεί την ιδιότητα length από την κλάση String. Εχου- µε δύο επιπλέον τελεστές, τον τελεστή πρόσβασης στοιχείου ενός πίνακα (για παράδειγµα a[0]) και τον τελεστή κλήσης µεθόδου (παράδειγµα method(arg)). Τέλος έχουµε τις ϐασικές εκφράσεις που δεν διασπώνται σε επί µέρους τµήµατα από τελεστές. Οι ϐασικές εκφράσεις είναι οι παρακάτω : Ονόµατα µεταβλητών. Αριθµοί Συµβολοσειρές Οι λογικές τιµές true και false Η τιµή null Η κενή τιµή void Η ακαθόριστη τιµή undefined Κανονικές εκφράσεις Η ειδική µεταβλητή this που αναφέρετε στο τρέχον αντικείµενο µίας κλάσης. Τύποι αντικειµένων όπως το Array, Object,... Αυτόνοµες εκφράσεις που περικλείονται σε παρενθέσεις Ανώνυµες συναρτήσεις Εκτός από εκφράσεις, η JavaScript περιέχει και άλλες συντακτικές δοµές που εξυπηρετούν στον έλεγχο ϱοής, σχηµατισµό ϐρόχων και άλλα. Παρακάτω ϑα αναλύσουµε τις συντακτικές δοµές της JavaScript. 24

if/else Η εντολή χρησιµοποιείται για έλεγχο ϱοής. Η δοµή της είναι : if( λογική έκφραση ) εντολές και εκφράσεις else εντολές και εκφράσεις Εάν η λογική έκφραση έχει αληθή τιµή, τότε οι εντολές και εκφράσεις που ακολουθούν εκτελούνται, διαφορετικά εκτελούνται οι εντολές και εκφράσεις της εντολής else. Η εντολή else είναι προαιρετική. Το δέντρο που παράγεται από την εντολή έχει την µορφή : if statements else statements switch Αποτελεί άλλη µία δοµή για τον έλεγχο ϱοής. Η δοµή της είναι : switch ( έκφραση ) case τιµή εντολές default εντολές Η εντολή εξετάζει ποια από τις τιµές των case εντολών ισούται µε την έκφραση και εκτελεί τις εντολές που έπονται της αντίστοιχης case εντολής. Εάν καµία από τις case εντολές δεν έχει τιµή ίση µε την έκφραση, τότε εκτελούνται οι εντολές της default, εφόσον υπάρχει. Το δέντρο που παράγεται από την εντολή έχει την µορφή : 25

switch CASE_GROUP CASE_GROUP case case statements default statements for Η δοµή χρησιµεύει για τον καθορισµό ϐρόχων. Η µορφή της είναι : for ( µεταβλητή όπου αποθηκεύεται το πλήθος των ϐρόχων που έχουν εκτελεστεί συνθήκη που ορίζει πότε ϑα τερµατιστεί ο ϐρόχος έκφραση που αλλάζει την τιµή της µεταβλητής που αποθηκεύει το πλήθος των ϐρόχων) εντολές Κάποια, ή και τα τρία τµήµατα της εντολής for µπορούν να παραλει- ϕθούν. Για παράδειγµα, η εντολή for (;;) είναι συντακτικά σωστή, και ορίζει έναν ατέρµονα ϐρόχο. Το δέντρο που παράγεται από την εντολή έχει την µορφή : 26

for for forinit forcond foriter forinit forcond foriter ELIST ELIST var ELIST Μία άλλη µορφή της δοµής for χρησιµοποιείται για πρόσβαση των ιδιοτήτων ενός αντικειµένου. Η µορφή της εναλλακτικής σύνταξής είναι : for ( µεταβλητή in µεταβλητή όπου έχει αποθηκευτεί ένα αντικείµενο) εντολές. Το δέντρο που παράγεται από την εντολή µε την δεύτερη σύνατξη έχει την µορφή : for in while Είναι άλλη µία εντολή σχηµατισµού ϐρόχων. Η σύνταξη της εντολής είναι : while ( λογική έκφραση ) εντολές do Επίσης ορίζει ϐρόχους. Η σύνταξη είναι : do εντολές while ( λογική έκφραση). Το δέντρο που παράγεται από την εντολή έχει την µορφή : 27

do statement while try/catch/finally Η εντολή δίνει την δυνατότητα να εκτελεστούν άλλες εντολές που ενδέχεται να προκαλέσουν κάποιο σφάλµα κατά την εκτέλεσή τους, και να ληφθούν µέτρα σε µία τέτοια περίπτωση. Η σύνταξη της εντολής είναι : try εντολές catch ( µεταβλητή όπου αποθηκεύονται πληροφορίες για τα αίτια του σφάλµατος) εντολές finally εντολές που εκτελούνται σε κάθε περίπτωση (είτε υπήρξε σφάλ- µα, είτε όχι) Το δέντρο που παράγεται από την εντολή έχει την µορφή : try statement catch finally id statement statement with ιευκολύνει στην πρόσβαση µεθόδων και ιδιοτήτων µίας κλάσης. Οι εντολές που περιέχονται στην with δεν χρειάζεται να αναφέρονται ϱητά στα µέλη της κλάσης (για παράδειγµα somemethod() αντί someobject.somemethod()) παρακάµπτοντας την ανάγκη γραφής του ονόµατος της µεταβλητής που περιέχει το αντικείµενο της κλάσης. Η σύνταξη της εντολής είναι : 28

with ( µεταβλητή που περιέχει ένα αντικείµενο) εντολές Το δέντρο που παράγεται από την εντολή έχει την µορφή : with statement function Μέσω της εντολής, ορίζονται συναρτήσεις του χρήστη. Η σύνταξη της εντολής είναι : function όνοµα συνάρτησης (ονόµατα παραµέτρων) εντολές Το δέντρο που παράγεται από την εντολή έχει την µορφή : function name ELIST statement Τέλος, υπάρχουν και οι εντολές : var include identifier break 29

continue return throw Οι παραπάνω εντολές δεν παρουσιάζουν ενδιαφέρον από συντακτική σκοπιά. 4.3.2 Συντακτικός αναλυτής της VbScript Ο χειρισµός των εκφράσεων της VbScript, δεν διαφέρει από εκείνο της JavaScript. Η VbScript παρουσιάζει µία επιπλέον δυσκολία διότι ο τελεστής ανάθεσης τιµής είναι ο ίδιος µε εκείνο του ελέγχου ισότητας. Χάριν συντοµίας παραλείπουµε την περιγραφή των κανόνων που αναγνωρίζουν τις εκφράσεις. Παρακάτω περιγράφονται οι συντακτικές δοµές της VbScript και η µορφή των δέντρων που κατασκευάζει ο συντακτικός αναλυτής της. On Error Η εντολή παρέχει την δυνατότητα εκτέλεσης τµηµάτων του κώδικα, σε περίπτωση σφάλµατος. Η σύνταξη της εντολής είναι : On Error Resume Next ή On Error GoTo 0. Τα δέντρα που παράγονται σε κάθε περίπτωση ϑα είναι της µορφής : ERROR ERROR RESUME statement ZERO statement Dim/ReDim Οι εντολές δηλώνουν µεταβλητές. Τα δέντρα ϑα έχουν την µορ- ϕή : 30

DIM REDIM IDENTIFIER IDENTIFIER IDENTIFIER IDENTIFIER 2 5 2 5 10 20 Erase Αποµακρύνει αντικείµενα από την µνήµη και αποδεσµεύει το χώρο που καταλάµβαναν. ERASE IDENTIFIER Call Καλεί µία συνάρτηση ή µέθοδο κάποιας κλάσης. Εάν η συνάρτηση επιστρέφει κάποια τιµή, το αποτέλεσµα της συνάρτησης δεν είναι προσπελάσιµο. SUB_CALL DOT IDENTIFIER SUB_CALL ARGLIST_VALUES ARGLIST_VALUES 31