Διαδρομές
/
Tcl
Tcl
/
Ασκήσεις
/
Αντιστοίχιση αγκυλών
Αντιστοίχιση αγκυλών

Αντιστοίχιση αγκυλών

Εύκολο

Εισαγωγή

Σου δίνεται η ευκαιρία να γράψεις λογισμικό για το Bracketeer™, ένα αρχαίο αλλά ισχυρό mainframe. Το λογισμικό που τρέχει πάνω του είναι γραμμένο σε μια ιδιόκτητη γλώσσα. Μεγάλο μέρος της σύνταξής του είναι οικείο, αλλά παρατηρείς πάρα πολλές αγκύλες, άγκιστρα και παρενθέσεις. Παρά το ότι το Bracketeer™ είναι ισχυρό, δεν έχει ευελιξία. Αν ο πηγαίος κώδικας έχει μη ισορροπημένες αγκύλες, άγκιστρα ή παρενθέσεις, το Bracketeer™ καταρρέει και πρέπει να το επανεκκινήσεις. Για να αποφύγεις ένα τέτοιο σενάριο, αρχίζεις να γράφεις κώδικα που μπορεί να επαληθεύσει ότι οι αγκύλες, τα άγκιστρα και οι παρενθέσεις είναι ισορροπημένες πριν προσπαθήσεις να τον τρέξεις στο Bracketeer™.

Οδηγίες

Δεδομένης μιας συμβολοσειράς που περιέχει αγκύλες [], άγκιστρα {}, παρενθέσεις (), ή οποιονδήποτε συνδυασμό αυτών, επαλήθευσε ότι όλα ανεξαιρέτως τα ζεύγη ταιριάζουν και είναι σωστά εμφωλευμένα. Οποιοιδήποτε άλλοι χαρακτήρες πρέπει να αγνοούνται. Για παράδειγμα, το "{what is (42)}?" είναι ισορροπημένο και το "[text}" δεν είναι.

Η Tcl είναι μια πολύ απλή γλώσσα, αλλά ο τρόπος με τον οποίο ο διερμηνευτής αναλύει τον κώδικα έχει μερικές δύσκολες οριακές περιπτώσεις.

Άγκιστρα

Τα άγκιστρα στην Tcl είναι απλώς ένας τρόπος να περικλείεις ένα μπλοκ κειμένου. Το κείμενο αυτό μπορεί να ερμηνευτεί ως κώδικας ή ως δεδομένα. Μέσα στα άγκιστρα μπορούν να εμφανιστούν εμφωλευμένα άγκιστρα, αλλά τα εμφωλευμένα άγκιστρα πρέπει να είναι ισορροπημένα. Η σελίδα man της Tcl λέει το εξής:

Τα άγκιστρα εμφωλεύονται μέσα στη λέξη: για κάθε επιπλέον άγκιστρο ανοίγματος πρέπει να υπάρχει ένα επιπλέον άγκιστρο κλεισίματος (ωστόσο, αν ένα άγκιστρο ανοίγματος ή κλεισίματος μέσα στη λέξη έχει διαφύγει με backslash, τότε δε μετριέται στον εντοπισμό του αντίστοιχου άγκιστρου κλεισίματος).

Η διατύπωση εκεί είναι αρκετά συγκεκριμένη: αν θέλεις να έχεις ένα άγκιστρο ανοίγματος ή κλεισίματος χωρίς ταίρι, πρέπει να το διαφύγεις με backslash. Οπότε μην κάνεις αυτό:

proc isOpenBrace {char} {
    return [expr {$char eq "{"}]
    # ......................^ will not work
}

Πρέπει να κάνεις το εξής:

proc isOpenBrace {char} {
    return [expr {$char eq "\{"}]
    # ......................^^ will work
}

Αυτό μπορεί να είναι προβληματικό εξαιτίας του τρόπου με τον οποίο η Tcl αναλύει τα σχόλια, ο οποίος διαφέρει από αυτόν των περισσότερων γλωσσών. Υπάρχει περισσότερη συζήτηση στο wiki της Tcl.

Αγκύλες

Παρομοίως, επειδή η Tcl χρησιμοποιεί αγκύλες για υποκατάσταση εντολών., ακόμα και μέσα σε συμβολοσειρές με διπλά εισαγωγικά, πρέπει να προσέχεις τη διαφυγή των αγκυλών ανοίγματος.

Παρενθέσεις

Με εξαίρεση τις μεταβλητές συσχετιστικών πινάκων, οι παρενθέσεις είναι απλώς συνηθισμένοι χαρακτήρες.


Πηγή

Ginna Baker
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Tcl Exercism

Έτοιμος να ξεκινήσεις την άσκηση Αντιστοίχιση αγκυλών;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Tcl με 135 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.