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

Algorithmes et structures de données Discussion :

Coloration syntaxique /flex ou table de hach


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut Coloration syntaxique /flex ou table de hach
    Bonjour,


    je cherche à faire la coloration syntaxique pour un programme écrit en algorithme, du style voir la pièce jointe


    Alors j'ai essayé de reconnaître les mots clé à l'aide d'un lexer (flex) mais j'ai un problème qui se pose lorsque je fais ***si le lexer reconnaît les *** comme n'étant pas un mot clé, mais le souci c'est que si est reconnu en tant que mot clé et donc il est colorié. C'est pour ça que j'arrive à me demander si c'est bien flex que je dois utiliser. Pourquoi ne pas utiliser une table de hachage avec mes mots clé, comparer en temps réel les mots à insérer et colorier si une occurence du mot est trouvé.

    Merci

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Peut être qu'il te manque la notion de séparateur pour isoler tes mots clé

    un mot clé est précédé d'un séparateur et suivi d'un séparateur
    la liste des séparateurs est :
    * debut de fichier
    * fin de fichier,
    * espace, tab
    * caractères ("')[]...
    * a compléter
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Peut être qu'il te manque la notion de séparateur pour isoler tes mots clé

    un mot clé est précédé d'un séparateur et suivi d'un séparateur
    la liste des séparateurs est :
    * debut de fichier
    * fin de fichier,
    * espace, tab
    * caractères ("')[]...
    * a compléter
    Bonjour


    si je comprends bien j'ai besoin de dire que un {separateur}{mot_cle}{separateur} definit un mot clé. le problème est le suivant

    ma chaîne de caractère commence par

    donc là j'ai debut_fichier_{mot_cle}fin_fichier => mais comment représenter debut_fichier dans flex ? est-ce qu'il y a un caractère spécial pour ça ? ou bien dans lex je dois définir une variable qui au départ vaut 0 (début fichier) et l'incrémenter dès la première analyse pour qu sa valeur devienne différente de 0 ?

    merci

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par exhortae Voir le message
    mais comment représenter debut_fichier dans flex ? est-ce qu'il y a un caractère spécial pour ça ? ou bien dans lex je dois définir une variable qui au départ vaut 0 (début fichier) et l'incrémenter dès la première analyse pour qu sa valeur devienne différente de 0 ?
    La notion début de fichier n'existe pas, il faut donc la créer.

    Citation Envoyé par exhortae Voir le message
    une variable qui au départ vaut 0 (début fichier) et l'incrémenter dès la première analyse pour qu sa valeur devienne différente de 0 ?
    C'est comme cela que je ferai

    Au passage, n'oublie pas de définir les séparateurs "début de ligne" et "fin de ligne"
    Et même si tu définis les séparateurs "début de ligne" et "fin de ligne", tu n'as plus besoin de définir "début de fichier" car un début de fichier c'est aussi un début de ligne
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    La notion début de fichier n'existe pas, il faut donc la créer.


    C'est comme cela que je ferai

    Au passage, n'oublie pas de définir les séparateurs "début de ligne" et "fin de ligne"
    Et même si tu définis les séparateurs "début de ligne" et "fin de ligne", tu n'as plus besoin de définir "début de fichier" car un début de fichier c'est aussi un début de ligne
    Ok, jusqu'ici je comprends,

    keyword si|sinon|alors

    mot_cle {separateur}{keyword}{separateur}

    donc si j'ai

    debut_lignesifin_ligne ça marche

    mais dans le cas suivant

    si si => le 2ème si n'est pas précéder d'un séparateur donc il ne répond pas à la règle {separateur}{keyword}{separateur} donc ça ne sera pas un mot cle

    je peux faire la règle suivante

    {mot_cle} |
    keyword {mot_cle} |
    {mot_cle}keyword |
    keyword{mot_cle}{keyword} {/* action mot cle */}

    mais là encore problème si j'ai si si sisi il va me faire si si si : mot clé et le dernier si : pas mot clé, et mon problème c'est pas vraiment de définir ce qui est un mot clé, c'est surtout de définir ce qui ne l'est pas et dans ce cas si si est un mot clé mais la suite sisi ne l'est pas

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    En fait je pense que ce n'est pas la bonne approche.

    On peut considérer que un fichier est une suite de tokens.
    Un token peut être entre autres un nom.
    un nom est constitué comme suit : _[a-z][A-Z]([0-9]_[a-z][A-Z])*
    Cela, c'est facile à faire sous flex, il te reste ensuite plus que à règler le cas des commentaires /* si alors sinon */ et des chaines constantes "si alors sinon"

    Une fois que tu as isolé ces noms parmi tes token, il suffit de voir si ce nom est un mot réservé (si, alors, sinon, ...) et de le colorier en conséquence.

    Donc en fait, tu utilises flex pour séparer ton flux d'entrée et ensuite une table de hach pour savoir si ce mot est un mot réservé.

    Attention toutefois avec une table de hash. Il est possible (bien que peu probable mais ce qui peut arriver, arrivera, c'est Murphy qui le dit) que tu tombes par hasard sur un mot qui à le même hash qu'un autre (collision de hash).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    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
    Citation Envoyé par ram_0000 Voir le message
    Attention toutefois avec une table de hash. Il est possible (bien que peu probable mais ce qui peut arriver, arrivera, c'est Murphy qui le dit) que tu tombes par hasard sur un mot qui à le même hash qu'un autre (collision de hash).
    Hum... ram_0000 ce dont tu parles ici c'est un problème pour les implémenteurs de table de hash, pas pour les utilisateurs.
    (il existe plusieurs solutions propre au problème et toute implémentation de hash en utilise une en sous-main)

    --
    Jedaï

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Salut,
    Je ne comprend pas bien le problème ***si?
    *** corespond a?

    Peut-on avoir le code flex?

    J'ai fait un petit code flex/bison pour exemple sur un autre post, ca peut servir ici aussi je pense.
    http://www.developpez.net/forums/sho...d.php?t=464796

    Citation Envoyé par ram_0000 Voir le message
    il te reste ensuite plus que à règler le cas des commentaires /* si alors sinon */ et des chaines constantes "si alors sinon"
    http://www.gnu.org/software/flex/man...lex.html#SEC11

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    En fait je pense que ce n'est pas la bonne approche.

    On peut considérer que un fichier est une suite de tokens.
    Un token peut être entre autres un nom.
    un nom est constitué comme suit : _[a-z][A-Z]([0-9]_[a-z][A-Z])*
    Cela, c'est facile à faire sous flex, il te reste ensuite plus que à règler le cas des commentaires /* si alors sinon */ et des chaines constantes "si alors sinon"

    Une fois que tu as isolé ces noms parmi tes token, il suffit de voir si ce nom est un mot réservé (si, alors, sinon, ...) et de le colorier en conséquence.

    Donc en fait, tu utilises flex pour séparer ton flux d'entrée et ensuite une table de hach pour savoir si ce mot est un mot réservé.

    Attention toutefois avec une table de hash. Il est possible (bien que peu probable mais ce qui peut arriver, arrivera, c'est Murphy qui le dit) que tu tombes par hasard sur un mot qui à le même hash qu'un autre (collision de hash).

    Oui je crois que c'est la bonne solution, par contre étant pris par le temps, j'ai du choisir de mettre une règle ou le lexer match un mot constitué d'un ou plusieurs caractères parmi les 255 caractères asci (autres que les caractères d'échappement et les alphanumériques) pour décider que ce n'est pas un mot clé.

  10. #10
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par totaliou Voir le message
    Salut,
    Je ne comprend pas bien le problème ***si?
    *** corespond a?

    en faite lors des différents codes que j'ai sorti, j'avais toujours un problème avec les séquence genre éé""'si ou sisisi (ces 2 problèmes intervenant soient en même temps soient séparement), j'ai finalement trouver une méthode pas terrible mais qui marche sans bug pour la coloration syntaique, malheuresement je suis vraiment pris par le temps, j'ai encore toute une partie de l'interface graphique de l'éditeur à terminer.

    Merci à vous tous pour vos réponses, je garde ces pistes sous la main car le projet doit évoluer ensuite (second semestre) vers un analyseur syntaxique.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Citation Envoyé par exhortae Voir le message
    en faite lors des différents codes que j'ai sorti, j'avais toujours un problème avec les séquence genre éé""'si ou sisisi.
    Etrange normalement
    la regle :
    si return SI
    ne doit matcher que les "si", le problème est surment ailleur.

    Faire une regle
    [a-zA-A]+

    puis verifier si le mot est un keyword ou non est plutot bizare.

    Un scanner complet(pour tout le speudo-langage) peut se faire relativement rapidement.

    Bonne chance.

  12. #12
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par totaliou Voir le message
    Etrange normalement
    la regle :
    si return SI
    ne doit matcher que les "si", le problème est surment ailleur.

    Faire une regle
    [a-zA-A]+

    puis verifier si le mot est un keyword ou non est plutot bizare.

    Un scanner complet(pour tout le speudo-langage) peut se faire relativement rapidement.

    Bonne chance.
    Ben en faite je commence par une règle si|alors... mais il y a un souci, j'imagine que lorsqu'on a les bases ça ne doit pas être trop difficle mais là j'ai aucun cours ou tp sur ça, alors je patauge un peu. Je t'envoie le code en MP vu qu'on a tous le même projet et que ça risque de poser problème au niveau des correcteurs si quelqu'un à l'indélicatesse de repomper tout le code sur son projet

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Par défaut
    Bonne chance

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

Discussions similaires

  1. [C#] Coloration syntaxique !
    Par UNi[FR] dans le forum Windows Forms
    Réponses: 8
    Dernier message: 08/04/2009, 09h37
  2. Coloration syntaxique
    Par iubito dans le forum Evolutions du club
    Réponses: 73
    Dernier message: 02/11/2005, 10h01
  3. [debutant] coloration syntaxique
    Par demostene dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 30/06/2004, 15h16
  4. Coloration syntaxique
    Par _-Sky-_ dans le forum Composants
    Réponses: 4
    Dernier message: 03/01/2004, 21h58
  5. Coloration syntaxique ASM dans un RichEdit
    Par Crick dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/12/2002, 01h53

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