Γλώσσες Προγραµµατισµού 2 Άσκηση 3

Σχετικά έγγραφα
ΗΜΥ 100 Εισαγωγή στην Τεχνολογία ιάλεξη 11

Μηχανική Μετάφραση Αριθμητικών

10-δικό δικό

ΚΕΦΑΛΑΙΟ 3 ο. Οι Έλληνες της διασποράς. Στο κεφάλαιο αυτό, θα προσπαθήσουµε να επιτύχουµε τους εξής στόχους:

Η συνάρτηση TextNumber.

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

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

Μαθηµατικά Τεύχος Α. Φύλλα εργασίας. Για παιδιά ΣΤ ΗΜΟΤΙΚΟΥ. Συµπληρωµατικές ασκήσεις & Προβλήµατα Ανάλυση θεωρίας µε ασκήσεις και παραδείγµατα

2. ΑΡΙΘΜΗΤΙΚΗ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ. 2.1 Αριθμητικά συστήματα

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία ιάλεξη 12

Σύνοψη Προηγούµενου. Γλώσσες χωρίς Συµφραζόµενα (2) Ισοδυναµία CFG και PDA. Σε αυτό το µάθηµα. Αυτόµατα Στοίβας Pushdown Automata

5.1 Θεωρητική εισαγωγή

Εργαστήριο ΨΗΦΙΑΚΗ ΛΟΓΙΚΗ. Εισαγωγή

Μηχανές Πεπερασµένων Καταστάσεων

Εισαγωγή στην πληροφορική

Κώδικας σχεδίασης Λογισµικής ιαγραµµατικής Οντολογίας

Κατανοµές. Η κατανοµή (distribution) µιας µεταβλητής (variable) φαίνεται από το σχήµα του ιστογράµµατος (histogram).

ΠΛΗΡΟΦΟΡΙΚΗ I. 4 η ΔΙΑΛΕΞΗ Αριθμητικά Συστήματα

Αριθμητικά Συστήματα

ΑΣΚΗΣΕΙΣ Ακολουθίας. Πίνακας τιµών µεταβλητών Χ Α Β α β γ

Αριθμητικά Συστήματα = 3 x x x x 10 0

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 1 η

Στοιχεία Θεωρίας Υπολογισµού (1): Τυπικές Γλώσσες, Γραµµατικές

Ποιές οι θεµελιώδεις δυνατότητες και ποιοί οι εγγενείς περιορισµοί των υπολογιστών ; Τί µπορούµε και τί δε µπορούµε να υπολογίσουµε (και γιατί);

Κεφάλαιο 2 Κωδικοποίηση & Αποκωδικοποίηση

Μάθηµα Θεωρίας Αριθµών Ε.Μ.Ε

ΚΕΦΑΛΑΙΟ 1 ο ΠΑΙΧΝΙ ΙΑ ΣΤΗΝ ΚΑΤΑΣΚΗΝΩΣΗ. Στο κεφάλαιο αυτό, θα προσπαθήσουµε να επιτύχουµε τους εξής στόχους:

1 η Θεµατική Ενότητα : Δυαδικά Συστήµατα

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 1 η

Κωστόπουλος ηµήτριος Μ.Π.Λ.Α. TAPE COMPRESSION (θεώρηµα 2.3 Παπαδηµητρίου)

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

Αριθμήσιμα σύνολα. Μαθηματικά Πληροφορικής 5ο Μάθημα. Παραδείγματα αριθμήσιμων συνόλων. Οι ρητοί αριθμοί

Συστήματα αρίθμησης. = α n-1 *b n-1 + a n-2 *b n-2 + +a 1 b 1 + a 0 όπου τα 0 a i b-1

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

Ασκήσεις για το µάθηµα «Ανάλυση Ι και Εφαρµογές» (ε) Κάθε συγκλίνουσα ακολουθία άρρητων αριθµών συγκλίνει σε άρρητο αριθµό.

1. Βάσεις αριθμητικών συστημάτων 2. Μετατροπές μεταξύ ξύβάσεων 3. Αρνητικοί δυαδικοί αριθμοί 4. Αριθμητικές πράξεις δυαδικών αριθμών

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

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

Πρόγραμμα Επικαιροποίησης Γνώσεων Αποφοίτων ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ

ΕΞΙΣΩΣΗ ΕΥΘΕΙΑΣ ΓΕΝΙΚΗ ΜΟΡΦΗ

ΑΣΥΜΠΤΩΤΙΚΗ ΑΝΑΛΥΣΗ & ΠΡΟΣΘΕΣΗ

(CLR, κεφάλαιο 32) Στην ενότητα αυτή θα µελετηθούν τα εξής θέµατα: Παραστάσεις πολυωνύµων Πολυωνυµική Παρεµβολή ιακριτός Μετασχηµατισµός Fourier

Κεφάλαιο 2. Συστήματα Αρίθμησης και Αναπαράσταση Πληροφορίας. Περιεχόμενα. 2.1 Αριθμητικά Συστήματα. Εισαγωγή

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία

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

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

Συστήματα Αρίθμησης. Συστήματα Αρίθμησης 1. PDF created with FinePrint pdffactory Pro trial version

ΕΝΟΤΗΤΑ 2 ΠΡΟΣΘΕΣΗ ΚΑΙ ΑΦΑΙΡΕΣΗ ΜΕΧΡΙ ΤΟ 100

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Εφαρµογή EXTRA. ιαδικασία εξαγωγής της Μηχανογραφικής. έκδοσης ισοζυγίου στην εφαρµογή Extra Λογιστική ιαχείριση.

Εισαγωγή στην επιστήµη των υπολογιστών ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ

Εισαγωγή στην Επιστήµη των Υπολογιστών Εξάµηνο 4ο-ΣΗΜΜΥ

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

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό

2 o Καλοκαιρινό σχολείο Μαθηµατικών Νάουσα 2008

Μαθηµατικά Τεύχος Α. Φύλλα εργασίας. Για παιδιά Ε ΗΜΟΤΙΚΟΥ. Συµπληρωµατικές ασκήσεις & Προβλήµατα Ανάλυση θεωρίας µε ασκήσεις και παραδείγµατα

Επαναληπτικό ιαγώνισµα Πληροφορικής Γ Γυµνασίου Γιώργος Λιακέας Σχολικός Σύµβουλος Πληροφορικής Ερωτήσεις

ΚΕΦΑΛΑΙΟ 2 Βασικές έννοιες αλγορίθµων

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

Mεταγλωττιστές. 4 ο εργαστηριακό μάθημα Λεξική ανάλυση και flex. Θεωρία

ονομασία αριθμός ψηφίων αριθμοί έχουν 1 ψηφίο έχουν 2 ψηφία έχουν 3 ψηφία έχουν 4 ψηφία...

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

Στ Τάξη. Α/Α Μαθηματικό περιεχόμενο Δείκτες Επιτυχίας Ώρες Διδ. 1 ENOTHTA 1

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 2 ο Αν χ και y μεταβλητές με τιμές 5 και 10 αντίστοιχα να εξηγηθούν οι ακόλουθες εντολές εξόδου.

PROJECT ΣΤΟ ΜΑΘΗΜΑ ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΕΥΡΕΤΙΚΕΣ ΜΕΘΟ ΟΥΣ

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

4 ο ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ ΓΕΝΙΚΟΣ ΣΚΟΠΟΣ :

2.2.3 Η εντολή Εκτύπωσε

Γραµµική Αλγεβρα Ι. Ενότητα: Εισαγωγικές Εννοιες. Ευάγγελος Ράπτης. Τµήµα Μαθηµατικών

Μαθηματικά. Α'Γυμνασίου. Μαρίνος Παπαδόπουλος

Αριθμητικά Συστήματα Η ανάγκη του ανθρώπου για μετρήσεις οδήγησε αρχικά στην επινόηση των αριθμών Κατόπιν, στην επινόηση συμβόλων για τη παράσταση

ΘΕΜΑΤΑ ΕΞΕΤΑΣΕΩΝ ΜΑΘΗΜΑΤΙΚΩΝ Ι Ι ΑΣΚΩΝ : ρ. Χρήστος Βοζίκης

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

Η εξίσωση του Fermat για τον εκθέτη n=3. Μία στοιχειώδης προσέγγιση

Γραµµική Άλγεβρα. Εισαγωγικά. Μέθοδος Απαλοιφής του Gauss

Α ΛΥΚΕΙΟΥ. Άσκηση 3. Να λυθεί η εξίσωση: 2(x 1) x 2. 4 x (1). Λύση. Έχουμε, για κάθε x D : x 5 12x. 2x 1 6 (1) x 4. . Συνεπώς: D.

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

Λύσειςασκήσεων εργαστηρίου

3 Αναδροµή και Επαγωγή

Η στοίβα (stack) H στοίβα είναι ένας αποθηκευτικός χώρος οργανωµένος κατά τέτοιο τρόπο ώστε να υποστηρίζει δύο βασικές λειτουργίες:

Γραµµατικές για Κανονικές Γλώσσες

Στοιχεία Θεωρίας Υπολογισµού (2): Πεπερασµένα Αυτόµατα, Κανονικές Εκφράσεις

Θεωρια Αριθµων Προβληµατα

Τύποι δεδομένων, τελεστές, μεταβλητές

Μαθηµατικά. Τεύχος Α Βιβλίο εργασιών Ε ΗΜΟΤΙΚΟΥ. Ενισχυτικές ασκήσεις Ανάλυση και συµβουλές θεωρίας Παραδείγµατα & µεθοδολογίες επίλυσης.

ΔΙΑΓΩΝΙΣΜΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 2008

Μεταγλωττιστής. Μεταφραστές. Γλώσσες. Είδη Μεταγλωττιστών. Μεταγλωττιστής Τελικό πρόγραµµα (object program) Εισαγωγή Αρχικό πρόγραµµα (source program)

Ανασκόπηση στα ΑΡΙΘΜΗΤΙΚΑ ΣΥΣΤΗΜΑΤΑ

ΓΙΑΝΝΗΣ ΖΑΧΑΡΟΠΟΥΛΟΣ. Γρήγορα τεστ. Μαθηματικά Ε Δημοτικού E 1 ΕΚΔΟΣΕΙΣ ΠΑΠΑΔΟΠΟΥΛΟΣ

Γενικές Παρατηρήσεις. Μη Κανονικές Γλώσσες - Χωρίς Συµφραζόµενα (1) Το Λήµµα της Αντλησης. Χρήση του Λήµµατος Αντλησης.

ΜΑΘΗΜΑΤΙΚΑ. Μαθήµατα σε συνέχειες από τον δάσκαλο Σταµάτη Γλάρο

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ Η/Υ (ΟΜΑΔΑ ΘΕΜΑΤΩΝ A)

Μια TM µπορεί ένα από τα δύο: να αποφασίζει µια γλώσσα L. να αναγνωρίζει (ηµιαποφασίζει) µια γλώσσα L. 1. Η TM «εκτελεί» τον απαριθµητή, E.

Συστήματα κ Τεχνολογίες Γνώσης Εργασίες στην Επεξεργασία Φυσικής Γλώσσας

Επίλυση Γραµµικών Συστηµάτων

Οδύσσεια Τα απίθανα... τριτάκια! Tετάρτη τάξη ΜΑΘΗΜΑΤΙΚΑ Δ ΤΑΞΗ Συμπεράσματα Ενοτήτων

Μαθηµατικά. Φύλλα εργασίας. Για παιδιά ΣΤ ΗΜΟΤΙΚΟΥ. Τεύχος Α. Συµπληρωµατικές ασκήσεις & Προβλήµατα Ανάλυση θεωρίας µε ασκήσεις και παραδείγµατα

0,00620 = 6, ΣΗΜΑΝΤΙΚΑ ΨΗΦΙΑ. Γενικοί Κανόνες για τα Σημαντικά Ψηφία

11 Το ολοκλήρωµα Riemann

Transcript:

Εθνικό Μετσόβιο Πολυτεχνείο Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Ηλεκτρονικών Υπολογιστών Γλώσσες Προγραµµατισµού 2 Άσκηση 3 Μάρτιος 2004 Τζάννες Αλέξανδρος

