IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Split expression régulière


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2015
    Messages : 136
    Points : 52
    Points
    52
    Par défaut Split expression régulière
    salut tous le monde
    je suis entrain de programmer un analyseur lexical sous java
    pour un texte donné il me donne les mots clé les séparateur identificateur ect,par exemple public static void main ;
    public static void main sont des mot clé
    ; séparateur
    le soucis c'est au niveau du split
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabmot=chaine.split(" ");
    il prend pas en compte les mot collé par exemple String[ ], <=,
    il me faut une expression régulière qui traite tous les cas , j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabmot=chaine.split("\\[| ");
    le "[" du "String[ ]" est perdu !!!!

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Hello,

    les expressions régulières ne peuvent pas servir pour l'analyse lexicale.
    Il faut soit le programmer entièrement toi-même, soit utiliser une bibliothèque d'analyse lexicale/grammaticale, comme JavaCC.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2015
    Messages : 136
    Points : 52
    Points
    52
    Par défaut
    je suis obligé de la programmer moi même je veux juste savoir comment sa marche pour pouvoir continuer tous seul
    par exemple pour String[], je dois trouvé
    String
    [
    ]

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Tu dois analyser ta chaine caractère par caractère jusqu'à trouver un mot contenu dans ton dictionnaire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Points : 16 093
    Points
    16 093
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Tu dois analyser ta chaine caractère par caractère jusqu'à trouver un mot contenu dans ton dictionnaire.
    Et donc, si, par hasard, dans ton dictionnaire tu as "int" et "integer", tu fais comment pour différencier les deux?

    Mais la question n'est pas évidente. J'imagine qu'il faut essayer de déterminer toutes les possibilités, notament les tableaux avec les [], les fonctions avec les (), etc...

    Donc trouver quels sont les séparateurs (l'espace ou le saut de ligne souvent), quels sont les préfixes ou les suffixes qui existent, et les tester.

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Carhiboux Voir le message
    Et donc, si, par hasard, dans ton dictionnaire tu as "int" et "integer", tu fais comment pour différencier les deux?
    Ca c'est le niveaux 2 de l'analyse lexicale. Je ne voulais pas embrouiller le demandeur car sa demande est très vague. Mais puisque le soucis est soulevé, autant y répondre maintenant
    Voici une solution possible : lorsqu'un mot est trouvé, il faut vérifier si le dictionnaire contient un mot plus grand dont le préfixe vient d'être trouvé. Si non, alors le mot est trouvé, si oui alors vérifier un caractère supplémentaire du texte pour tenter d'y trouver un mot plus grand. Si aucun mot plus grand ne correspond, alors revenir en arrière sur le texte et prendre le mot initial.
    Mais la question n'est pas évidente. J'imagine qu'il faut essayer de déterminer toutes les possibilités, notament les tableaux avec les [], les fonctions avec les (), etc...
    Attention, il parle d'analyse lexicale, pas syntaxique. Lors de l'analyse lexicale, il n'y a pas de notion de tableau, fonction...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2015
    Messages : 136
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Tu dois analyser ta chaine caractère par caractère jusqu'à trouver un mot contenu dans ton dictionnaire.
    Salut dinobogan
    j'ai decouper mon fichier txt avec un split("\\s") , et j'ai mis tous les mot decouper dans un tableau tabmot
    j'ai implémenter 4 liste (mot clef identificateur séparateur opérateur)
    j'ai mis tous mes liste dans une Map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for(String mot : tabmot ) {
    		     Optional<ListePosition> position = ListePosition.chercher(listes, mot);
    		     if ( position.isPresent() ) {
    			position.ifPresent(e-> System.out.printf("%s[%d]\n", e.getNomListe(), e.getIndexDansLaListe()+1)); 
    		     }
    		     else {
    			System.out.println(mot+ " : mot introuvable " );
    		     }}
    comment faire pour decouper les mot collé par exemple String[]
    je dois avoir String mot clé , [ separateur , ] separateur !!!!

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Une analyse lexicale doit se faire caractère par caractère. Utiliser des expressions régulières est bien trop compliqué.
    Tu peux par exemple faire une analyse lexicale en plusieurs passe. La première passe va faire la séparation entre les identificateurs (au sens large) et les non-identificateurs.
    Un identificateur est une suite de caractères telle que ça commence par [a-zA-Z_] et continue par des lettres ou des chiffres. Lorsqu'un caractère autre que ça est trouvé, alors un identificateur est trouvé et mis de côté.
    Un "non-identificateur", c'est tout le reste. A ce niveau, tu pourrais tomber sur le problème d'un non-identificateur avec deux symboles comme l'incrémentation unaire en Java par exemple. Tu peux choisir de dire que ce genre de symbole est une suite de deux symboles distincts et c'est l'analyse grammaticale qui va s'en charger.
    La seconde passe va s'occuper de faire la différence entre les identificateurs : variable, mot-clé... Tu peux même dans cette passe faire des règles de collage pour les symboles successifs comme l'incrémentation unaire (si tu ne veux pas le faire dans l'analyse grammaticale).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2015
    Messages : 136
    Points : 52
    Points
    52
    Par défaut
    Une analyse lexicale doit se faire caractère par caractère. Utiliser des expressions régulières est bien trop compliqué.
    Tu peux par exemple faire une analyse lexicale en plusieurs passe. La première passe va faire la séparation entre les identificateurs (au sens large) et les non-identificateurs.
    c'est ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     ArrayList a1 = new ArrayList();
        ArrayList a2 = new ArrayList();
        ArrayList a3 = new ArrayList();
        ArrayList a7 = new ArrayList();
        ArrayList a5 = new ArrayList();
        ArrayList a6 = new ArrayList();
     
    	Map<String, List<String>> listes = new HashMap<>();
    	listes.put("mot clé",a1);
    	listes.put("spérateurs",a2);
    	listes.put("operateurs",a3);
    	listes.put("constante",a7);
    	listes.put("identificateur",a5);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String[]tabmot=null;
    	String tSep[]={";",",","{","}","(",")","[","]"};
    	String tope[]={"+","-","/","*","="};
    	String tcle[]={"public","static","void","main","String"};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Pattern p = Pattern.compile("[0-9]*\\.?[0-9]+");
     
    		for(int i=0; i<tabmot.length;i++){
    		if (p.matcher(tabmot[i]).matches()) {
    			a7.add(tabmot[i]);
     
    		}
     
    		}System.out.println( "les constantes sont :");
    		for( int i  = 0; i < a7.size(); i++)
    	    {
    		      System.out.println( a7.get(i));
    		    }
    Pattern k = Pattern.compile("^[A-Za-z][A-Za-z0-9]*");
     
    		for(int i=0; i<tabmot.length;i++){
    		if (k.matcher(tabmot[i]).matches()) {
    			if((a1.contains(tabmot[i]))==false 
    					&& (a2.contains(tabmot[i]))==false 
    					&& (a3.contains(tabmot[i]))==false 
    					&& (a7.contains(tabmot[i]))==false
     
    )			
    			a5.add(tabmot[i]);
     
    		}
     
    		}System.out.println( "les identificateurs sont :");
    		for( int i  = 0; i < a5.size(); i++)
    	    {
    		      System.out.println( a5.get(i));
    		    }
    maintenat le problème c'est quand mon tabmot contient par exemple String[] il ne le trouve dans aucune liste il doit le decouper String mot clef [ separateur ] separateur !!!!
    je fais comment ?

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Mais justement, tabmot ne devrait pas contenir String[], il devrait contenir String puis [ puis ]

    Quant aux séparateurs, ça ne sert à rien de les reconnaître, ils servent uniquement à se rendre compte que le mot-clé ou l'identifiant s'arrête là.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2015
    Messages : 136
    Points : 52
    Points
    52
    Par défaut
    Notre Prof nous oblige a les reconnaitre !
    pour le String[] je fais comment pour que mon tabmot contient que String , [, ] ?

  12. #12
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par abbescr7 Voir le message
    Notre Prof nous oblige a les reconnaitre !
    pour le String[] je fais comment pour que mon tabmot contient que String , [, ] ?
    Je t'ai déjà expliqué deux fois. Ta technique d'approche n'est pas la bonne.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2015
    Messages : 136
    Points : 52
    Points
    52
    Par défaut
    j'ai pas le choix je dois continuer comme ça !!
    d'apres mon prof je dois faire juste une petite modification pour que le String[] soit decoupé
    j'ai mit split(\\[|\\s) seulement il me donne String ] le "[" est perdu si on peux dire sa

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Points : 16 093
    Points
    16 093
    Par défaut
    Salut,

    visiblement, tu ne nous donnes pas toutes les consignes que ton prof te donnes. Pourquoi tu ne vas pas lui demander à lui directement? Cela irait beaucoup plus vite, et tu pourrais savoir ce que lui veut. Ce qui n'est peut être pas la même chose que les bonnes pratiques proposées par dinobogan et Thelvin.

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2015
    Messages : 136
    Points : 52
    Points
    52
    Par défaut
    Salut
    bin notre prof nous demande de faire un analyseur lexical d'apres elle j'ai fais 90 pour cent du travail je dois trouvé une astuce ( expression reguliere) qui traitent tous les cas comme les mots collé String[]
    Question :
    comment dois je faire !
    je peux faire une deuxième découpe apres tabmot ?

Discussions similaires

  1. Expression régulière pour "éclater" (split) une chaîne
    Par SergioMaster dans le forum Langage
    Réponses: 26
    Dernier message: 01/10/2015, 20h59
  2. Réponses: 1
    Dernier message: 05/08/2015, 09h59
  3. Réponses: 4
    Dernier message: 26/05/2014, 15h52
  4. Split et expression régulière
    Par MaitrePylos dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2007, 14h47
  5. Réponses: 5
    Dernier message: 11/06/2002, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo