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

Langage Java Discussion :

Parsing 'intelligent' de chaine


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Inscrit en
    Mai 2002
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mai 2002
    Messages : 328
    Par défaut Parsing 'intelligent' de chaine
    Bonjour,

    Je voudrais parser une chaine du type : 2 + "toto + " + "4+".

    Dans un premier temps, je me dis qu'il serait bien de séparer les tokens :
    2
    toto +
    4+

    Du coup, il faudra que je sois capable de splitter cette chaine, sans prendre en compte les "+" qui sont à l'intérieur des chaines...

    Une idée d'une classe Java qui pourrait m'aider ?

    Toine

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Euh, je sais pas trop ce que tu te figures, mais il y a rien qui sépare ton 2 et ton toto, là.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé

    Inscrit en
    Mai 2002
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mai 2002
    Messages : 328
    Par défaut
    Il y a un "+"

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    ça ressemble vaguement à de l'interprétation de code... c'est quoi le besoin fonctionnel? y'a sûrement moyen de simplifier, parce que là.... aie aie aie...

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    C'est de l'analyse syntaxique. En général, on voit cela en école pendant les cours liés à la définition d'un langage.

    Le parser le plus connue étant JFlex


    Celui-ci fait tout le travail une fois qu'on a définit le lexique du langage à parser cela à cette tête :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    /* JFlex example: part of Java language lexer specification */
    import java_cup.runtime.*;
     
    /**
     * This class is a simple example lexer.
     */
    %%
     
    %class Lexer
    %unicode
    %cup
    %line
    %column
     
    %{
      StringBuffer string = new StringBuffer();
     
      private Symbol symbol(int type) {
        return new Symbol(type, yyline, yycolumn);
      }
      private Symbol symbol(int type, Object value) {
        return new Symbol(type, yyline, yycolumn, value);
      }
    %}
     
    LineTerminator = \r|\n|\r\n
    InputCharacter = [^\r\n]
    WhiteSpace     = {LineTerminator} | [ \t\f]
     
    /* comments */
    Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment}
     
    TraditionalComment   = "/*" [^*] ~"*/" | "/*" "*"+ "/"
    // Comment can be the last line of the file, without line terminator.
    EndOfLineComment     = "//" {InputCharacter}* {LineTerminator}?
    DocumentationComment = "/**" {CommentContent} "*"+ "/"
    CommentContent       = ( [^*] | \*+ [^/*] )*
     
    Identifier = [:jletter:] [:jletterdigit:]*
     
    DecIntegerLiteral = 0 | [1-9][0-9]*
     
    %state STRING
     
    %%
     
    /* keywords */
    <YYINITIAL> "abstract"           { return symbol(sym.ABSTRACT); }
    <YYINITIAL> "boolean"            { return symbol(sym.BOOLEAN); }
    <YYINITIAL> "break"              { return symbol(sym.BREAK); }
     
    <YYINITIAL> {
      /* identifiers */ 
      {Identifier}                   { return symbol(sym.IDENTIFIER); }
     
      /* literals */
      {DecIntegerLiteral}            { return symbol(sym.INTEGER_LITERAL); }
      \"                             { string.setLength(0); yybegin(STRING); }
     
      /* operators */
      "="                            { return symbol(sym.EQ); }
      "=="                           { return symbol(sym.EQEQ); }
      "+"                            { return symbol(sym.PLUS); }
     
      /* comments */
      {Comment}                      { /* ignore */ }
     
      /* whitespace */
      {WhiteSpace}                   { /* ignore */ }
    }
     
    <STRING> {
      \"                             { yybegin(YYINITIAL); 
                                       return symbol(sym.STRING_LITERAL, 
                                       string.toString()); }
      [^\n\r\"\\]+                   { string.append( yytext() ); }
      \\t                            { string.append('\t'); }
      \\n                            { string.append('\n'); }
     
      \\r                            { string.append('\r'); }
      \\\"                           { string.append('\"'); }
      \\                             { string.append('\\'); }
    }
     
    /* error fallback */
    [^]                              { throw new Error("Illegal character <"+
                                                        yytext()+">"); }
    Il en existe d'autre, mais ils ont tous le même principe !
    Personnellement, j'ai déjà utilisé CUP pour un projet d'école :
    http://sourceforge.net/projects/compli-a3/

    Mais, tu devrai nous préciser le but voulu pour pouvoir te conseillé sur l'utilisation d'un tel outil.

    Cordialement,
    Patrick Kolodziejczyk.

    Source :
    http://en.wikipedia.org/wiki/Lexical_analysis
    http://en.wikipedia.org/wiki/Compari...ser_generators
    http://jflex.de/
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

Discussions similaires

  1. [REGEXP] Problème de parsing d'une chaine
    Par Narvis dans le forum Langage
    Réponses: 4
    Dernier message: 25/06/2012, 14h13
  2. Réponses: 1
    Dernier message: 04/06/2012, 12h20
  3. Parsing d'une chaine de caracteres
    Par Premium dans le forum Langage
    Réponses: 1
    Dernier message: 21/01/2009, 08h37
  4. Parsing d'une chaine
    Par Premium dans le forum Langage
    Réponses: 2
    Dernier message: 22/12/2008, 11h50
  5. parse d'une chaine de caractère
    Par dereck1333 dans le forum C
    Réponses: 10
    Dernier message: 19/11/2007, 17h27

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