
Για την ανάλυση εντολές παίκτης, έχω χρησιμοποιήσει τις περισσότερες φορές τη [διάσπαση](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29) μέθοδος για να χωρίσει μια σειρά από διαχωριστικά και στη συνέχεια στη συνέχεια, μόλις καταλάβω τα υπόλοιπα από μια σειρά `if`s ή `switch`es. Ποιες είναι οι διαφορετικοί τρόποι ανάλυσης χορδές σε Java;

 
Ποιες είναι οι διαφορετικές μέθοδοι για να αναλύσει χορδές σε Java;
===================================================================



Υποθέτω ότι προσπαθείτε να κάνετε το περιβάλλον εντολή ως επιεικής δυνατόν. Αν αυτή είναι η περίπτωση, σας προτείνω να χρησιμοποιήσετε έναν αλγόριθμο παρόμοιο με αυτό:


1. Διαβάστε στο κορδόνι
	* Χωρίστε το string σε μάρκες
	* Χρησιμοποιήστε ένα λεξικό για να μετατρέψετε τα συνώνυμα σε μια κοινή μορφή
	* Για παράδειγμα, μετατροπή «χτύπησε», «γροθιά», «απεργία», και «κλωτσιά» όλα για να «χτυπήσει»
	* Εκτελέστε ενέργειες σε ένα μη διατεταγμένο, χωρίς αποκλεισμούς βάση
	* **Μη αριθμημένη** - «γροθιά τον πίθηκο στο πρόσωπο» είναι το ίδιο πράγμα όπως «το πρόσωπο στο γροθιά μαϊμού»
	* **Inclusive** - Εάν η εντολή είναι υποτίθεται ότι είναι «γροθιά τον πίθηκο στο πρόσωπο» και παρέχουν «μαϊμού γροθιά», θα πρέπει να ελέγξετε πόσες εντολές αυτή ταιριάζει. Εάν μόνο μία εντολή, να κάνει αυτή την ενέργεια. Θα μπορούσε ακόμη και να είναι μια καλή ιδέα να έχουμε προτεραιότητες εντολή, ακόμη και αν υπήρχαν ακόμη αγώνες, θα εκτελέσει την κορυφή δράση.

 

Μου αρέσει πολύ κανονικές εκφράσεις. Εφ 'όσον οι χορδές εντολή είναι αρκετά απλή, μπορείτε να γράψετε μερικές regexes που θα μπορούσε να πάρει μερικές σελίδες του κώδικα για να αναλύσει το χέρι.


Θα ήθελα να προτείνω να ελέγξετε έξω <http://www.regular-expressions.info> για μια καλή εισαγωγή για να regexes, καθώς και συγκεκριμένα παραδείγματα για Java.

 

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


Εδώ είναι ένα παράδειγμα χρησιμοποιώντας ένα tokenizer:



```
String command = "kick person";
StringTokenizer tokens = new StringTokenizer(command);
String action = null;

if (tokens.hasMoreTokens()) {
    action = tokens.nextToken();
}

if (action != null) {
    doCommand(action, tokens);
}

```

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

 

Θα εξετάσουμε [Java μεταναστεύσεις](http://www.google.com/search?q=Zork+in+Java) των [Zork](http://en.wikipedia.org/wiki/Zork) , και κλίνει προς την κατεύθυνση μιας απλής [φυσικής γλώσσας Επεξεργαστής](http://en.wikipedia.org/wiki/Natural_language_processing) (οδηγείται είτε από tokenizing ή regex), όπως οι εξής (από αυτόν τον σύνδεσμο):



```
    δημόσια στατική boolean simpleNLP (String inputline, String λέξεις-κλειδιά [])
 {
 int i?
 int maxToken = keywords.length?
 int προς, από?
 εάν (inputline.length () = inputline.length ()) return false? // έλεγχος για κενό και κενές γραμμές
 ενώ (σε> = 0)
 {
 να = inputline.indexOf (»», από)?
 εάν (έως> 0) {
 lexed.addElement (inputline.substring (από, προς))?
 από = έως?
 ενώ (inputline.charAt (από) == ''
 && από = keywords.length) {κατάσταση = true? Διακοπή;}
 }
 }
 καθεστώς επιστρέψει?
 }

```

...


Οτιδήποτε που δίνει ένας προγραμματιστής ένα λόγο για να δούμε Zork και πάλι είναι καλό στο βιβλίο μου, απλά προσέξτε για Grues.


...

 

@CodingTheWheel Heres κωδικό σας, λίγο καθαρισμό και μέσω της έκλειψης ( `ctrl`+ `shift`+ `f`) και η εισαχθεί ξανά εδώ :)