3. απλή µηχανική µετάφραση µε ενοποιητική γραµµατική α. Χρησιµοποιώντας τον φορµαλισµό της ενοποιητικής γραµµατικής PATR II σχεδιάστε µια γραµµατική που να δέχεται ως είσοδο την αριθµητική γραφή (δεκαδικά ακέραια ψηφία) και να την µεταφράζει στην αντίστοιχη ολογραφική µορφή. Π.χ.: είσοδος : 15 είσοδος : 342 µετάφραση : δέκα πέντε µετάφραση : τριακόσια σαράντα δύο β. Το αντίστροφο πώς θα µπορούσε να υλοποιηθεί. Περιγράψτε µε δυο λόγια τις αλλαγές. Για το πρώτο ερώτηµα σχεδιάσαµε και υλοποιήσαµε σε φορµαλισµό ενοποιητικής γραµµατικής PATR II µια γραµµατική για µετατροπή αριθµών από την αριθµητική γραφή στην ολογραφική µορφή στα ελληνικά. Οι αριθµοί µπορούν να έχουν το πολύ 6 ψηφία, δηλαδή περιλαµβάνονται οι περιπτώσεις των αριθµών από το 1 ως το 999999. Οι κυριότερες δυσκολίες που συναντήσαµε και ξεπεράσαµε ήταν οι εξής: 1. Περιπτώσεις του 11, 12 που αποτελούν εξαίρεση σε σχέση µε τους άλλους κανόνες µιας και αποτελούνται από 2 αριθµητικά ψηφία. 2. Η περίπτωση του 100 [εκατό και όχι εκατόν] 3. Η περίπτωση του χίλια Αρχικά, να σηµειώσουµε ότι τα ψηφία των αριθµών στην είσοδο πρέπει να χωρίζοτναι µεταξύ τους µε κενά. Έχοντας παρατηρήσει ότι επιτρέπονται τα κενά µέσα στις λέξεις και για να αντιµετωπίσουµε το πρόβληµα των 11 και 12 προσπαθήσαµε να ξεγελάσουµε το σύστηµα εισάγοντας στο λεξικό τις λέξεις 1 1 και 1 2. Όµως αποδείχθηκε ότι αυτό όχι µόνο δεν έλυνε το πρόβληµα, αλλά ότι έκανε τη λύση αδύνατη. Παρότι για αριθµούς µε το πολύ δύο ψηφία το τέχνασµα αυτό δούλεψε άψογα, για αριθµούς µε 3 η περισσότερα ψηφία είχαµε το εξής πρόβληµα. Επειδή ο λεκτικός αναλυτής αναγνωρίζει τη µεγαλύτερη σε µήκος δυνατή λέξη κάθε φορά, και δεν έχει τη δυνατότητα να δώσει διαφορετικές λεκτικές αναλύσεις σε µια πρόταση, αριθµοί όπως ο 115 τεχνολογούνταν ως ένδεκα πέντε ενώ όταν µπήκαν οι αναγκαίοι περιορισµοί για το ποια θέση µπορεί να καταλαµβάνει το ένδεκα δεν ήταν δυνατό να γίνει η τεχνολόγηση. Αυτό συνέβη όπως είπαµε εξ αιτίας του λεκτικού αναλυτή του PCPATR. Έπρεπε εποµένως να εκφραστούν τα 11 και 12 σαν εξαίρεση του γενικού κανόνα. Ρίχνοντας µια µατιά στο λεξικό παρατηρούµε ότι όλα τα τερµατικά σύµβολα ανήκουν στην κατηγορία (\c) DIGIT. Παρατηρούµε επίσης ότι για κάθε αριθµητικό ψηφίο έχουµε περισσότερα τερµατικά. Για το ψηφίο 1 για παράδειγµα έχουµε το ένα, µία, δέκα και εκατόν. Παρατηρούµε ότι τα ένδεκα, δώδεκα και εκατό δεν βρίσκονται στο λεξικό. Αυτό συµβαίνει γιατί, όπως είπαµε, πρόκειται για εξαιρέσεις και βρίσκονται µέσα στη γραµµατική, όπως θα δούµε αργότερα. Παρατηρούµε ότι το γένος περιέχεται ως ιδιότητα µόνο όταν υπάρχουν διαφορετικές επιλογές για ένα ψηφίο (π.χ. ένα - µία). Το πιο σηµαντικό feature των ψηφίων είναι το count. Αυτό υποδεικνύει σε ποια θέση µπορεί να εµφανιστεί το εν λόγω ψηφίο. Αυτό προϋποθέτει ότι χωρίζουµε νοητά τον αριθµό σε τριάδες ψηφίων, όπως κάνουµε όταν γράφουµε τον αριθµό µε

τελείες στις χιλιάδες ( π.χ. 54.325). Επειδή δεν έχουµε τη δυνατότητα να µετράµε µε άµεσο τρόπο µε το PCPATR χρησιµοποιούµε τη στοίβα. Έτσι σηµαίνει ότι το ψηφίο αυτό (µε την αντίστοιχη ερµηνεία) µπορούµε να το συναντήσουµε στην πρώτη θέση, ενώ στη δεύτερη. ΠΑΡΑΤΗΡΗΣΗ : Η τιµή 1 της ιδιότητας count δεν παίξει κανέναν ρόλο. Τέλος παρατηρούµε τις ιδιότητες iszero, isone και istwo που είναι true για τα αντίστοιχα ψηφία και δεν υπάρχουν για τα υπόλοιπα. Μια πιο ευνόητη υλοποίηση θα είχε και τις τιµές false των ιδιοτήτων στα υπόλοιπα ψηφία (δηλαδή κάθε τερµατικό θα είχε τις 3 αυτές ιδιότητες µε true ή false). Αυτό όµως θα µεγάλωνε σηµαντικά το λεξικό, και αφού η υλοποίηση χωρίς αυτά έγινε εύκολα, προτιµήθηκε αυτή η οδός. Η γραµµατική στηρίζεται αρχικά στην ακόλουθη δοµή : TRIPLET TRIPLET TUPLE TRIPLET DIGIT TRIPLET TRIPLET TUPLE DIGIT Και εµπλουτίζεται µε αρκετούς κανόνες οι οποίοι πηγάζουν από τις εξαιρέσεις που προαναφέραµε. Η γραµµατική έχει συνολικά 29 κανόνες που καλύπτουν πλήρως όλες τις περιπτώσεις για το πολύ 6 ψηφία. Ακολουθούν κάποια επιλεγµένα παραδείγµατα εκτέλεσης: 0 DIGIT 0 : [ cat: label: Miden ] 1 DIGIT 1 : [ cat: label: Ena ] 0 0 (επιτρέπουµε και leading zeros)

TUPLE TUPLES 0 0 : [ cat: label: Miden ] 0 1 TUPLE 0 1 : [ cat: label: Ena ] 1 1 TUPLE TUPLES 1 1 : [ cat: label: Enteka ] 1 2

TUPLE TUPLES 1 2 : [ cat: label: Dwdeka ] 1 3 TUPLE 1 3 : [ cat: label: [ Deka 2: Tria ] ] (Οι αριθµοί από το 13 ως το 20, ενώ κανονικά γράφονται σε µία λέξη, τις γράφουµε σε δύο, όπως το 15 στην εκφώνηση της άσκησης). 6 1 TUPLE 6 1 : [ cat: label: [ Eksinta 2: Ena ] ] 1 0 0 TRIPLET DIGIT TUPLE 1

TUPLES 0 0 : [ cat: label: Ekato ] 1 0 1 TRIPLET DIGIT TUPLE 1 0 1 : [ cat: label: [ Ekaton 2: Ena ] ] 5 1 2 TRIPLET DIGIT TUPLE 5 TUPLES 1 2 : [ cat: label: [ Pentakosia 2: Dwdeka ] ] 1 0 0 0 DIGIT TRIPLET 1

DIGIT TUPLE 0 TUPLES 0 0 : [ cat: label: [ Xilia ] ] 1 0 0 1 DIGIT TRIPLET 1 DIGIT TUPLE 0 0 1 : [ cat: label: [ Xilia 2: Ena ] ] 4 6 7 6 DIGIT TRIPLET 4 DIGIT TUPLE 6 7 6 : [ cat: label: [ Tessereis 2: Xiliades 3: [ Eksakosia 2: [ Ebdominta 2: Eksi ] ] ] ] 7 6 9 1 2

TUPLE TRIPLET DIGIT TUPLE 7 6 9 TUPLES 1 2 : [ cat: label: [ [ Ebdominta 2: Eksi ] 2: Xiliades 3: [ Enniakosia 2: Dwdeka ] ] ] 9 9 9 9 9 9 TRIPLET TRIPLET DIGIT TUPLE DIGIT TUPLE 9 9 9 9 9 9 : [ cat: label: [ [ Enniakosies 2: [ Eneninta 2: Ennia ] ] 2: Xiliades 3: [ Enniakosia 2: [ Eneninta 2: Ennia ] ] ] ] Ακολουθεί ο κώδικα από τα αρχεία.lex και.grm

Ex3.lex \w 0 <iszero> = true \w 0 <iszero> = true \w 0 <iszero> = true \w 1 <label> = Ena <genos> = neut <isone> = true \w 1 <label> = Mia <genos> = fem <isone> = true \w 1 <label> = Deka <isone> = true \w 1 <label> = Ekaton <isone> = true \w 2 <label> = Duo

<istwo> = true \w 2 <label> = Eikosi <istwo> = true \w 2 <label> = Diakosia <istwo> = true <genos> = neut \w 2 <label> = Diakosies <istwo> = true <genos> = fem \w 3 <label> = Tria <genos> = neut \w 3 <label> = Treis <genos> = fem \w 3 <label> = Trianta \w 3 <label> = Triakosia <genos> = neut \w 3

<label> = Triakosies <genos> = fem \w 4 <label> = Tessera <genos> = neut \w 4 <label> = Tessereis <genos> = fem \w 4 <label> = Saranta \w 4 <label> = Tetrakosia <genos> = neut \w 4 <label> = Tetrakosies <genos> = fem \w 5 <label> = Pente \w 5 <label> = Peninta \w 5 <label> = Pentakosia <genos> = neut

