ASPA: A translator from ASP to PHP



Σχετικά έγγραφα
alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

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

HY340, 2009 Α. Σαββίδης Slide 2 / 143. HY340, 2009 Α. Σαββίδης Slide 3 / 143. HY340, 2009 Α. Σαββίδης Slide 4 / 143

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

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

JAVASCRIPT 1. Διδάσκοντες: Π. Αγγελάτος, Δ. Ζήνδρος Επιμέλεια διαφανειών: Π. Αγγελάτος Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

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

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

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

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

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

ASPA JFlex JavaCC Antlr ActiveX... 13

ΕΠΛ 012. JavaScripts

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

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

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

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

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

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Δομή Επιλογής. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

PHP 1. Διδάσκοντες: Π. Αγγελάτος, Δ. Ζήνδρος Επιμέλεια διαφανειών: Δ. Ζήνδρος Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών

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

Φροντιστήριο. Παραγωγή τελικού κώδικα. Παραγωγή τελικού κώδικα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Σχεδίαση Εφαρμογών και Υπηρεσιών Διαδικτύου 7 η Διάλεξη: Σύντομη εισαγωγή στην Java

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

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

4. Επιλογή και Επανάληψη

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

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

Δομημένος Προγραμματισμός

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

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

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

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

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

Βασικά Στοιχεία της Java

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

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

Runtime Checking (1/3) Runtime Checking (2/3) Runtime Checking (3/3) ΗΥ 340 Γλώσσες και Μεταφραστές Φροντιστήριο

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