Συμπεριλαμβανομένων των τεσσάρων χώρων μπροστά κάθε γραμμή.



```
public static boolean simpleNLP(String inputline, String keywords[]) {
    if (inputline.length() < 1)
        return false;

    List<String> lexed = new ArrayList<String>(); 
    for (String ele : inputline.split(" ")) {
        lexed.add(ele);
    }


    boolean status = false;
    to = 0;
    for (i = 0; i < lexed.size(); i++) {
        String s = (String) lexed.get(i);
        if (s.equalsIgnoreCase(keywords[to])) {
            to++;
            if (to >= keywords.length) {
                status = true;
                break;
            }
        }
    }
    return status;
}

```
 

Όταν το String διαχωρισμού για την εντολή είναι allways το ίδιο String ή char (όπως το «?») Y συνιστούμε να χρησιμοποιήσετε την κλάση StrinkTokenizer:


[StringTokenizer](http://java.sun.com/javase/6/docs/api/java/util/StringTokenizer.html)


αλλά όταν ο διαχωριστής ποικίλλει ή είναι πολύπλοκο y Recomend μπορείτε να χρησιμοποιήσετε τις τακτικές expresions, διασκορπισμένες μπορούν να χρησιμοποιηθούν από την ίδια την String τάξη, μέθοδος διάσπαση, δεδομένου ότι 1.4. Χρησιμοποιεί την κλάση Pattern από το πακέτο java.util.regex


[Πρότυπο](http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html)

 

η ίδια Sun συνιστά να μείνετε μακριά από StringTokenizer και χρησιμοποιώντας τη μέθοδο String.spilt αντ 'αυτού. 


Θα ήθελα επίσης να εξετάσουμε την κατηγορία μοτίβο.

 

Την ανάλυση με το χέρι είναι πολύ διασκεδαστικό ... στην αρχή :) 


Στην πράξη, αν οι εντολές δεν είναι πολύ εξελιγμένα, μπορείτε να τους αντιμετωπίσουμε με τον ίδιο τρόπο όπως αυτά που χρησιμοποιούνται σε διερμηνείς γραμμή εντολών. Υπάρχει μια λίστα με τις βιβλιοθήκες που μπορείτε να χρησιμοποιήσετε: <http://java-source.net/open-source/command-line> . Νομίζω ότι μπορείτε να ξεκινήσετε με [κοινά apache CLI](http://commons.apache.org/cli) ή [args4j](http://args4j.kohsuke.org/) (χρησιμοποιεί σχολιασμούς). Είναι καλά τεκμηριωμένο και πολύ απλό στη χρήση. Που χειρίζονται την ανάλυση αυτόματα και το μόνο πράγμα που χρειάζεται να κάνετε είναι να διαβάσετε συγκεκριμένους τομείς σε ένα αντικείμενο.


