feedback request gia neo Perl-based project

Konstantinos Pistiolis kpistiolis at yahoo.com
Tue May 29 04:09:01 EEST 2001


> > Συμφωνούμε βλέπω όλοι ότι το "πρόβλημα" είναι το
> notation
> > Δηλαδή αυτό που στην X γλώσσα που έχουμε σαν input
> είναι "<", αν στην perl
> > δεν είναι το ίδιο, έχουμε πρόβλημα.
> > Υπάρχει κάποιος τρόπος, να ξεπεραστεί αυτό? 
> > Προφανώς κάπως γίνεται (π.χ. στην C το <? δεν
> σημαίνει ότι και στην php
> > αλλά η php είναι γραμμένη σε C :-) αλλά εννοώ αν
> ξέρει κάποιος από εδώ
> > μέσα την μεθοδολογία.
> Ο πιο εύκολος τρόπος για να κάνεις
> interpreter/compiler συνήθως είναι να
> χρησιμοποιήσεις lex/yacc (flex/bison in gnu world).
> Αυτά παράγουν C κώδικα,
> αλλά δεν ξέρω αν υπάρχει κάτι αντίστοιχο για perl. Η
> χαρά των βιβλίων που
> περιγράφουν interpreted γλωσσες είναι να φτιάξουν
> ένα meta-interpreter της
> γλώσσας αυτής... Ίσως κάποιο βιβλίο για perl να έχει
> κάτι αντίστοιχο που
> να βοηθάει.
>  
Και βέβαια αυτό λέγεται μεταγλωττιστής και φτιάχνεται
με flex/bison, αλλά ο C κώδικας που παράγουν τα
εργαλεία αυτά είναι απλώς προϊόν του κώδικα
flex/bison.
Σημασία έχει η γραμματική της γλώσσας η οποία
περιγράφεται με bison (.y) και οργάνωση του κειμένου
της που περιγράφεται με flex (.l).

Πρέπει λοιπόν:
1. Να ξέρουμε πως χωρίζονται τα ορίσματα (οι λέξεις
κλπ)στη γλώσσα για το .l αρχείο (εύκολο πράγμα)
2. Να γνωρίζουμε τη γραμματική, δηλαδή ΟΛΟΥΣ τους
κανόνες, της γλώσσας που θα έχουμε για είσοδο. Λέω
όλους, εννοώντας όλους όσους θέλουμε να κατανοεί ο
μεταγλωττιστής μας. 
3. Να γράψουμε το .y αρχείο, προσθέτοντας σε κάθε
κανόνα κώδικα για την αναπαραγωγή του αντίστοιχου
κώδικα στη νέα γλώσσα.

Στην περίπτωση που οι δύο γλώσσες έχουν ΙΔΙΕΣ
γραμματικές (πράγμα απίθανο) μας αρκεί μόνο ο κώδικας
του flex. (βήματα 1 και 3). 
---------------------------------
Όλα αυτά είναι λίγο ακατανόητα γι αυτό δίνω ένα
παράδειγμα: Έστω ότι θέλουμε να κάνουμε τη C C++
η δήλωση int new=5; θα πρέπει να μετατραπεί σε 
int new_val=5;  γιατί στη C++ η new είναι δεσμευμένη.
Αυτό είναι το εύκολο που γίνεται μόνο με flex.

Αλλά η δήλωση και η κλήση της myfunc 
int myfync();
....
myfunc();
....
Πρέπει να γίνει:
int myfunc(...);
....
myfunc();
....
Γιατί μόνο οι δηλώσεις διαφέρουν (όχι οι κλήσεις). Άρα
ο μεταγλωττιστής θα πρέπει να ξέρει άν πρόκειται για
δήλωση ή κλήση για να κάνει την αντίστοιχη μετατροπή.
Δηλαδή πρέπει να ξέρει C. Σε bison αυτό θα γίνονταν
(πολύ απλοποιημένα):
......
statement : declaration  /* κανόνας για δήλωση */
          | call       /* κανόνας για κλήση */
;
declaration : "int" func_name '(' ')' ';'
    /* όταν εφαρμοστεί ο κανόνας δήλωσης εκτελείται 
     * το παρακάτω που προσθέτει τις ... στις () */
        {  printf("int %s (...);", $2); }
;
call :   func_name '(' ')' ';'
    /* όταν εφαρμοστεί ο κανόνας της κλήσης
     * εκτελείται το παρακάτω που αφήνει τον 
     * κώδικα ως έχει  */
        {  printf("%s ();", $1);   }
;
.....
---------------------------------------
Δεν ξέρω ούτε perl ούτε php, αλλά γενικά είναι εύκολο
να φτιάξεις έναν απλό μεταγγλωτιστή. Το δύσκολο είναι
1ον να τον βελτιστοποιήσεις και 2ον να βάλεις όλους
τους κανόνες της γλώσσας.
  Ελπίζω να μη σας αποθάρρυνα, αυτό που θέλετε δεν
πρέπει να ξεπερνά τις 500-1000 γραμμές κώδικα. Αλλά
χρειάζεται κάποιος να ξέρει καλά την αρχική γλώσσα,
ή/και να μελετηθεί το .y αρχείο που έγραψαν αυτοί που
υλοποίησαν τη γλώσσα.

Στη διάθεσή σας για ό,τι περι bison κλπ. 
 Κώστας 


____________________________________________________________
Do You Yahoo!?
Αποκτήστε τη δωρεάν @yahoo.gr διεύθυνση σας στο http://www.otenet.gr



More information about the Linux-greek-users mailing list