for for for for( . */

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

PERL. Δήμος Παύλου Δημήτρης Κουζαπάς

Στόχοι και αντικείμενο ενότητας. Προτάσεις επανάληψης. Έλεγχος ροής προγράμματος. #5.. Εντολές Επανάληψης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

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

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

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

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

Εισαγωγή στη Matlab 2 Εισαγωγή στην Αριθμητική Ανάλυση Διδάσκων: Γεώργιος Ακρίβης Βοηθός: Δημήτριος Ζαβαντής

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

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

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

Θέματα Προγραμματισμού Διαδικτύου ~ PHP ~

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

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

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

Βασικάχαρακτηριστικάτηςγλώσσας. Πίνακες, Έλεγχος Ροής και Βρόχοι

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 9 ο

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

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

Shell Scripts: loops / if / test

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ I

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

Βασικά Στοιχεία της Java

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

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

ιαχείριση Πληροφοριών στο ιαδίκτυο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

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

Εισαγωγή στην PHP. ΕΣΔ 232 Διαχείριση Δεδομένων στη Κοινωνία της Πληροφορίας. Περιεχόμενα. Περιεχόμενα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Δομές ελέγχου ροής προγράμματος

Γλώσσα Προγραμματισμού C

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

Θέματα Προγραμματισμού Η/Υ

ΜΕΡΟΣ ΠΡΩΤΟ: Θεωρητική Προσέγγιση...15

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

Διάλεξη 1. Πράξεις Τελεστές Έλεγχος Ροής

5. Επερώτηση XML Εγγράφων: Εισαγωγή στη Γλώσσα XQuery

Transcript:

:Μεταφραστής από ASP σε PHP : A translator from ASP to PHP Ανακρέων Μεντής anakreonmejdi@yahoo.gr http://daemon.di.uoa.gr/daemon/issue10 http://storm.cs.unipi.gr/ anakreon/aspa.html Ιούλιος 2004 1

Λίγα λόγια για την ASP Η ASP δεν είναι γλώσσα. Η ASP είναι µία πλατφόρµα ανάπτυξης Ιντερνετικών εφαρµογών, όπου κάθε γλώσσα χειρίζεται από κάποιο ActiveX. Υποστηρίζει εγγενώς την JavaScript και VbScript Το περιεχόµενο µίας σελίδας ASP αποτελείται από κείµενο ( HTML, XML ή οτιδήποτε άλλο) και κώδικα σε κάποια γλώσσα προγραµµατισµού Ο κώδικας περικλείεται από τα σύµβολα <% και % Η λειτουργικότητα που παρέχει η ASP, δίνεται από ActiveX αντικείµενα

Στόχος του προγράµµατος ιευκόλυνση µετάβασης από ASP σε PHP Να είναι εφικτή η χρήση τµηµάτων του προγράµµατος σε άλλες εργασίες Εύκολη επέκταση του προγράµµατος

Υπάρχοντες Μεταφραστές asp2php (http://asp2php.naken.cc) Πλεονεκτήµατα : Είναι γραµµένο σε C και είναι γρήγορο Υποστηρίζει σε µεγάλο ϐαθµό την VbScript Αναγνωρίζει αρκετές από τις µεθόδους ϐασικών αντικειµένων της ASP όπως το Request και Response Προσφέρει κάποια υποστήριξη για αντικείµενα του ADO

Μειονεκτήµατα : Χρησιµοποιεί κανονικές εκφράσεις και αναγνώριση προτύπων για την µετάφραση Η υποστήριξη της JavaScript ϐρίσκεται στα πρώτα της ϐήµατα Η µετάφραση των µεθόδων και ιδιοτήτων των ActiveX είναι hard coded Η αναγνώριση και µετάφραση άλλων ActiveX απαιτεί επέµβαση στο πηγαίο κώδικα

Βασικές έννοιες Token Είναι µία δοµή δεδοµένων που αποτελείται από έναν αριθµό που συµβολίζει το τύπο του Token και µία συµβολοσειρά. AST Είναι ένα δέντρο όπου κάθε κόµβος αποθηκεύει ένα Token. Lexer έχεται ως είσοδο µία συµβολοσειρά την οποία διασπά σε ϱοή από Token. Parser Η είσοδος είναι η ϱοή από Token και παράγει ένα δέντρο AST. TreeParser έχεται ως είσοδο ένα δέντρο AST. Η έξοδος του TreeParser µπορεί να είναι ένα άλλο δέντρο AST, το οποίο έχει υποστεί κάποιες αλλαγές στην δοµή του.

ActiveX Το αντίστοιχο του ActiveX από τον αντικειµενοστραφή κόσµο, είναι οι κλάσεις. Το ActiveX παρέχει µεταβλητές (Members) και µεθόδους.

Σχεδιασµός Το πρόγραµµα αποτελείται από ανεξάρτητα τµήµατα, δοµηµένων σε επίπεδα. Η έξοδος ενός επιπέδου είναι η είσοδος του εποµένου.

Lexers JsLexer. Μετατρέπει πηγαίο κώδικα της JavaScript σε µία σειρά από Token. VbsLexer. Κάνει ότι ο JsLexer µε την διαφορά ότι ο πηγαίος κώδικας είναι σε VbScript. Επιπλέον, ϕροντίζει τα ονόµατα των µεταβλητών να δοθούν µε τον ίδιο τρόπο γραφής όσων αφορά την συµφωνία πεζών και κεφαλαίων. Για παράδειγµα, οι µεταβλητές myvar, MYVAR και myvar ϑα ονοµάζονται myvar και στις τρεις περιπτώσεις. HtmlLexer Επεξεργάζεται το απλό κείµενο που παρεµβάλλεται του κώδικα. Ο ϱόλος του HtmlLexer είναι να αναγνωρίσει πότε ξεκινά ένα τµήµα κώδικα, ώστε να αναλάβουν οι άλλοι Lexer την περαιτέρω επεξεργασία του.

Parsers JsParser Σχηµατίζει ένα δέντρο AST από τα Token που έλαβε από το JsLexer. Αποθηκεύει πληροφορίες για τους τύπους µεταβλητών, τα ονόµατα των µεθόδων του χρήστη (function), και των ανώνυµων συναρτήσεων. VbsParser Σχηµατίζει το AST της αντίστοιχης γλώσσας, και αποθηκεύει πληροφορίες παρόµοιες µε του JsLexer. Τα δύο αρθρώµατα που περιγράψαµε, δεν αφορούν την µετάφραση, αλλά συλλέγουν πληροφορίες απαραίτητες για την µετάφραση. Προτού περιγράψουµε τις λειτουργίες του τρίτου αρθρώµατος, των TreeParser, είναι αναγκαίο να αναφέρουµε τον ϱόλο της XML στην διαδικασία µετάφρασης.

ActiveX και XML Οι δυσκολίες που εισάγουν τα ActiveX στο εγχείρηµα, είναι οι παρακάτω : Ονόµατα µεταβλητών ή µεθόδων µπορεί να συµπίπτουν µε λέξεις κλειδιά κάποιας γλώσσας. Η µετάφραση µεταβλητής ή µεθόδου του ActiveX απαιτεί γνώση της λειτουργικότητας που παρέχει το εν λόγω αντικείµενο. Η πρώτη δυσκολία αντιµετωπίζεται από τους Lexer της JavaScript και VbScript. Για το δεύτερο πρόβληµα χρειάζεται η XML.

Παρατηρήσεις για ActiveX και XML Οι πληροφορίες που αφορούν το ActiveX είναι ιεραρχικές. Η µέθοδος ανήκει στο ActiveX, οι παράµετροι της µεθόδου ανήκουν στην µέθοδο κ.ο.κ Το ενδιάµεσο προϊόν της µετάφρασης είναι ένα AST που είναι δέντρο. Η δοµή της XML είναι επίσης δέντρο.

Περιγραφή των ActiveX µέσω της XML Το ActiveX έχει ένα όνοµα, και περιέχει ιδιότητες ( Property ) και µεθόδους ( Method ). Το Element της XML που αντιστοιχεί στο ActiveX ονοµάζετε class και έχει την ιδιότητα name. Παιδιά του Element class είναι τα method και property. Κάθε ιδιότητα του ActiveX δίνει την δυνατότητα ανάγνωσης της τιµής του (read), ανάθεσης νέας τιµής (write) ή και τα δύο. Η ιδιότητα έχει όνοµα, και τύπο δεδοµένων όταν υποστηρίζει ανάγνωση τιµής. Οταν υποστηρίζεται η ανάθεση τιµής, η ιδιότητα δέχεται µία µόνο παράµετρο και µπορεί να υπάρχει περιορισµός

στον τύπο της παραµέτρου. Ενδέχεται να είναι η προκαθορισµένη ιδιότητα του ActiveX. Το αντίστοιχο Element της XML ονοµάζεται property και έχει τις παρακάτω ιδιότητες : name Το όνοµα της ιδιότητας. type Ο τύπος της επιστρεφόµενης τιµής από την ανάγνωση της ιδιότητας. Εάν η ιδιότητα δεν υποστηρίζει την ανάγνωση, ο τύπος είναι VOID. default Εχει τιµή true εάν η ιδιότητα είναι η προκαθορισµένη του ActiveX. Μπορεί να υπάρχει το πολύ µία τέτοια ιδιότητα.

Περιγραφή των ActiveX µέσω της XML Το Element property έχει ως παιδιά τα Element read και write που εκφράζουν τις αντίστοιχες λειτουργίες της ιδιότητας του ActiveX. Η µέθοδος ενός ActiveX έχει ένα όνοµα και επιστρεφόµενο τύπο. Το αντίστοιχο Element της XML ονοµάζεται method και επίσης έχει τις ιδιότητες name και type. Τα Element property και method εµπεριέχουν το Element arg για να περιγράψουν τις παραµέτρους που δέχονται. Το arg έχει µία µόνο ιδιότητα, τον τύπο της παραµέτρου.

Χρήση της XML ως πρότυπο (template) για την µετάφραση Στα Element read, write, και method υπάρχουν Element που ονοµάζονται ast και σχηµατίζουν δέντρο. Το δέντρο εκφράζει τον κώδικα της PHP µε αντίστοιχη λειτουργικότητα µε την µέθοδο ή ιδιότητα. Κάθε κόµβος ast δέχεται τις ιδιότητες : name: Το συµβολικό όνοµα του Token. text: Το κείµενο του Token (προαιρετικά).

Χρήση της XML ως πρότυπο (template) για την µετάφραση Μεταξύ των ast στοιχείων, ενδέχεται να υπάρχουν τα Element arg Στο τελικό δέντρο, ο κόµβος ϑα αντικατασταθεί από την παράµετρο που δέχτηκε η µέθοδος ή η ιδιότητα. Για τις µεθόδους, η παράµετρος προσδιορίζεται από την ιδιότητα index του arg, που δηλώνει την σειρά της παραµέτρου. this Αναφέρεται στο όνοµα της µεταβλητής όπου έχει αποθηκευτεί ένα στιγµιότυπο του ActiveX αντικειµένου.

Παραδείγµατα της XML <class name=" String " standalone =" true " > </class > Το παράδειγµα ορίζει την κλάση String. Η ιδιότητα standalone σηµαίνει πως µπορούν να κατασκευαστούν νέα στιγµιότυπα της κλάσης µε την εντολή new.

Παραδείγµατα της XML <property name=" length " type ="DINT" > <arg type ="DINT" / > <read> <ast name="method_call" text =" strlen "> <ast name="arglist_values" > <this /> </ast > </ast > </read> <write > <ast name="expr" > <ast name="assign" > <this /> <ast name="method_call" t e x t =" substr" > <ast name="arglist_values" > <this /> <ast name="dint " text ="0" / > <arg index ="1" / > </ast > </ast > </ast > </ast > </write > </property >

Παραδείγµατα της XML <method name="anchor " type ="DSTRING" > <arg type ="DSTRING" / > <ast name="concat" > <ast name="dstring" text="& l t ;A NAME=&quot ;" / > <ast name="concat" > <arg index ="1" / > <ast name="concat" > <ast name="dstring" text=""&gt ;" / > <ast name="concat" > <this /> <ast name="dstring" text="& l t ;/A&gt ;" / > </ast > </ast > </ast > </ast > </method>

Ιεραρχία κλάσεων για την αναπαράσταση των XML

JsUserDefinedMethod VbUserDefinedMethod XmlDependantASPClass ASPMethodMap UserDefinedMethod ASPMethodWrapper ASPPRopertyWrapper XmlASPClass GenericMethod BaseMemberWrapper GenericASPProperty JsUserDefinedProperty ASPDependantClass GenericClass Method BaseMember Property ASPClass BaseObject Member ASPObject

Μεταφραστές Οι TreeParser µεταφράζουν τα AST που παράγονται από τους Parser της JavaScript και VbScript. Η µετάφραση είναι στην ουσία η µετατροπή του δέντρου εισόδου σε άλλο δέντρο που αναπαριστά κώδικα της PHP. Οι µετατροπές που πραγµατοποιούνται επί του δέντρου εισόδου είναι δύο ειδών. Μετατροπές που αφορούν διαφορές στην σύνταξη δοµών της PHP µε την JavaScript ή VbScript. Παραγωγή δέντρων για µεθόδους και ιδιότητες των ActiveX και ενσωµάτωση τους στο δέντρο εξόδου. Τα δέντρα που παράγονται αναπαριστούν κώδικα της PHP που προσφέρει την ίδια λειτουργικότητα. Η µετάφραση

επιτυγχάνετε από τον TreeParser που συλλέγει πληροφορίες σχετικές µε τα µέλη του ActiveX, από τις πληροφορίες που έχουν αποθηκευτεί στα XML αρχεία και από τις Java κλάσεις που απεικονίζονται στην προηγούµενη εικόνα

Μετατροπές του JsTree Οταν ο τελεστής + ενώνει δύο εκφράσεις εκ των οποίων µία τουλάχιστον είναι τύπου String, τότε αντικαθίσταται από τον τον τελεστή. Εκφράσεις του τύπου a = a op b αντικαθιστώνται από a op= b. Ο τελεστής typeof της δεξιάς έκφρασης από : αντικαθίσταται ανάλογα µε τον τύπο Οταν ο τύπος δεν είναι String επιλέγεται η έκφραση gettype(expr), όπου expr είναι η έκφραση στα αριστερά του τελεστή. Οταν ο τύπος είναι String τότε ανάλογα µε την τιµή της έκφρασης επιλέγονται τα παρακάτω :

number (LAND (is_numeric[method_call] (ELIST expr)) (LNOT (is_string[method_call] (ELIST expr)) ) ) is_numeric(expr) &&!is_string(expr) boolean (is_bool[method_call] (ELIST expr)) string (is_string[method_call] (ELIST expr)) object (is_object[method_call] (ELIST expr)) function

(function_exists[method_call] (ELIST expr)) undefined (isset[method_call] (ELIST expr)) Ο τελεστής instanceof τρόπο µε τον typeof. αντιµετωπίζεται µε παρόµοιο Ο τελεστής delete αντικαθίσταται από την έκφραση (unset[method_call] (ELIST expr)) Αποµακρύνονται τα label. Οταν οι εντολές break και continue δείχνουν σε κάποιο label και ϐρίσκονται σε ϐρόχο, τότε το label αντικαθίσταται από έναν κατάλληλο αριθµό, ώστε το αποτέλεσµα να είναι το ίδιο. Εάν οι εντολές δεν ϐρίσκονται σε ϐρόχο, τότε πρόκειται για την εντολή goto την οποία δεν υποστηρίζει η PHP και δεν µεταφράζεται.

Ο κώδικας που ϐρίσκεται στο εσωτερικό της εντολής with επεκτείνεται ώστε να περιλαµβάνει και το όνοµα του αντικειµένου. Για παράδειγµα ο κώδικας : with ( string ) { length = 20; a = anchor ( url ) ; } αντιµετωπίζεται το ίδιο µε το κώδικα : string. length = 20; a = string. anchor ( url ) ; Τα else if αντικαθιστώνται µε το elseif Η JavaScript υποστηρίζει κλάσεις µε έναν µάλλον ιδιαίτερο τρόπο. Η µέθοδος ανήκει σε κλάση εάν : Αναφέρεται στο αντικείµενο this. Αναφέρεται από άλλη µέθοδο που ανήκει στην κλάση

σε µία έκφραση της µορφής : this.somename = aname όπου το somename ορίζει το όνοµα του µέλους και το aname είναι το όνοµα της µεθόδου. Μέλη της κλάσης ϑα είναι επίσης και όσες µεταβλητές ορίζονται µε τον παραπάνω τρόπο. Συνήθως υπάρχει µία κεντρική µέθοδος που εκτελεί χρέη constructor. Για να προσδιοριστεί η µέθοδος ελέγχεται εάν : Υπάρχει µέθοδος που αναφέρεται σε άλλες µεθόδους µε την µορφή this.somename = aname αλλά καµία άλλη δεν αναφέρεται σε εκείνη µε τον ίδιο τρόπο. Στην ατυχή περίπτωση οπού δεν υπάρχει καµία τέτοια

µέθοδος ή υπάρχουν παραπάνω από µία, επιλέγεται εκείνη που έχει χρησιµοποιηθεί µετά από την εντολή new Η κλάση της PHP ϑα έχει τις παρακάτω ιδιότητες : Το όνοµα της κλάσης ϑα είναι το όνοµα της µεθόδου που λειτουργεί ως constructor. Κάθε µέθοδος που ανήκει στην κλάση ϑα µεταφερθεί από το σηµείο δήλωσής της, στο εσωτερικό της κλάσης. Για τις µεταβλητές που ανήκουν στην κλάση και αρχικοποιούνται ταυτόχρονα µε την δήλωσή τους, κατασκευάζεται η δήλωσή της στο εσωτερικό της κλάσης και ο κώδικας της αρχικοποίησης µεταφέρεται στο constructor. Οι ολικές( global scope ) µεταβλητές δηλώνονται µε την

εντολή global.

Μετατροπές του VbsTree Αντικατάσταση του τελεστή impl µε την έκφραση : (NOT (AND lexpr (NOT rexpr) ) )!(lexpr &&!rexpr) Αντικατάσταση του τελεστή eqv µε την έκφραση : (NOT (XOR lexpr rexpr)) Αντικατάσταση του τελεστή (διαίρεση χωρίς υπόλοιπο) µε την έκφραση :

(ceil[method_call] (ARGLIST_VALUES (DIVIDE lexpr rexpr) ) ) ceil(lexpr / rexpr) Αντικατάσταση του τελεστή µε την έκφραση : (pow[method_call] (ARGLIST_VALUES(lexpr rexpr)) Αντικαθιστά την εντολή randomize µε την µέθοδο srand Μεταφράζει δηλώσεις σταθερών ( const ) µε την εντολή define της PHP Αντικαθιστά την εντολή erase µε την εντολή unset Η εντολή exit ανάλογα µε την λέξη κλειδί που έπεται

αντικαθίσταται µε : Do break For break Sub return Function (return expr) Property εν υποστηρίζεται! Τα else if αντικαθιστώνται µε το elseif Το do while condition... loop µεταφράζεται σε while. Η εντολή do until condition... loop µετατρέπεται σε while όπου η έκφραση condition αντιστρέφεται. Ανάλογα µε τον τελεστή που είναι ϱίζα της έκφρασης condition η νέα ϱίζα ϑα είναι : LT : GE

GT : LE LE : GT GE : LT NEQ : EQ EQ : NEQ NOT : απαλείφεται Άλλο : Κατασκευάζεται δέντρο όπου η ϱίζα ϑα είναι το NOT και πρώτο παιδί της ϱίζας ϑα είναι η προηγούµενη έκφραση Η εντολή do... loop until condition µετατρέπεται σε do... while όπου η έκφραση condition αντιστρέφεται. Η while... wend µετατρέπεται σε while Η select case µετατρέπεται σε switch µε τις παρακάτω

επιπλέον αλλαγές : Εάν κάποιο case έχει παραπάνω από µία τιµές ελέγχου, αντικαθίσταται µε µία σειρά από case εντολές ίσες στο πλήθος όσο οι τιµές και µόνο η τελευταία ϑα περιέχει την εντολή break Στο τέλος της κάθε case, προστίθεται η εντολή break Η case else αντικαθίσταται µε την default

Παρακάτω παραθέτουµε ένα παράδειγµα σε ψευδοκώδικα των µετατροπών. select case value case 12, 13, 14 statements case 1 5 statements case else error end select switch ( value ) { case 12: case 13: case 1 4 : statements ; break ; case 1 5 : statements ; break ; default : error ; break ; } Η εντολή for counter = start to end [step s] ορισµένες ϕορές µετατρέπεται σε εντολή while. Η µετατροπή ϑα γίνει εφ όσων : Εχει οριστεί η παράµετρος step

Η τιµή της παραµέτρου είναι κλήση σε µέθοδο ή µέλος κλάσης. Τα sub µετατρέπονται σε function µε επιστρεφόµενο τύπο void Στα function και sub δηλώνονται οι ολικές µεταβλητές που χρησιµοποιούν, µε την εντολή global

Εξασφαλίζεται ότι οι συναρτήσεις πάντα ϑα επιστρέφουν τιµή. Για να εξασφαλιστεί το παραπάνω ϑα πρέπει να : 1. ηλώνεται η µεταβλητή result. 2. Οι εκφράσεις του τύπου funcname = expr µετατρέπονται σε result = expr. 3. Η εντολή exit function µετατρέπεται σε return result. 4. Οταν ο VbsTree ϕτάσει στο τέλος της function και δεν έχει επιστραφεί τιµή, τότε εισάγει την εντολή return result.

Μετάφραση ActiveX Για την µετάφραση των ActiveX απαιτούνται Οι πληροφορίες που υπάρχουν στο AST που κατασκεύασε ο Parser. Τα δεδοµένα που έχουν αποθηκευτεί στα XML αρχεία. Οι κλάσεις που χειρίζονται αυτά τα δεδοµένα. Ο TreeParser που τροφοδοτεί τις κλάσεις µε πληροφορίες που αντλεί από το AST και εκτελεί τµήµατα κώδικα όταν αναγνωρίζεται η µορφή κάποιου δέντρου.

Παράδειγµα µετάφρασης ActiveX Εστω η έκφραση Response.write "Hello World" Η Response είναι ένα από τα εγγενή ActiveX της ASP. Η µέθοδος write, στέλνει στο browser την παράµετρο της ως σειρά χαρακτήρων. Το AST της έκφρασης είναι : (SUB_CALL (DOT Response[IDENTIFIER] write[identifier] ) (ARGLIST_VALUES Hello World[DSTRING] ) )

Παράδειγµα µετάφρασης ActiveX Αρχικά ϑα εξεταστεί το δέντρο (DOT Response write), και εκτελείται κώδικας ο οποίος : Επιχειρεί να εντοπίσει κλάση ή µεταβλητή που αποθηκεύει στιγµιότυπο µιας κλάσης, µε το όνοµα Response. Εν προκειµένω, ϑα ϐρει ένα στιγµιότυπο της κλάσης XmlASPClass, που χειρίζεται το ActiveX Response. Ρωτά το αντικείµενο εάν έχει κάποιο µέλος µε το όνοµα write. Η απάντηση είναι καταφατική, και επιστρέφει ένα στιγµιότυπο της κλάσης GenericMethod. Το αποτέλεσµα ϑα είναι το δέντρο : (write[method_call]{objectast})

Παράδειγµα µετάφρασης ActiveX Επειτα εξετάζεται το δέντρο (ARGLIST_VALUES Hello World[DSTRING]) Από το δέντρο, κατασκευάζεται µία λίστα µε µοναδικό µέλος το AST Hello World[DSTRING]. Τελικά, το δέντρο εισόδου απαλείφεται και η λίστα αποθηκεύεται προσωρινά.

Παράδειγµα µετάφρασης ActiveX Σε αυτό το σηµείο, το δέντρο έχει διαµορφωθεί σε : (SUB_CALL write[method_call]{objectast}) Για να παραχθεί το δέντρο της PHP συµβαίνουν τα παρακάτω : Ανακτάται το στιγµιότυπο του GenericMethod από τον κόµβο write Εξετάζεται εάν η µέθοδος δέχεται µία µόνο παράµετρο Η µέθοδος τροφοδοτείται µε τις παραµέτρους που έχουν αποθηκευτεί στην λίστα καλείτε η µέθοδος translate του Method, η οποία επιστρέφει το δέντρο της PHP

Η µορφή του PHP δέντρου είναι : (print[method_call] (ARGLIST_VALUES Hello World[DSTRING] ) )

Παραγωγή Κώδικα Η παραγωγή κώδικα πραγµατοποιείτε από δύο TreeParser, το JsGenerator και VbsGenerator. Οι TreeParser, επισκέπτονται κάθε κόµβο του τελικού δέντρου και παράγουν τον κατάλληλο κώδικα για τον κόµβο. Οι δύο TreeParser, αποτελούν το τέταρτο άρθροµα του.

Σχηµατική αναπαράσταση της µετάφρασης

<% Response.write "Hello World" %> Lexer Multyplexing Lexer Parser XML <% Response DOT Write Hello World %> SubCall TreeParser DOT ARGLIST_VALUES EXPR Code Generator Response Write Hello World print <?php print("hello World");?> ARGLIST_VALUES Hello World

Συµπεράσµατα Το έχει αρθρωτή (modular) δοµή που συνεισφέρει στην : ευκολότερη επέκταση και συντήρηση του προγράµµατος χρήση ορισµένων αρθρωµάτων σε άλλα προγράµµατα Η χρήση της XML για την περιγραφή των ActiveX διασφαλίζει την : εύκολη επέκταση του, ώστε να αναγνωρίζει επιπλέον ActiveX αλλαγή της µετάφρασης για ορισµένα ActiveX ή µεθόδων τους, εάν ο χρήστης το επιθυµεί

Συµπεράσµατα Η επιλογή του Antlr για την κατασκευή των Lexer, Parser και TreeParser, αποτέλεσε σηµαντική παράµετρο στην ταχύτερη ανάπτυξη του και διευκολύνει την µελλοντική επέκταση του Το συνοδεύεται από 65 Test Cases, και από εργαλεία που προσφέρουν την υποδοµή για την κατασκευή επιπλέον δοκιµαστικών αρχείων.