Αν έχετε πιο εξελιγμένα εντολές, τότε ίσως η δημιουργία μιας επίσημης γραμματικής θα είναι μια καλύτερη ιδέα. Υπάρχει μια πολύ καλή βιβλιοθήκη με γραφικό επεξεργαστή, εντοπισμού σφαλμάτων και διερμηνέας για γραμματικές. Αυτό λέγεται [ANTLR](http://www.antlr.org/) (και ο συντάκτης [ANTLRWorks](http://www.antlr.org/works/index.html) ) και είναι δωρεάν :) Υπάρχουν επίσης ορισμένα παράδειγμα γραμματικές και tutorials.

 

Εάν αυτό είναι να αναλύσει τις γραμμές εντολών θα ήθελα να προτείνω τη χρήση [Commons Cli](http://commons.apache.org/cli/) .



> 
> Η βιβλιοθήκη Apache Commons CLI παρέχει ένα API για την επεξεργασία των διασυνδέσεων της γραμμής εντολών. 
> 
> 
> 

 

Μια άλλη ψηφοφορία για ANTLR / ANTLRWorks. Αν δημιουργήσετε δύο εκδόσεις του αρχείου, ένα με τον κώδικα της Java για την πραγματική εκτέλεση των εντολών, και ένα χωρίς (μόνο με την γραμματική), τότε έχετε ένα εκτελέσιμο προδιαγραφές της γλώσσας, η οποία είναι μεγάλη για τη δοκιμή, ένα όφελος για την τεκμηρίωση , και ένα μεγάλο γλιτώνουν χρόνο, αν ποτέ αποφασίσει να το λιμάνι αυτό.

 

Δοκιμάστε [JavaCC](https://java.net/projects/javacc) μια γεννήτρια parser για Java.


Έχει πολλά χαρακτηριστικά για την ερμηνεία γλώσσες, και είναι καλά υποστηρίζεται σε Eclipse.

 

Αν η γλώσσα είναι νεκρός απλό, όπως ακριβώς 


ΡΗΜΑ ΟΥΣΙΑΣΤΙΚΟ


Στη συνέχεια διαχωρισμό με το χέρι λειτουργεί καλά.


Αν είναι πιο περίπλοκη, θα πρέπει πραγματικά να εξετάσουμε ένα εργαλείο όπως το ANTLR ή JavaCC.


Έχω ένα σεμινάριο για ANTLR (v2) σε <http://javadude.com/articles/antlrtut> που θα σας δώσει μια ιδέα για το πώς λειτουργεί.

 

[JCommander](http://beust.com/jcommander/) φαίνεται αρκετά καλό, αν και έχω ακόμα να το δοκιμάσετε.

 

Αν το κείμενο σας περιέχει κάποια διαχωριστικά, στη συνέχεια, μπορείτε να σας `split`μέθοδο.   

Αν το κείμενο περιέχει ακανόνιστες σειρές σημαίνει διαφορετική μορφή σε αυτό τότε θα πρέπει να χρησιμοποιήσετε `regular expressions`.

 

Διαίρεση μέθοδος μπορεί να χωρίσει μια σειρά σε μια σειρά της καθορισμένης έκφρασης substring `regex`. Τα επιχειρήματά της σε δύο μορφές, δηλαδή: διάσπαση ( `String regex`) και διαχωρισμού ( `String regex, int limit`), η οποία χωρίζεται ( `String regex`) είναι στην πραγματικότητα καλώντας διάσπαση (String regex, όριο int) για την επίτευξη, *το όριο είναι 0* . Στη συνέχεια, όταν το *όριο> 0* και *το όριο <0* αντιπροσωπεύει αυτό;


Όταν το **JDK** εξήγησε: όταν *όριο> 0* υπο-συστοιχία μήκη μέχρι να περιορίσει, ότι είναι, αν είναι δυνατόν, μπορεί να είναι *το όριο-1* υπο-διαίρεση, παραμένουσα ως δευτερεύουσα συμβολοσειρά (εκτός από το όριο-1 φορές ο χαρακτήρας έχει συμβολοσειρά χωρίσει τέλος) ?


*όριο <0* δεικνύει ότι δεν υπάρχει όριο στο μήκος του πίνακα?


*όριο = 0* τέλος της συμβολοσειράς κενή συμβολοσειρά θα περικοπεί. 
`StringTokenizer`κατηγορία είναι για λόγους συμβατότητας και σώζεται κληρονομιά τάξη, γι 'αυτό θα πρέπει να προσπαθήσει να χρησιμοποιήσει τη μέθοδο διαχωρισμού της τάξης String. αναφέρονται σε [σύνδεση](http://codingkit.com/java/9529.html)

 