Aller au contenu

Algorithme de coloration du code source


K-LiBR3

Messages recommandés

Bonjour à tous,

je cherche un algorithme de coloration de code source.

J'ai fait ceci en javascript pour un ajout de commentaire dans un forum (pour faire simple).

Et le code source est coloriser, le problème est que j'ai réfléchi au moins 3-4 heures à comment colorisé les "blabla" et 'blabla' en détectant si ceux ci sont dans des commentaires, en détectant que les ' entre double quotes ne comptent pas et que les " entre simple quotes ne comptent pas... Mais impossible de trouver un solution, j'ai donc abandonné la colorisation des simple et double quote. Pour détecter les " entre double quotes, c'est simple, il suffit de regarder s'il y a un \ juste avant car il y en a forcement un !!!

Si quelqu'un a une solution, qu'il n'hésite pas à la faire partagé ^^ ^^ ^^

merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

Comment fonctionne ton algo ?

Quand tu parcours le texte, tu n'as pas un état/une variable qui te dit que tu es dans un commentaire, dans une chaîne '', dans une chaîne "" ?

Pour détecter les " entre double quotes, c'est simple, il suffit de regarder s'il y a un \ juste avant car il y en a forcement un !!!

Il y a forcément un \, mais s'il y en a 2, ça referme ta chaîne : "blabla\\" car le premier \ échappe le deuxième

Une petite recherche google m'a donné ça :

http://www.commentcamarche.net/faq/3157-javascript-coloration-syntaxique-dans-vos-pages-web

Tu pourras ptet y trouver de l'inspiration

Lien vers le commentaire
Partager sur d’autres sites

Il y a forcément un \, mais s'il y en a 2, ça referme ta chaîne : "blabla\\" car le premier \ échappe le deuxième

Oui cela complique mon algo encore plus, je n'y avait pas pensé x)

Comment fonctionne ton algo ?

Mon algo est simple, je remplace juste les "public " ou "private " ou "if(" ou "if (" ou "<div>"...... par des "<span class="truc">MonElement</span>"

Quand tu parcours le texte, tu n'as pas un état/une variable qui te dit que tu es dans un commentaire, dans une chaîne '', dans une chaîne "" ?

Donc tu suggère de faire cela avec un automate et des état (exemple : état 8, je suis entre des double quote --> j'ignore les \\, les ', les \" mais je change d'état quand je rencontre une double quote), c'est pas mal mais j'ai du mal à voir comment faire la coloration des public, private etc... avec un automate ! Peut être faut il combiné les 2 (mon algo + l'automate) ?

Une petite recherche google m'a donné ça :

http://www.commentcamarche.net/faq/3157-javascript-coloration-syntaxique-dans-vos-pages-web

Tu pourras ptet y trouver de l'inspiration

Très bonne recherche merci, je n'avais pas trouver cela ^^

Merci pour ta réponse.

Lien vers le commentaire
Partager sur d’autres sites

Oulà, c'est loin pour moi cette histoire d'automates :transpi:

Mais grosso modo oui.

Quant au traitement des mots clés comme public, private, if, break... ça ne change pas l'état de ton automate, une fois que c'est traité, tu peux l'oublier.

Si tu veux creuser un peu le sujet de manière théorique, fais des recherches sur l'analyse lexicale et l'analyse syntaxique.

Lien vers le commentaire
Partager sur d’autres sites

Vous êtes à côté de la plaque les gars. Un algo de colorisation syntaxique est très difficile dans le sens qu'il rajoute de la couleur seulement à la partie modifiée.

C'est pour cela lorsque tu charges un IDE, c'est tout blanc (ou alors il met trois plombes comme Eclipse à charger) et ensuite il regarde ce que tu tapes.

Là tu fais un "pretty-printer" qui est juste le constructeur du truc: :p

Et en plus comme le C++ est un langage ambiguë, cela complique forcément. Si tu ne veux pas te casser la nénette passe par une librairie de parsage syntaxique et grammatical comme bison/lex/yacc.

Par contre bison/lex/yacc c'est du C, c'est très vieux, les tutoriaux sont basiques, le portage Windows est merdique et pleins de trou de c*ls ont fait leur propres portages approximatifs en C++: :fumer::craint:

Lien vers le commentaire
Partager sur d’autres sites

Stoi qu'es à coté :fumer::smack:

Pourquoi tu ramènes un truc d'ide et de coloration "à la volée" ?

D'après ce que j'ai compris, le texte est déjà là, et y a plus qu'à mettre du violet sur le ifs et du vert dans les commentaires, sans prendre les " des commentaires pour des chaînes...

De l'analyse syntaxique et lexicale quoi.

Lex & yacc sont bien, mais de là à dire "si tu veux pas te casser le nénette"... Ce sont des outils puissants, puis pour passer le truc en javascript après :byebye:

Enfin, bon, si j'avais envie de faire ça sans me prendre la tête, j'aurais pris de l'existant avec une petite recherche google.

Si j'avais envie de découvrir l'analyse syntaxique et lexicale, j'aurais fait une calculette en C avec lex et yacc (ah ouais, c'était ça le cours ^^)

Lien vers le commentaire
Partager sur d’autres sites

Ouep intéressant tout ça !

Effectivement je ne fait pas de coloration en direct ^^

D'ailleurs pour colorisé en direct sa doit être dur nn ?

Je ne comprend pas comment on pourrai faire à moins de tout recolorisé à chaque fois qu'on entre un caractère (parce que se que tu rentre dépend de tout le reste :S)

Tu peux expliqué le fonctionnement de Lex & yacc sa m'intéresse ^^ ou me donner une doc xD

C'est ptete un automate qui sait à chaque endroit du fichier l'état qui correspond non ? Donc il n'aurai qu'a reprendre là où on tape, et pour des cas particulier il remonte dans le texte... Chauuud...

Lien vers le commentaire
Partager sur d’autres sites

Ouep intéressant tout ça !

Effectivement je ne fait pas de coloration en direct ^^

D'ailleurs pour colorisé en direct sa doit être dur nn ?

Je ne comprend pas comment on pourrai faire à moins de tout recolorisé à chaque fois qu'on entre un caractère (parce que se que tu rentre dépend de tout le reste :S)

Tu peux expliqué le fonctionnement de Lex & yacc sa m'intéresse ^^ ou me donner une doc xD

C'est ptete un automate qui sait à chaque endroit du fichier l'état qui correspond non ? Donc il n'aurai qu'a reprendre là où on tape, et pour des cas particulier il remonte dans le texte... Chauuud...

Il faut chercher compilateur, Analyse syntaxique, Analyse sémantique, etc..

En gros tu prends un programme en C++

#include<iostream>

int main(int argc, char* argv[]) {
 cout << "Bonjour" << endl;

 return 0;
}

La première Analyse est l'analyse syntaxique.

Tu va définir des lexèmes (INCLUDE, ESPACE, SUP) et dire à quoi ils correspondent

Elle doit te retourner un truc style:

INCLUDE -> #include
ESPACE
SUP -> <
chaine -> iostream
INF -> >
FIN LIGNE
FIN LIGNE
chaine -> int
ESPACE
chaine -> main
PARENTHÈSE -> (
chaine -> int
ESPACE
chaine -> argc
VIRGULE
chaine -> char
POINTEUR -> *
ESPACE
chaine -> argv
CROCHET -> [
CROCHET -> ]
PARENTHÈSE -> )
ESPACE
ACCOLADE -> {
FIN LIGNE
.....

Ta deuxième analyse est l'analyse sémantique.

Tu vas créer des règles avec les lexèmes de la première analyse afin de faire des regroupements

Elle prend donc en entrée la sortie de la première analyse.

1) "INCLUDE ESPACE SUP chaine INF FIN LIGNE" -> void ouvrirInclude(#4) (<- appel vrai code)

2) "chaine ESPACE chaine PARENTHÈSE" -> void newFonction(#3, #1)

3) "chaine ESPACE chaine VIRGULE" -> void newParam(#3,#1) /!\ Ce sont des machines à états et donc ici on a trouvé une fonction, donc ce qui suit est un paramètre/!\

4) "chaine POINTEUR ESPACE chaine CROCHET CROCHET PARENTHÈSE" -> ici il doit détecter un pointeur, un tableau, un nouveau paramètre de tyope tableau de pointeurs, et la fin des paramètres.

Et ainsi de suite. Mais le langage C++ est un langage ambiguë parce que des fois il a plusieurs choix: :transpi:

Si tu lis les RFC (Request for comments), il y en a dedans

Exemple:

     Via =  "Via" ":" 1#( received-protocol received-by [ comment ] )
     received-protocol = [ protocol-name "/" ] protocol-version
     protocol-name     = token
     protocol-version  = token
     received-by       = ( host [ ":" port ] ) | pseudonym
     pseudonym         = token

Édit: lex/ Flex va prendre en entrée un fichier de définition des lexèmes et va générer un parser (en pur C). Ce parser va retourner le prochain lexème (donc, il faut faire une boucle et tout ce qui est autour)

Je ne souviens plus comment Yacc/ Bison interagit avec lex/ Flex (cela doit être une sorte de define), mais tu vas faire un fichier de définition de règles utilisant les lexèmes (ce fichier va contenir aussi du code C pour les actions à faire en cas de reconnaissance d'une règle + la gestions des erreurs) et va générer un parser qui va appeler le parser lex/ Flex, appeler ton code (en pur C) et faire la gestion des erreurs.

Les états c'est à toi de les faire à la main: :transpi:

Et les parsers générés sont optimaux: :p

Pour la colorisation, il faut partir d'un texte déjà coloré. Ensuite lorsque l'utilisateur écrit, tu vas recolorer à la volée. Dans la majorité des cas la colorisation ne touche que le "mot" en cours d'écriture, ou alors la ligne: cela permet d'avoir un traitement très rapide et efficace.

Mais si c'est "/*", il faut colorer jusqu'au bas.

Si c'est "*/", il faut refaire la colorisation après.

Et ainsi de suite.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...