-
Notifications
You must be signed in to change notification settings - Fork 0
panos1962/totem
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Το πρόγραμμα "totem" σκοπό έχει να καταδείξει την ευκολία με την οποία μπορούμε να διαχειριστούμε «ελεύθερο» input χρησιμοποιώντας εργαλεία ανάπτυξης των compilers, όπως είναι το flex και το bison. Με τον όρο ελεύθερο input εννοούμε input το οποίο ακολουθεί κάποιους κανόνες γραφής, χωρίς όμως οι κανόνες αυτοί να ορίζουν επακριβώς τη μορφή του input με την κλασική, αυστηρή έννοια καθορισμού της μορφής δεδομένων μέσω συγκεκριμένης γραμμογράφησης κλπ. Όταν μιλάμε για ελεύθερο input, οι κανόνες γραφής θυμίζουν μάλλον κανόνες γραφής ενός προγράμματος σε κάποια σύγχρονη γλώσσα προγραμματισμού, παρά κανόνες καταγραφής δεδομένων. Ένας compiler αποτελείται, συνήθως, από δύο βασικά modules, τον lexical analyzer και τον parser. Ο lexical analyzer «σπάζει» το input σε tokens, όπου tokens είναι τα δομικά στοιχεία μιας γλώσσας, π.χ. λέξεις, σημεία στίξης, αριθμοί κλπ. Ο lexical analyzer διοχετεύει κατόπιν τα tokens στον parser, ο οποίος αναλαμβάνει να ταιριάξει αυτά τα tokens σε συντακτικές δομές «κατανοώντας» τελικά το input και κάνοντας κάτι μ αυτό. Τόσο ο lexical analyzer, όσο και ο parser, λειτουργούν βάσει κανόνων που ορίζει ο κατασκευαστής του compiler. Τα προγράμματα flex και bison δημιουργούν τον lexical analyzer και τον parser αντίστοιχα, διαβάζοντας το καθένα τούς σχετικούς κανόνες που έχουν καθοριστεί. Οι κανόνες που διαβάζει ο flex βασίζονται κατά κύριο λόγο στις regular expressions, ενώ οι κανόνες του bison είναι κανόνες γραμματικής που περιγράφουν έναν LALR parser. Τόσο ο flex, όσο και o bison είναι γεννήτριες κώδικα σε γλώσσα C, όπου ο μεν flex παράγει την function yylex(), ενώ ο bison παράγει την function yyparse(). Για την ιστορία αναφέρουμε εδώ ότι ο flex είναι ο διάδοχος του παλαιότερου lex, ενώ ο bison διαδέχτηκε τον yacc (yet another compiler compiler). Ο lex και ο yacc είναι προγράμματα που γράφτηκαν κατά τη δεκαετία του 1970 και έδωσαν μεγάλη ώθηση στην επιστήμη των ηλεκτρονικών υπολογιστών, καθώς απλούστευσαν κατά πολύ τη διαδικασία γραφής των compilers. Να σημειώσουμε στο σημείο αυτό ότι ενώ ένας lexical analyzer μπορεί να γραφτεί και «με το χέρι», χωρίς δηλαδή τη χρήση του lex ή του flex, η γραφή του parser αποτελεί συνήθως άθλο που φαίνεται αδύνατον να επιτευχθεί χωρίς τη βοήθεια ενός compiler compiler όπως είναι ο yacc ή ο bison. Το πρόγραμμα "totem" ακολουθώντας τις τεχνικές γραφής των compilers, επιχειρεί να κατανοήσει ένα input αποτελούμενο από αριθμούς τους οποίους αθροίζει σε διάφορα επίπεδα και κατά στήλες. Τα επίπεδα διάρθρωσης των δεδομένων καθορίζονται με άγκιστρα, ενώ οι στήλες με παρενθέσεις. Κάθε φορά που «κλείνει» μια ενότητα δεδομένων, το πρόγραμμα υπολογίζει και εκτυπώνει το άθροισμα των αριθμών τής συγκεκριμένης ενότητας, ενώ όλα αυτά μπορούν να γίνουν είτε με μεμονωμένους αριθμούς, είτε με διανύσματα, δηλαδή πολλούς αριθμούς γραμμένους μέσα σε παρενθέσεις, οπότε τα αθροίσματα δημιουργούνται σε στήλες. Όλα αυτά ακούγονται κάπως περίπλοκα, καταδεικνύουν όμως την αξία των εργαλείων κατασκευής των compilers στη γενικότερη διαχείριση ενός ελεύθερου input, καθώς το συγκεκριμένο πρόγραμμα δεν υπερβαίνει τις 300 γραμμές, ενώ η ουσία του προγράμματος περιορίζεται σε λιγότερες από 50 γραμμές.
About
Simple bison/flex tutorial application
Topics
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published