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 Perl Discussion :

[RegEx] Syntaxe


Sujet :

Langage Perl

Vue hybride

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

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Par défaut [RegEx] Syntaxe
    Bonjour à tous,

    Je suis un peu débutant dans les expressions rationnelles et je galère pas mal.

    Je vous explique le contexte, je suis en train de réaliser un outil de coloration syntaxique pour un langage et je bloque sur quelques expressions.

    Par exemple j'ai ceci (je donne l'exemple pour un seul mot clé, dans la réalité c'est un tableau):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $CODE =~ s/(\W|^)($keyword)(\W|$)/$1<kw>$2<\/kw>$3/g
    Et ensuite je fais (pour les commentaires):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $CODE =~ s/(([^:]|^)\/\/.*/<comment>$1<\/comment>/g

    Prise séparemment, ces deux expression régulière fonctionne comme je veux.

    Malheuresement, si un mot-clé se trouve dans un commentaire, il se retrouve quand meme avec avec le <kw> et </kw>

    Ce que je voudrais c'est modifier donc ma première expression pour que le kw ne soit pas mis dans les cas suivant :
    - si le mot est précédé sur la meme ligne par //
    - si le mot est entre /* et */
    - le le mot est entre ""
    - si le mot est entre ''

    Edit : pour etre plus précis, le nombre de " et ' doit etre positif pour prendre en compte la chaine

    Par exemple :

    Ici le mot fonction doit bien etre traité :
    'ceci est une chaine';
    function;
    'ceci est une chaine';
    Par contre là non :
    'ceci est une chaine; function; ceci est une chaine';
    Le plus simple à mon avis est de compter le nombre de ' avant la chaine mais je ne sais pas si c'est possible.




    Mais je sais pas faire, ca dépasse mes compétences !

    Merci d'avanceà celui ou celle qui pourra m'aider !

    :

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Les expressions régulières ont leurs limites, en particulier dès lors qu'on commence à essayer de parser un langage informatique complet avec des regexs on est voué à les rencontrer (pour les techniciens : les langages informatiques ne sont pas des langages réguliers, plutôt des langages algébriques). Bien que les regexs de Perl soient plus puissantes que la normale et capable sans doute de résoudre le problème particulier que vous vous posez (avec l'évaluation de code dans la regex par exemple), je ne pense pas que ce soit une bonne idée de persister dans cette voie.
    Il est préférable de se pencher plutôt sur les grammaires, et d'utiliser par exemple des outils comme Parse::RecDescent (pour rester dans les outils Perl) pour générer un parser.
    (en plus si c'est un langage ouvert, il y aura sans doute une grammaire déjà écrite : autant de travail en moins)

    --
    Jedaï

  3. #3
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Juste une piste ...

    J'ai eu à effectuer des traitements de mise en valeur de syntaxe similaires.

    Les expressions rationnelles ne m'ont pas parues suffisantes - ou plutôt, je n'ai pas sû les maîtriser .

    J'ai donc résolu mon "problème" en changeant de méthode et en traitant mes données en plusieurs passes :
    • 1ere passe - Extraction des "commentaires" dans une autre liste et remplacement de leur contenu par un "Tag" ou "ID" numéroté permettant de les retrouver dans l'autre liste.

      2eme passe - Mise en valeur de la syntaxe, sans soucis, les commentaires (ou chaines littérales quotées ou autres ...) étant supprimés du flux à traiter.

      3eme passe - Restitution des commentaires à la place de leur IDs respectifs.


    Ce n'est pas forcément élégant, mais cela a été efficace, pour moi.

    Bon courage.

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Par défaut
    Merci à vous deux !

    C'est vrai que ta solution, 2Eurocents, est simple et efficace, il faut que vois en temps de traitement ce que sa donne :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Syntaxe d'un Regex
    Par Anduriel dans le forum Windows Forms
    Réponses: 3
    Dernier message: 13/11/2009, 19h56
  2. Réponses: 4
    Dernier message: 10/09/2009, 16h15
  3. [RegEx] petit soucis regex (syntaxe)
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 13/06/2009, 15h28
  4. Regular Expression (Regex) syntax avec C#.NET
    Par paca_mike dans le forum C#
    Réponses: 4
    Dernier message: 24/03/2009, 21h54
  5. [RegEx] Regex et syntax Smarty
    Par cbalmefrezol dans le forum Langage
    Réponses: 6
    Dernier message: 08/12/2008, 00h45

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