Coloration syntaxique de C++ vers du HTML, problèmes ....

Coloration syntaxique de C++ vers du HTML, problèmes .... - C++ - Programmation

Marsh Posté le 27-09-2003 à 18:06:36    

Mon travail consiste à créer à partir d'un fichier source C++, un fichier coloré (syntaxiquement) en HTML.
Le problème c'est que pour colorer le texte je fais un parcours séquentiel du fichier cpp caractère par caractère (avec les flots de la biblioithèque <fstream.h> ) et donc je n'ai pas de moyen de savoir lorsqu'il y a un retour à la ligne  :o  
 
Ma démarche pour le programme serait de vérifier char par char sur le fichier et dès que je rencontre un blanc je prends le mot et je compare avec les keywords.
Et dès que je rencontre un // ou /* je colore en conséquence...
 
Qu'en pensez vous ?

Reply

Marsh Posté le 27-09-2003 à 18:06:36   

Reply

Marsh Posté le 27-09-2003 à 18:08:36    

heink ?

Reply

Marsh Posté le 27-09-2003 à 18:09:54    

PC2000 a écrit :


Qu'en pensez vous ?


 
man flex :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-09-2003 à 18:12:52    

kadreg a écrit :


 
man flex :o

meme pas besoin. suffit de lire ligne par ligne d'insérer des tags autour des mots clef

Reply

Marsh Posté le 27-09-2003 à 18:29:21    

Voilà le but de mon travail en gros :
 
Produire un programme (codé en C++) qui permette la coloration lexicale de fichiers sources C++.
Le programme prend en entrée un ou plusieurs fichiers C++ et produit en sortie un ou plusieurs fichiers au format HTML correspondant au sources C++ (mais colorées et bien mis en page).

Reply

Marsh Posté le 27-09-2003 à 18:31:46    

colorer est une chose, l'indentation en est une autre.

Reply

Marsh Posté le 27-09-2003 à 18:36:29    

Je te lis le libellé exact de mon sujet :
Certains blancs (tabulations) seraient ignorés et d'autres remplacés par le code HTML adéquat (un retour à la ligne serait remplacé par la balise "<p>" ).
 
C'est pour ça que je désigne plutôt ca comme de la petite mise en page que de l'indentation.
 
Mais peux tu répondre à ma question ?
 
Comment puis je savoir lorsque je dois aller à la ligne à partir d'un fichier cpp ou txt (avec quel(s) test(s) en C++) ?


Message édité par pc2000 le 27-09-2003 à 18:37:47
Reply

Marsh Posté le 27-09-2003 à 18:45:22    

ok ... ben on te demande pas d'indenter, juste une bonne mise en forme parce qu'en HTML les espaces consécutifs n'ont pas le meme effet qu'en texte brut. donc en fait c'est la meme démarche : recherche un motif dans une ligne et le remplacer. avec <fstream> et <string>, y a tout pour faire ça sans problème

Reply

Marsh Posté le 27-09-2003 à 18:52:55    

Taz a écrit :

ok ... ben on te demande pas d'indenter, juste une bonne mise en forme parce qu'en HTML les espaces consécutifs n'ont pas le meme effet qu'en texte brut. donc en fait c'est la meme démarche : recherche un motif dans une ligne et le remplacer. avec <fstream> et <string>, y a tout pour faire ça sans problème


Oui, ce sont les bibliothèques que je comptais utiliser mais pour le retour à la ligne ça ne me parait vraiment pas évident car pour les commentaires par ex on ne sait pas quand ils se finissent.
Je peux prendre des points de repère comme le ";", ou "{"... mais je sais pas ce que ca peut donner  :(

Reply

Marsh Posté le 27-09-2003 à 18:57:03    

:heink:  
 
while(getline(cin, ligne))
{
  cout << ligne << "<BR>";
}
 
 :heink:

Reply

Marsh Posté le 27-09-2003 à 18:57:03   

Reply

Marsh Posté le 27-09-2003 à 19:03:53    

Taz a écrit :

:heink:  
 
while(getline(cin, ligne))
{
  cout << ligne << "<BR>";
}
 
 :heink:  


Désolé mais je me considère plutôt débutant en C++ vu que j'en fais que depuis un an donc ne soit pas trop surpris si j'ai un peu de mal  :p  
C'est vrai que la fonction getline est élémentaire mais je me rappelle pu trop ..
Mais elle ne prends pas de fstream en paramètre non ?
C'est bien :  getline (char* s, int n ) , non ?

Reply

Marsh Posté le 27-09-2003 à 19:37:29    

Non c'est bon tu avais raison, ca passe, merci  :hello: .
 
 

Code :
  1. fic.getline(buffer,ligne); 
  2. while(!fic.eof())
  3.      ficout<<buffer<<"<BR>";
  4.      fic.getline(buffer,ligne);
  5. }


 