\w 5 <label> = Pentakosies <genos> = fem \w 6 <label> = Eksi \w 6 <label> = Eksinta \w 6 <label> = Eksakosia <genos> = neut \w 6 <label> = Eksakosies <genos> = fem \w 7 <label> = Epta \w 7 <label> = Ebdominta \w 7 <label> = Eptakosia <genos> = neut \w 7

<label> = Eptakosies <genos> = fem \w 8 <label> = Oxtw \w 8 <label> = Ogdonta \w 8 <label> = Oktakosia <genos> = neut \w 8 <label> = Oktakosies <genos> = fem \w 9 <label> = Ennia \w 9 <label> = Eneninta \w 9 <label> = Enniakosia <genos> = neut \w 9 <label> = Enniakosies <genos> = fem

Ex3.grm ;-------------------------------------------------------------------------------------------- RULE ; {(tr1, tr2), tr1>1 } -> TRIPLET_1 TRIPLET_2 <TRIPLET_1 genos> = fem <TRIPLET_1 iszero> = false <TRIPLET_1 isone> = false <TRIPLET_2 genos> = neut < label 1> = <TRIPLET_1 label> < label 2> = Xiliades < label 3> = <TRIPLET_2 label> RULE ; {(tr1, tr2), tr1=1 } -> TRIPLET_1 TRIPLET_2 <TRIPLET_1 genos> = fem <TRIPLET_1 label> = Mia <TRIPLET_1 iszero> = false <TRIPLET_2 genos> = neut < label 1> = Xilia < label 2> = <TRIPLET_2 label> RULE ; {(tr1, tr2), tr1=0, tr2<>0 } -> TRIPLET_1 TRIPLET_2 <TRIPLET_1 genos> = fem <TRIPLET_1 label> = Miden <TRIPLET_2 genos> = neut <TRIPLET_2 iszero> = false < label> = <TRIPLET_2 label> RULE ; {(tr1, tr2), tr1=0, tr2=0 } -> TRIPLET_1 TRIPLET_2 <TRIPLET_1 genos> = fem <TRIPLET_1 label> = Miden <TRIPLET_2 genos> = neut <TRIPLET_2 label> = Miden < label> = Miden ;------------------------------------------------------------- RULE ; {(t, tr), t>1} -> TUPLE TRIPLET <TUPLE genos> = fem <TUPLE iszero> = false <TUPLE isone> = false <TRIPLET genos> = neut < label 1> = <TUPLE label> < label 2> = Xiliades < label 3> = <TRIPLET label> RULE ; {(t, tr), t=1} -> TUPLE TRIPLET <TUPLE genos> = fem <TUPLE label> = Mia <TRIPLET genos> = neut

< label 1> = Xilia < label 2> = <TRIPLET label> RULE ; {(t, tr), t=0, tr<>0 } -> TUPLE TRIPLET <TUPLE genos> = fem <TUPLE label> = Miden <TRIPLET genos> = neut <TRIPLET iszero> = false < label> = <TRIPLET label> RULE ; {(t, tr), t=0, tr=0 } -> TUPLE TRIPLET <TUPLE genos> = fem <TUPLE label> = Miden <TRIPLET genos> = neut <TRIPLET label> = Miden < label> = Miden ;------------------------------------------------------------- RULE ; {(d1,tr), d1>1} -> DIGIT TRIPLET <DIGIT genos> = fem <DIGIT count> = 1 <DIGIT isone> = false <DIGIT iszero> = false <TRIPLET genos> = neut < label 1> = <DIGIT label> < label 2> = Xiliades < label 3> = <TRIPLET label> RULE ; {(d1,tr), d1=1} -> DIGIT TRIPLET <DIGIT genos> = fem <DIGIT count> = 1 <DIGIT lex> = 1 <TRIPLET genos> = neut < label 1> = Xilia < label 2> = <TRIPLET label> RULE ; {(d1,tr), d1=0, tr<>0 } -> DIGIT TRIPLET <DIGIT genos> = fem <DIGIT lex> = 0 <DIGIT count> = 1 <TRIPLET iszero> = false <TRIPLET genos> = neut < label> = <TRIPLET label> RULE ; {(d1,tr), d1=0, tr=0 } -> DIGIT TRIPLET <DIGIT genos> = fem <DIGIT lex> = 0 <DIGIT count> = 1 <TRIPLET label> = Miden

<TRIPLET genos> = neut < label> = Miden ;-------------------------------------------------------------- RULE ; { tr tr<>0 } -> TRIPLET <TRIPLET genos> = neut <TRIPLET iszero> = false < label> = <TRIPLET label> RULE ; { tr tr = 0 } -> TRIPLET <TRIPLET genos> = neut <TRIPLET label> = Miden < label> = Miden RULE ; -> TUPLE <TUPLE genos> = neut < label> = <TUPLE label> RULE ; { (d), d<>0} -> DIGIT <DIGIT iszero> = false <DIGIT count> = 1 <DIGIT genos> = neut < label> = <DIGIT label> RULE ; { (d), d=0} -> DIGIT <DIGIT lex> = 0 <DIGIT count> = 1 <DIGIT genos> = neut < label> = Miden ;------------------------------------------------------------------ ; TRIPLETS ;------------------------------------------------------------------ RULE ; {(d1, t), d1=0, t <> 0} TRIPLET -> DIGIT TUPLE <DIGIT genos> = <TUPLE genos> <DIGIT count count count> = 1 <DIGIT lex> = 0 <TUPLE iszero> = false <TRIPLET label> = <TUPLE label> <TRIPLET genos> = <TUPLE genos> ;<TRIPLET iszero> = false <TRIPLET isone> = <TUPLE isone> RULE ; {(d1, t), d1<>0, t <> 0} TRIPLET -> DIGIT TUPLE <DIGIT genos> = <TUPLE genos> <DIGIT count count count> = 1 <DIGIT iszero> = false

<TUPLE iszero> = false <TRIPLET label 1> = <DIGIT label> <TRIPLET label 2> = <TUPLE label> <TRIPLET genos> = <TUPLE genos> ;<TRIPLET iszero> = false ;<TRIPLET isone> = false RULE ; {(d1,t), d1 > 1, t = 0} TRIPLET -> DIGIT TUPLE <DIGIT genos> = <TUPLE genos> <DIGIT count count count> = 1 <DIGIT isone> = false <DIGIT iszero> = false <TUPLE label> = Miden <TRIPLET label> = <DIGIT label> <TRIPLET genos> = <TUPLE genos> ;<TRIPLET iszero> = false ;<TRIPLET isone> = false RULE ; {(d1,t), d1 = 0, t = 0} TRIPLET -> DIGIT TUPLE <DIGIT genos> = <TUPLE genos> <DIGIT count count count> = 1 <DIGIT lex> = 0 <TUPLE label> = Miden ;<TRIPLET label> = Miden <TRIPLET genos> = <TUPLE genos> <TRIPLET iszero> = true ;<TRIPLET isone> = false RULE ; rule for 100 TRIPLET -> DIGIT TUPLE <DIGIT genos> = <TUPLE genos> <DIGIT count count count> = 1 <DIGIT lex> = 1 <TUPLE label> = Miden <TRIPLET label> = Ekato ;------------------------------------------------------------------ RULE ; {(d1, d2), d1>1} TUPLE -> DIGIT_1 DIGIT_2 <TUPLE count count> = 1 <DIGIT_1 count count> = 1 <DIGIT_2 count> = 1 <DIGIT_1 iszero> = false <DIGIT_1 isone> = false <DIGIT_1 genos> = <DIGIT_2 genos> <TUPLE genos> = <DIGIT_2 genos> <TUPLE label 1> = <DIGIT_1 label> <TUPLE label 2> = <DIGIT_2 label> ;<TUPLE iszero> = false ;<TUPLE isone> = false RULE ; {(0, d2), d2<>0} TUPLE -> DIGIT_1 DIGIT_2

<TUPLE count count> = 1 <DIGIT_1 count count> = 1 <DIGIT_2 count> =1 <DIGIT_1 lex> = 0 <DIGIT_2 iszero> = false <TUPLE genos> = <DIGIT_2 genos> <TUPLE label> = <DIGIT_2 label> ;<TUPLE iszero> = false <TUPLE isone> = <DIGIT_2 isone>;?????????????????????????? RULE ; {(1, d2), d2 > 2 d2 = 0} TUPLE -> DIGIT_1 DIGIT_2 <TUPLE count count> = 1 <DIGIT_1 count count> = 1 <DIGIT_2 count> = 1 <DIGIT_1 lex> = 1 <DIGIT_2 isone> = false <DIGIT_2 istwo> = false <TUPLE genos> = <DIGIT_2 genos> <TUPLE label 1> = <DIGIT_1 label> <TUPLE label 2> = <DIGIT_2 label> ;<TUPLE iszero> = false ;<TUPLE isone> = false RULE TUPLE -> TUPLES <TUPLE label> = <TUPLES label> <TUPLE iszero> = <TUPLES iszero> <TUPLE isone> = <TUPLES isone> RULE ; rule for 00 TUPLES -> DIGIT_1 DIGIT_2 <TUPLES label> = Miden <TUPLES count count> = 1 <DIGIT_1 count count> = 1 <DIGIT_2 count> = 1 <DIGIT_1 lex> = 0 <DIGIT_2 lex> = 0 <TUPLES iszero> = true ;<TUPLES isone> = false RULE ; rule for 11 TUPLES -> DIGIT_1 DIGIT_2 <TUPLE count count> = 1 <DIGIT_1 count count> = 1 <DIGIT_2 count>=1 <DIGIT_2 genos> = neut <DIGIT_1 lex> = 1 <DIGIT_2 lex> = 1 <TUPLES label> = Enteka ;<TUPLES iszero> = false ;<TUPLES isone> = false RULE ; rule for 12 TUPLES -> DIGIT_1 DIGIT_2 <TUPLE count count> = 1

