το έκανα μ αυτόν τον τρόπο γιατί στην εκφώνηση μας λεει να τον κανουμε πάνω σε αυτόν τον τρόπο. Κάτσε να σασ βάλω και όλη την εκφωνηση να την δείτε...αν πιστεύεται οτι δεν παρεμβαίνει κάποιον απο τους κανόνεσ τότε και μένα αυτό που μου στείλατε μου φαίνεται πολυ πιο απλο και ξεκάθαρο..
Ζητούμενο
Ο στόχος της άσκησης είναι να κατασκευάσετε σε απλή Python3 (χωρίς τη βοήθεια έτοιμων
βιβλιοθηκών/εργαλείων) λεκτικό αναλυτή, ο οποίος θα αναγνωρίζει ενδείξεις ώρας.
Η αναγνωρίσιμη μορφή ώρας αποτελείται από τα εξής μέρη:
i) Ώρα (0-23, σε 1 ή 2 ψηφία)
ii) Διαχωριστής ( : ή . )
iii) Λεπτά (0-59, πάντοτε σε 2 ψηφία)
και προαιρετικά
iv) Διαχωριστής ( : ή . )
v) Δευτερόλεπτα (0-59, πάντοτε σε 2 ψηφία)
Σύμφωνα με τις προδιαγραφές, θα πρέπει να αναγνωρίζονται οι εξής ενδείξεις ώρας:
23:45 ή 7.22 ή 09:08:59
αλλά όχι άκυρες ενδείξεις όπως
17:4 ή 25:12 ή 9:66
Προσοχή!
• Το αυτόματο που θα φτιάξετε θα πρέπει να αναγνωρίζει μόνο ορθές ενδείξεις ώρας!
• Από την άλλη πλευρά, δεν απαιτείται να ελέγχετε αν χρησιμοποιήθηκε ο ίδιος διαχωριστής και
τις δύο φορές μέσα στην ένδειξη ώρας.
Διαδικασία
α) Κατασκευάστε το ντετερμινιστικό αυτόματο πεπερασμένων καταστάσεων (DFA) που αντιστοιχεί
στη ζητούμενη προδιαγραφή. Σημειώστε ποιες είναι οι τελικές καταστάσεις αποδοχής.
β) Από το DFA κατασκευάσετε τον πίνακα μεταβάσεων (ποια θα είναι η επόμενη κατάσταση,
σύμφωνα με την τρέχουσα κατάσταση και τον επόμενο χαρακτήρα εισόδου).
γ) Καθορίστε τις καταστάσεις αποδοχής: όταν αναγνωρίσετε μια ένδειξη ώρας θα επιστρέφετε το token
'TIME_TOKEN'. Αν υπάρχει κείμενο που δεν μπορεί να αναγνωριστεί θα επιστρέφετε το token
'ERROR'.
δ) Χρησιμοποιήστε υποχρεωτικά το υπόδειγμα προγράμματος Python3 που υλοποιήθηκε στο
εργαστήριο (
gist.github.com/mixstef/f586af18eca356c1ef54), τροποποιώντας το κατάλληλα
έτσι ώστε να υλοποιεί τα (α), (β) και (γ).
ε) Δοκιμάστε το πρόγραμμά σας με διάφορους συνδυασμούς εισόδου (αποδεκτούς ή όχι) και
αποθηκεύστε την είσοδο και έξοδο της κονσόλας (log εκτέλεσης).
Υποδείξεις
• Προτείνεται η ταξινόμηση των χαρακτήρων εισόδου σε αντιπροσωπευτικές ομάδες και η
επιστροφή από την getchar() της ομάδας αντί κάθε ξεχωριστού χαρακτήρα: π.χ. μία ομάδα
για τους διαχωριστές ή μια ομάδα other για οτιδήποτε δεν ανήκει στους χαρακτήρες της
προδιαγραφής. Έτσι, μειώνεται το μέγεθος του πίνακα μεταβάσεων, ο οποίος θα έχει τώρα
ομάδες χαρακτήρων ως στήλες κι όχι μεμονωμένους χαρακτήρες.