1. Κατανόηση της γλώσσας:
* Καθορίστε τυπικά τη γλώσσα: Όσο πιο ακριβής είναι η κατανόησή σας για τη γλώσσα, τόσο το καλύτερο. Αυτό περιλαμβάνει:
* Ποιες είναι οι έγκυρες χορδές στη γλώσσα;
* Ποια μοτίβα υπάρχουν μέσα σε αυτές τις χορδές;
* Ποιοι είναι οι περιορισμοί; (π.χ., χωρίς επανάληψη, πρέπει να ξεκινήσει/να τελειώσει με συγκεκριμένα σύμβολα)
* Δημιουργήστε παραδείγματα: Δημιουργήστε ένα αντιπροσωπευτικό σύνολο συμβολοσειρών που ανήκουν στη γλώσσα. Επίσης, προσδιορίστε τις χορδές που * δεν ανήκουν στη γλώσσα. Αυτά τα αρνητικά παραδείγματα μπορούν να σας βοηθήσουν να βελτιώσετε τη γραμματική σας.
* Εξετάστε τις περιπτώσεις άκρων: Δώστε ιδιαίτερη προσοχή στη συντομότερη δυνατή συμβολοσειρά στη γλώσσα, στην κενή συμβολοσειρά (αν υπάρχει) και σε χορδές με επαναλαμβανόμενα πρότυπα.
2. Προσδιορισμός των αναδρομικών δομών:
Τα CFG είναι καλά στον καθορισμό δομών αναδρομικά. Αναζητώ:
* αυτο-ενσωματωμένη: Η γλώσσα επιτρέπει σε μια συμβολοσειρά να περιέχεται μέσα σε μια σειρά του ίδιου τύπου; Για παράδειγμα, σε μια γλώσσα ισορροπημένων παρενθέσεων, το `(()) περιέχει` () `.
* Φυσικές δομές: Υπάρχουν δομές που είναι ένθετες μεταξύ τους, όπως οι ένθετες δηλώσεις `if-else 'σε γλώσσες προγραμματισμού ή σωστά αντιστοιχισμένες ετικέτες XML;
* επανάληψη: Η γλώσσα επιτρέπει έναν αυθαίρετο αριθμό επαναλήψεων ενός συγκεκριμένου συμβόλου ή ακολουθίας συμβόλων;
* Εναλλαγή: Η γλώσσα επιτρέπει την επιλογή μεταξύ διαφορετικών μοτίβων ή στοιχείων;
3. Κατασκευή των κανόνων γραμματικής (κανόνες παραγωγής):
* Ξεκινήστε με το σύμβολο εκκίνησης: Συμβατικά, αυτό είναι `s`. Αυτό αντιπροσωπεύει οποιαδήποτε συμβολοσειρά στη γλώσσα.
* Καταρρίψτε τη γλώσσα: Αρχίστε να αποσυντεθείτε τη γλώσσα σε μικρότερα, πιο εύχρηστα στοιχεία.
* τερματικά έναντι μη τερματικών:
* τερματικά: Αυτά είναι τα πραγματικά σύμβολα από το αλφάβητο της γλώσσας (π.χ. `a`,` b`, `0`,` 1`, `(`, `)`). Τα τερματικά δεν αντικατασταθούν.
* Μη τερματικά: Αυτές είναι μεταβλητές που αντιπροσωπεύουν τμήματα της δομής της γλώσσας. Είναι * αντικαθίστανται από άλλα τερματικά και/ή μη τερματικά.
* Δημιουργία κανόνων (παραγωγές): Κάθε κανόνας έχει τη μορφή «μη τερματική-> ακολουθία τερματικών και μη τερματικών». Αυτό σημαίνει ότι το μη τερματικό στην αριστερή πλευρά μπορεί να αντικατασταθεί από την ακολουθία στη δεξιά πλευρά.
* Κοινές τεχνικές:
* επανάληψη για επανάληψη: `A -> aa | ε `(δημιουργεί οποιοδήποτε αριθμό 'Α, συμπεριλαμβανομένου κανένας (ε είναι η κενή συμβολοσειρά)))
* Εναλλαγή χρησιμοποιώντας `|`: `A -> a | B` (μπορεί να είναι είτε «Α» είτε «Β»)
* Συνδυάζοντας μοτίβα: `S -> asb | ε "(δημιουργεί χορδές με ίσους αριθμούς 'a και' b στη σειρά` a ... b`)
* χειριστείτε συγκεκριμένες περιπτώσεις: Μερικές φορές, χρειάζεστε κανόνες για την αντιμετώπιση συγκεκριμένων περιπτώσεων ή ακραίων περιπτώσεων της γλώσσας (π.χ. η βασική περίπτωση σε έναν αναδρομικό ορισμό).
* Πολλαπλά μη τερματικά: Μην διστάσετε να χρησιμοποιήσετε πολλαπλά μη τερματικά για να αντιπροσωπεύετε διαφορετικά μέρη της γλώσσας. Αυτό μπορεί να απλοποιήσει σημαντικά τη γραμματική.
4. Δοκιμές και βελτίωση:
* Δημιουργία χορδών: Χρησιμοποιήστε τη γραμματική για να δημιουργήσετε χορδές. Ξεκινήστε με το σύμβολο εκκίνησης και εφαρμόζετε επανειλημμένα τους κανόνες μέχρι να έχετε μια σειρά μόνο τερματικών. Αυτές οι χορδές ανήκουν στη γλώσσα;
* Παραδείγματα αναλύσεων: Προσπαθήστε να αναλύσετε χορδές στη γλώσσα χρησιμοποιώντας τη γραμματική. Μπορείτε να αντλήσετε τη συμβολοσειρά από το σύμβολο εκκίνησης χρησιμοποιώντας τους κανόνες;
* Δοκιμή με αρνητικά παραδείγματα: Προσπαθήστε να δημιουργήσετε χορδές που * δεν πρέπει να είναι στη γλώσσα. Η γραμματική δεν θα πρέπει * να είναι σε θέση να τους παράγει.
* Βελτιώστε τη γραμματική: Εάν η γραμματική παράγει λανθασμένες χορδές ή δεν παράγει έγκυρες, προσαρμόστε τους κανόνες. Αυτή είναι μια επαναληπτική διαδικασία.
* Ελέγξτε για ασάφεια: Μια γραμματική είναι διφορούμενη αν υπάρχουν περισσότερα από ένα δέντρο αναλύσεων για την ίδια συμβολοσειρά. Η ασάφεια μπορεί να οδηγήσει σε προβλήματα κατά τη χρήση της γραμματικής για ανάλυση. Εάν είναι δυνατόν, προσπαθήστε να αφαιρέσετε την ασάφεια. Ωστόσο, ορισμένες γλώσσες είναι εγγενώς διφορούμενες.
Παράδειγμα:Γλώσσα των palindromes (πάνω από το αλφάβητο {a, b})
1. Γλώσσα: Τα Palindromes είναι χορδές που διαβάζουν τα ίδια προς τα εμπρός και προς τα πίσω (π.χ. "Aba", "Abba", "A", "B", "").
2. Παραδείγματα:
* Έγκυρο:`", "A", "B", "AA", "BB", "Aba", "Abba", "Baab", "Ababa" `
* Μη έγκυρο:`" ab "," abc "`
3. Αναδρομική δομή: Ένα παλινδρόμιο μπορεί να κατασκευαστεί από:
* Μια κενή συμβολοσειρά
* Ένας μοναδικός χαρακτήρας ('a' ή 'b')
* Προσθήκη του ίδιου χαρακτήρα και στα δύο άκρα ενός μικρότερου παλινδρόμου.
4. Γραμματική:
`` `
S -> asa | BSB | α | B | ε
`` `
* `S 'είναι το σύμβολο εκκίνησης.
* `asa` δημιουργεί ένα palindrome με 'a' στην αρχή και το τέλος, με ένα άλλο (μικρότερο) palindrome στη μέση.
* Το "BSB` δημιουργεί ένα Palindrome με" Β "στην αρχή και στο τέλος, με ένα άλλο (μικρότερο) Palindrome στη μέση.
* `a` και` b` χειρίζονται τα palindromes ενός χαρακτήρα.
* `ε` χειρίζεται την κενή συμβολοσειρά palindrome.
Παράδειγμα:γλώσσα ισορροπημένων παρενθέσεων
1. Γλώσσα: (()) `.
2. Παραδείγματα:
* Έγκυρο:`` `,` () `,` (()) `,` () () () `,` ((())) `,` () () ()) `
* INVALID:`(`, `)`, `) (`, `(()`
3. Αναδρομική δομή:
* Μια κενή συμβολοσειρά.
* Ένα ζευγάρι παρενθέσεων `()` που περικλείει μια ισορροπημένη συμβολοσειρά παρενθέσεων.
* Δύο ισορροπημένες παρενθέσεις συμβολοσειρές.
4. Γραμματική:
`` `
S -> (ε) | SS | ε
`` `
* `S 'είναι το σύμβολο εκκίνησης.
* `(S)` Δημιουργεί μια ισορροπημένη χορδή που περιβάλλεται από παρενθέσεις.
* Το SS` δημιουργεί δύο ισορροπημένες χορδές που συνδέονται.
* `ε` δημιουργεί την κενή συμβολοσειρά.
Συμβουλές και κοινά σχέδια:
* ίσοι αριθμοί συμβόλων: Γλώσσες όπως {a
* Περισσότεροι περίπλοκοι περιορισμοί: Για γλώσσες με πιο σύνθετους περιορισμούς (π.χ.,
n
B
* Πρακτική: Όσο περισσότερο ασκείτε, τόσο περισσότερο θα αναπτύξετε μια διαίσθηση για το πώς να δημιουργήσετε CFGs.
* Σχεδιάστε τα δέντρα: Η απεικόνιση των δέντρων μπορεί να σας βοηθήσει να κατανοήσετε πώς η γραμματική παράγει χορδές και να εντοπίσει πιθανά προβλήματα.
* Χρησιμοποιήστε εργαλεία: Υπάρχουν διαθέσιμα εργαλεία λογισμικού που μπορούν να σας βοηθήσουν να δοκιμάσετε και να εντοπίσετε εντοπισμό των γραμματικών σας.
Συνοπτικά, η εύρεση ενός CFG είναι μια επαναληπτική διαδικασία που απαιτεί μια σταθερή κατανόηση της γλώσσας -στόχου, την ταυτοποίηση των αναδρομικών δομών και την προσεκτική κατασκευή και δοκιμή των κανόνων γραμματικής. Καλή τύχη!
Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα