Μας ζητούν να κατασκευάσουμε πρόγραμμα με χρήση της γλώσσας προγραμματισμού Java, το οποίο θα υλοποιεί το αυτόματο του σχήματος. Να χρησιμοποιήσετε μία κλάση LexTest που θα διαθέτει τη μέθοδο nextToken, για να ελέγχει αν η είσοδος, η οποία θα δίνεται ως παράμετρος της μεθόδου, είναι αποδεκτή. Να χρησιμοποιήσετε ως παράδειγμα δύο (2) αποδεκτές και δύο (2) μη αποδεκτές εισόδους.
Βασικό στοιχείο στην υλοποίηση είναι η κλάση LexText. Ας δούμε λοιπόν πως αυτή η κλάση ορίζεται.
public class LexTest {
private String input;
private int cur;
//ΜΕΘΟΔΟΣ ΕΛΕΓΧΟΥ ΣΥΜΒΟΛΟΣΕΙΡΑΣ
public String nextToken(String s) {
input = s;
this.input = this.input.concat("$");
cur = 0;
try {//ΚΑΤΑΣΤΑΣΗ q0
q0();
System.out.println("Η Είσοδος " + input + " έγινε αποδεκτή");
}
catch (Exception e) {
System.out.println("Σφάλμα κατά την αναγνώριση της εισόδου " + input +
" στη θέση " + (cur + 1));
}
return input;
}
Σε αυτή την κλάση ορίζουμε δύο ιδιότητες : το εισερχόμενο string input και ένα μετρητή int cur.
Η μέθοδος nextToken δέχεται την είσοδο και ορίζουμε και τον τελικό χαρακτήρα του token με το σύμβολο του $.
Ο μετρητής ορίζεται σε τιμή μηδέν και στην συνέχεια ξεκινά η εκτέλεση της κατάστασης q0.
Αν η εκτέλεση της q0 γίνει ομαλά μας πληροφορεί με μήνυμα ότι η είσοδος έγινε αποδεκτή αλλιώς αν προκληθεί εξαίρεση, μας ενημερώνει με το αντίστοιχο μήνυμα για το σφάλμα και για την θέση του σφάλματος, ανάλογα με τον αριθμό του μετρητή.
Κατόπιν ακολουθεί και ο υπόλοιπος κώδικας
//ΚΑΤΑΣΤΑΣΗ q0
private void q0() throws Exception{
if (input.charAt(cur) == 'a'){// ΑΝ Ο ΧΑΡΑΚΤΗΡΑΣ ΕΙΝΑΙ a
cur++;//ΠΗΓΑΙΝΕ ΣΤΟΝ ΕΠΟΜΕΝΟ ΧΑΡΑΚΤΗΡΑ
q1();//ΠΗΓΑΙΝΕ ΣΤΗΝ ΚΑΤΑΣΤΑΣΗ q1
}
else throw new Exception();
}
//ΚΑΤΑΣΤΑΣΗ q1
private void q1() throws Exception{
if (input.charAt(cur) == 'b'){ // ΑΝ Ο ΧΑΡΑΚΤΗΡΑΣ ΕΙΝΑΙ b
cur++;//ΠΗΓΑΙΝΕ ΣΤΟΝ ΕΠΟΜΕΝΟ ΧΑΡΑΚΤΗΡΑ
q2();//ΠΗΓΑΙΝΕ ΣΤΗΝ ΚΑΤΑΣΤΑΣΗ q2
}
else throw new Exception();
}
//ΚΑΤΑΣΤΑΣΗ q2
private void q2() throws Exception{
if (input.charAt(cur) == 'a'){ // ΑΝ Ο ΧΑΡΑΚΤΗΡΑΣ ΕΙΝΑΙ a
cur++; //ΠΗΓΑΙΝΕ ΣΤΟΝ ΕΠΟΜΕΝΟ ΧΑΡΑΚΤΗΡΑ
q2();//ΠΑΡΑΜΕΝΕΙ ΣΤΗΝ q2
}
else if(input.charAt(cur) == 'b'){ // ΑΝ Ο ΧΑΡΑΚΤΗΡΑΣ ΕΙΝΑΙ b
cur++; //ΠΗΓΑΙΝΕ ΣΤΟΝ ΕΠΟΜΕΝΟ ΧΑΡΑΚΤΗΡΑ
q3();//ΠΗΓΑΙΝΕ ΣΤΗΝ q3
}
else throw new Exception();
}
//ΚΑΤΑΣΤΑΣΗ q3
private void q3() throws Exception{
if (input.charAt(cur) == 'b'){ // ΑΝ Ο ΧΑΡΑΚΤΗΡΑΣ ΕΙΝΑΙ b
cur++; //ΠΗΓΑΙΝΕ ΣΤΟΝ ΕΠΟΜΕΝΟ ΧΑΡΑΚΤΗΡΑ
q3();//ΠΑΡΑΜΕΝΕΙ ΣΤΗΝ q3
}
else if(input.charAt(cur) == 'a'){ // ΑΝ Ο ΧΑΡΑΚΤΗΡΑΣ ΕΙΝΑΙ a
cur++; //ΠΗΓΑΙΝΕ ΣΤΟΝ ΕΠΟΜΕΝΟ ΧΑΡΑΚΤΗΡΑ
q4();//ΠΗΓΑΙΝΕ ΣΤΗΝ q4
}
else throw new Exception();
}
//ΚΑΤΑΣΤΑΣΗ q4
private void q4() throws Exception{
if (input.charAt(cur) == '$'){ // ΑΝ Ο ΧΑΡΑΚΤΗΡΑΣ ΕΙΝΑΙ $
;//ΔΕΝ ΚΑΝΩ ΤΙΠΟΤΑ ΕΙΝΑΙ ΣΤΟ ΤΕΛΟΣ ΤΗΣ ΣΥΜΒΟΛΟΣΕΙΡΑΣ
}
else throw new Exception();
}
public static void main(String[] args) {
LexTest lextest = new LexTest();//ΝΕΟ ΑΥΤΟΜΑΤΟ
//ΤΡΕΧΩ ΤΡΕΙΣ ΣΥΜΒΟΛΟΣΕΙΡΕΣ
lextest.nextToken("abba");
lextest.nextToken("abaaaba");
lextest.nextToken("abaabbb");
}
}
Η εκτέλεση του κώδικα για τρεις δοκιμαστικές συμβολοσειρές: abba , abaaaba, abaabbb δίνει αποτέλεσμα αποδοχής των δύο πρώτων και απόρριψης της τελευταίας.
Ο παραπάνω κώδικας μπορεί να χρησιμοποιηθεί για την περιγραφή οπουδήποτε αυτόματου αρκεί βέβαια να γίνουν οι κατάλληλες τροποποιήσεις και η προσαρμογή του στο εκάστοτε ζητούμενο αυτόματο.
Δημοσίευση σχολίου