A ton avis je devrais passer par un tableau 2D (ligne par ligne) ca me semble interessant mais je sais pas si c'est un gaspillage de mémoire ou pas (vu qu'avec les tableaux l'allocation n'est pas dynamique..)  
Ca simplifierai certainement le traitement.


Message édité par pc2000 le 27-09-2003 à 19:53:25
Reply

Marsh Posté le 27-09-2003 à 20:30:36    

PC2000 a écrit :

Non c'est bon tu avais raison, ca passe, merci  :hello: .
 
 

Code :
  1. fic.getline(buffer,ligne); 
  2. while(!fic.eof())
  3.      ficout<<buffer<<"<BR>";
  4.      fic.getline(buffer,ligne);
  5. }


 
A ton avis je devrais passer par un tableau 2D (ligne par ligne) ca me semble interessant mais je sais pas si c'est un gaspillage de mémoire ou pas (vu qu'avec les tableaux l'allocation n'est pas dynamique..)  
Ca simplifierai certainement le traitement.

ne fais jamais ce genre de chose et aies la correction de tester mon exemple getline(istream&, std::string& )

Reply

Marsh Posté le 27-09-2003 à 20:43:20    

Taz a écrit :

ne fais jamais ce genre de chose et aies la correction de tester mon exemple getline(istream&, std::string& )


Je suis tes conseils, merci.
 
PS : j'avais testé ton exemple mais on nous a appris d'écrire de cette manière donc je ne savais pas qu'il fallait éviter.


Message édité par pc2000 le 27-09-2003 à 20:44:12
Reply

Marsh Posté le 27-09-2003 à 20:46:21    

ben ton t'as très très mal appris ...
 
 
et ne confonds pas istream::getline et getline


Message édité par Taz le 27-09-2003 à 20:47:15
Reply

Marsh Posté le 27-09-2003 à 20:55:15    

Taz a écrit :

ben ton t'as très très mal appris ...
 
 
et ne confonds pas istream::getline et getline


La fonction getline retourne un int non ?
Parce que j'ai ça comme erreur lors de la compilation.
 
110 C:\Documents and Settings\pierre\Mes documents\projet C++\test\coloration.cpp
implicit declaration of function `int getline(...)'

 
Je cherche juste à récupérer ligne par ligne un fichier texte pour pouvoir insérer des balises HTML (comme tu l'avais mis ci dessus).
 
Désolé je ne comprends pas le type du second argument std::string&.

Reply

Marsh Posté le 27-09-2003 à 20:59:16    

Reply

Marsh Posté le 27-09-2003 à 21:20:41    

Je n'arrive pas à différentier les ifstream et istream  :??:  
Pourquoi privélégier plutôt l'un que l'autre ?
Je crois avoir remarquer que l'un se déclare dans <string> et l'autre dans <string.h>

Reply

Marsh Posté le 27-09-2003 à 21:31:26    

tout ce qui termine en .h est du C donc HS
 
istream est la super-classe dont ifstream est une sous-classe.

Reply

Marsh Posté le 28-09-2003 à 00:25:38    

Tu connais Source-highlight ?
http://www.gnu.org/software/src-hi [...] light.html


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 28-09-2003 à 00:38:14    

je pensais exactement la même chose    [:spamafote]

Reply

Marsh Posté le 28-09-2003 à 15:15:43    

Puisque ifstream est une sous-classe de istream, est il possible (et est ce "propre" ) de mettre pour cette fonction

Code :
  1. void creeHTML(istream&, ostream& );

deux fichiers cpp de type ifstream et ofstream (au lieu des istream et ostream) ?  
 
Merci d'avance.
 
PS : car je ne sais pas spécifier un nom de fichier pour le type istream (ainsi que l'ouvrir et le fermer).


Message édité par pc2000 le 28-09-2003 à 15:18:53
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed