Quelles sont les différentes méthodes pour analyser des chaînes en Java?

voix
43

Pour l' analyse syntaxique des commandes de joueur, je suis le plus souvent utilisé la scission méthode pour diviser une chaîne par délimiteurs puis à ensuite déterminer tout le reste par une série de ifs ou switches. Quels sont les différentes façons de chaînes d' analyse syntaxique Java?

Créé 06/08/2008 à 00:49
source utilisateur
Dans d'autres langues...                            


15 réponses

voix
19

J'aime vraiment des expressions régulières. Tant que les chaînes de commandes sont assez simples, vous pouvez écrire quelques expressions rationnelles qui pourraient prendre quelques pages de code pour analyser manuellement.

Je vous suggère de vérifier http://www.regular-expressions.info pour une bonne introduction à regexes, ainsi que des exemples spécifiques pour Java.

Créé 06/08/2008 à 00:54
source utilisateur

voix
14

Je suppose que vous essayez de rendre l'interface de commande aussi indulgent que possible. Si tel est le cas, je vous suggère d'utiliser un algorithme similaire à ceci:

  1. Lire dans la chaîne
    • Diviser la chaîne en jetons
    • Utilisez un dictionnaire pour convertir des synonymes à une forme commune
    • Par exemple, convertir « hit », « coup de poing », « grève » et « kick » tout « frapper »
    • Effectuer des actions sur une base non ordonnée, y compris
    • Unordered - « coup de poing le singe face » est la même chose que « le visage dans le poinçon de singe »
    • Inclusive - Si la commande est censé être « coup de poing le singe au visage » et ils fournissent « singe punch », vous devriez vérifier combien de commandes cela correspond. Si une seule commande, faire cette action. Il pourrait même être une bonne idée d'avoir des priorités de commandement, et même s'il y avait même les matches, il exécuterait l'action de haut.
Créé 06/08/2008 à 01:42
source utilisateur

voix
13

L'analyse syntaxique est manuellement beaucoup de plaisir ... au début :)

Dans la pratique , si les commandes ne sont pas très sophistiqué , vous pouvez les traiter de la même façon que ceux utilisés dans les interprètes de ligne de commande. Il y a une liste des bibliothèques que vous pouvez utiliser: http://java-source.net/open-source/command-line . Je pense que vous pouvez commencer par communes apache CLI ou args4j (utilise des annotations). Ils sont bien documentés et très simple d'utilisation. Ils gèrent automatiquement l' analyse syntaxique et la seule chose que vous devez faire est de lire des domaines particuliers dans un objet.

Si vous avez des commandes plus sophistiquées, puis peut - être créer une grammaire formelle serait une meilleure idée. Il y a une très bonne bibliothèque avec l' éditeur graphique, débogueur et interprète pour les grammaires. Il est appelé ANTLR (et l'éditeur ANTLRWorks ) et il est gratuit :) Il y a aussi quelques exemples de grammaires et des tutoriels.

Créé 30/08/2008 à 23:26
source utilisateur

voix
7

Je regardais les migrations Java de Zork , et se pencher vers d' un simple processeur de langage naturel (moteur , soit par tokenizing ou regex) telles que les suivantes (de ce lien):

    simpleNLP booléenne public static (String inputline, mots-clés String [])
    {
        int i;
        int maxToken = keywords.length;
        int pour, à partir de;
        if (inputline.length () = inputline.length ()) return false; // vérifier les lignes vides et vides
        tandis que (à> = 0)
        {
            to = inputline.indexOf ( » », à partir de);
            si (à> 0) {
                lexed.addElement (inputline.substring (de, pour));
                de = à;
                tandis que (inputline.charAt (de) == ''
                && de = keywords.length) {status = true; Pause;}
            }
        }
        le statut de retour;
    }

...

Tout ce qui donne un programmeur une raison de regarder Zork est à nouveau bien dans mon livre, il suffit de regarder pour Grues.

...

Créé 06/08/2008 à 01:16
source utilisateur

voix
6

Un autre vote pour ANTLR / ANTLRWorks. Si vous créez deux versions du fichier, l'un avec le code Java pour exécuter réellement les commandes, et un sans (avec juste la grammaire), alors vous avez une spécification exécutable de la langue, ce qui est excellent pour les tests, une aubaine pour la documentation , et un grand gain de temps si vous décidez de le porter.

Créé 31/08/2008 à 02:38
source utilisateur

voix
6

Soleil lui-même recommande de rester loin de StringTokenizer et en utilisant la méthode String.spilt à la place.

Vous aurez également regarder la classe modèle.

Créé 06/08/2008 à 17:14
source utilisateur

voix
4

Essayez JavaCC un générateur d'analyseur pour Java.

Il a beaucoup de fonctionnalités pour les langues d'interprétation, et il est bien pris en charge sur Eclipse.

Créé 31/08/2008 à 20:45
source utilisateur

voix
4

Si cela est d'analyser les lignes de commande , je suggère d' utiliser Commons Cli .

La bibliothèque CLI Apache Commons fournit une API pour le traitement des interfaces de ligne de commande.

Créé 31/08/2008 à 02:05
source utilisateur

voix
2

@CodingTheWheel Heres votre code, un peu nettoyer et par Eclipse ( ctrl+ shift+ f) et le réinséré ici :)

Y compris les quatre espaces devant chaque ligne.

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;
}
Créé 06/08/2008 à 16:18
source utilisateur

voix
1

Procédé fendu peut diviser une chaîne de caractères dans un tableau de l'expression de la chaîne spécifiée regex. Ses arguments sous deux formes, à savoir: split ( String regex) et split ( String regex, int limit), qui divisent ( String regex) est en fait en appelant split (chaîne regex, limite int) pour atteindre, limite est 0 . Puis, lorsque la limite> 0 et limite <0 représente quoi?

Lorsque le jdk expliqué: Lorsque limit> 0 sous-ensemble des longueurs allant jusqu'à limiter, qui est, si possible, peut être limite une sous-division, restant comme une sous - chaîne ( à l' exception de limite-1 fois le caractère a extrémité fendue chaîne) ;

limite <0 indique aucune limite sur la longueur de la matrice;

limite = 0 fin de la chaîne chaîne vide sera tronquée. StringTokenizerclasse est pour des raisons de compatibilité et est préservée classe héritage, nous devons donc essayer d'utiliser la méthode du partage de la classe String. consultez le lien

Créé 13/05/2014 à 15:13
source utilisateur

voix
1

Si votre texte contient des délimiteurs alors vous pouvez votre splitméthode.
Si le texte contient des chaînes irrégulières signifie un format différent en elle , alors vous devez utiliser regular expressions.

Créé 24/11/2012 à 10:17
source utilisateur

voix
1

JCommander semble assez bonne, même si je dois encore tester.

Créé 20/08/2010 à 14:59
source utilisateur

voix
1

Si la langue est simple comme mort juste

VERBE NOM

puis le fractionnement à la main fonctionne bien.

Si c'est plus complexe, vous devriez vraiment regarder dans un outil comme ANTLR ou JavaCC.

J'ai un tutoriel sur ANTLR (v2) à http://javadude.com/articles/antlrtut qui vous donnera une idée de la façon dont cela fonctionne.

Créé 16/09/2008 à 16:35
source utilisateur

voix
1

Lorsque le séparateur chaîne de la commande est AllWays la même chaîne ou char (comme le « ; ») y Recomend vous utilisez la classe StrinkTokenizer:

StringTokenizer

mais lorsque le séparateur varie ou est Recomend complexe y vous d'utiliser les réguliers expresions, Wich peut être utilisé par la classe de chaîne elle-même, split méthode, depuis la version 1.4. Il utilise la classe de modèle à partir du package java.util.regex

Modèle

Créé 06/08/2008 à 16:40
source utilisateur

voix
1

Une simple chaîne tokenizer sur les espaces devrait fonctionner, mais il y a vraiment beaucoup de façons dont vous pouvez le faire.

Voici un exemple en utilisant un 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);
}

Ensuite, les jetons peuvent encore être utilisés pour les arguments. Tout cela suppose pas d'espaces sont utilisés dans les arguments ... alors vous pourriez vouloir rouler votre propre mécanisme d'analyse syntaxique simple (comme obtenir le premier des espaces et en utilisant du texte avant que l'action, ou en utilisant une expression régulière si vous ne vous dérange pas coup de vitesse), juste abstrait dehors il peut être utilisé partout.

Créé 06/08/2008 à 00:57
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more