<DIGIT_1 count count> = 1 <DIGIT_2 count>=1 <DIGIT_1 lex> = 1 <DIGIT_2 lex> = 2 <TUPLES label> = Dwdeka ;<TUPLES iszero> = false ;<TUPLES isone> = false

β. Για το αντίστροφο έχουµε υλοποιήσει µια γραµµατική σε PCPATR που να δέχεται αριθµούς το πολύ τριψήφιους ολογράφως και τους µετατρέπει στη αριθµητική µορφή. Επειδή όµως, όπως ξέρουµε, το PCPATR δεν µπορεί να κάνει προσθέσεις ή άλλες αριθµητικές πράξεις, πρέπει να κάνουµε κάποια σύµβαση. Η σύµβαση που κάνουµε είναι ότι το αποτέλεσµα προκύπτει ως το άθροισµα από τις τιµές της ιδιότητας label της ρίζας. Αυτό γίνεται κατανοητό µε το ακόλουθο παράδειγµα : Eksakosia Ebdominta Ena S S Eksakosia S Ebdominta Ena S: [ cat: S count: [ count: [ count: 1 ] ] label: [ 600 2: [ 70 2: 1 ] ] ] Η τιµή είναι 600+70+1 = 671. Βλέποντας τα αρχεία του λεξικού και της γραµµατικής που ακολουθούν διαπιστώνουµε ότι το προηγούµενο ερώτηµα ήταν σηµαντικά πιο δύσκολο ενώ το παρόν ήταν απρόσµενα εύκολο, αν και εκ πρώτης όψης ίσως να έµοιαζε πιο δύσκολο. Ακολουθούν τα αρχεία του λεξικού (.lex) και της γραµµατικής (.grm) : Ex3b.grm RULE S -> <S count> = < count> <S label> = < label> RULE S_1 -> S_2 <S_1 count count> = <S_2 count> < count count> = <S_2 count> <S_1 label 1> = < label> <S_1 label 2> = <S_2 label>

RULE S_1 -> S_2 <S_1 count count count> = <S_2 count> < count count count> = <S_2 count> <S_1 label 1> = < label> <S_1 label 2> = <S_2 label> Ex3b.lex \w 0 <label> = - \w 0 <label> = - \w 0 <label> = - \w Ena <label> = 1 \w Deka <label> = 10 \w Enteka <label> = 11 \w Dwdeka <label> = 12 \w Dekatria

<label> = 13 \w Dekatessera <label> = 14 \w Dekapente <label> = 15 \w Dekaeksi <label> = 16 \w Dekaepta <label> = 17 \w Dekaoktw <label> = 18 \w Dekaennia <label> = 19 \w Ekaton <label> = 100 \w Ekato <label> = 100 \w Duo <label> = 2

\w Eikosi <label> = 20 \w Diakosia <label> = 200 \w Tria <label> = 3 \w Trianta <label> = 30 \w Triakosia <label> = 300 \w Tessera <label> = 4 \w Saranta <label> = 40 \w Tetrakosia <label> = 400 \w Pente <label> = 5 \w Peninta

<label> = 50 \w Pentakosia <label> = 500 \w Eksi <label> = 6 \w Eksinta <label> = 60 \w Eksakosia <label> = 600 \w Epta <label> = 7 \w Ebdominta <label> = 70 \w Eptakosia <label> = 700 \w Oxtw <label> = 8 \w Ogdonta

<label> = 80 \w Oktakosia <label> = 800 \w Ennia <label> = 9 \w Eneninta <label> = 90 \w Enniakosia <label> = 900 Παρατηρούµε ότι ενώ η γραµµατική είναι στοιχειώδης, το λεξικό είναι αρκετά πιο µεγάλο.