begin process at 2012 02 07 08:02:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > COLORATION SYNTAXIQUE AVEC TPARSER !!

COLORATION SYNTAXIQUE AVEC TPARSER !!


 Information sur la source

Note :
9,75 / 10 - par 8 personnes
9,75 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Divers Niveau :Expert Date de création :15/08/2003 Date de mise à jour :20/08/2003 02:13:19 Vu / téléchargé :9 870 / 1 314

Auteur : Bestiol

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (27)
Ajouter un commentaire et/ou une note


 Description

La classe TParser est une classe non documentée de Delphi. Elle permet de découper une chaîne de caractères en "tokens". On peut ensuite parcourir la chaîne token par token, récupérer la position dans la chaîne du token en cours...

Cette source permet grâce à cette classe de colorer le texte d'un fichier DFM comme le fait Delphi grâce à un code très simple qui se résume en gros à une boucle While...
    
---------
Mise à jour :
   Deux nouvelles classes pour colorer le code pascal des fichiers .pas.
Une classe similaire à celle créée par Delphiprog (TDfmParser), TPasParser, qui descend d'une version remaniée de TParser.
   Des modifications ont effectivement été nécessaires pour que la classe devienne compatible avec le parsing des fichiers .pas
   Comme j'ai modifié un copier/coller de la classe TParser, j'en ai profité pour commenter tout le code ! Avis à ceux qui cherche à comprendre plus en détail le fonctionnement du Parser !

   Le ZIP ne contient maintenant plus que la version de Delphiprog du programme de coloration, mais largement commentée... Si toutefois vous avez des questions, laissez un commentaire ou envoyez-moi un mail !

   BONUS !! ;o)
   Inclus également dans le ZIP, un fichier d'aide .hlp sur la classe TParser, créée par Delphiprog. Grâce à lui, cette classe sort donc maintenant du registre "Non documentée" !!

------
Nouvelle mise à jour :
   Le passage d'une ProgressBar en paramètre (que je n'avais pas signalé avant...) est maintenant facultatif, pour rendre l'interface et le code du prog indépendants (suite à un nouveau bon conseil de delphiprog !! ;o) )
   J'ai remanié la classe TDfmParser. Le code gérant la colorisation utilise maintenant l'approche du Case Parser.Token Of et passe ainsi d'un code de 60 lignes à un code de 32 !!
   La dite classe utilise également la version "corrigée" du TParser, TModifParser, pour faciliter l'interprétation du code
   Par la même occasion, l'utilisation du Case permet de corriger le bug signalé avec la propriété DesignSize, qui est donc à présent entièrement colorée !

Source

  • Tout est dans le ZIP !
Tout est dans le ZIP !     

 Conclusion

Normalement tout fonctionne comme il faut... à part un cas de propriété qui n'est pas coloré entièrement. voir l'unité .pas !
[Une nouvelle version devrait rapidement venir corriger ce problème]
(*C'est maintenant fait !*)

Sinon, tout commentaire est accepté ! ;-)  

-------

Merci à Nono40 et à Delphiprog pour leur aide, toujours précieuse ! (et a special thanks pour le fichier d'aide !)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip PETITE SCENE EN OPENGL
Source avec Zip DÉCOUPAGE DE FICHIER WAV
Source avec Zip UTILISER UN NUMÉRO DE SÉRIE
Source avec Zip CONCATENATION DE FICHIERS WAV
Source avec Zip STOCKAGE DE MOT DE PASSE CRYPTÉ

 Sources de la même categorie

Source avec Zip TRI DBRID CROISSANT ET DECROISSANT par walidlam
Source avec Zip PETITE APPLICATION DE RETENUE par walidlam
Source avec Zip APPLICATION ALIAS+EXCEL par walidlam
Source avec Zip ACCÈS À DIFFÉRENTES PROPRITÉS D'UNE FORME PARENT À PARTIR DE... par ioda19
CODAGE EN BASE64 DE CHAÎNES UNICODE par gta126

Commentaires et avis

Commentaire de Delphiprog le 16/08/2003 00:50:07 administrateur CS

Super travail que tu as réalisé là !

Enfin un code source intéressant. On commençait à s'ennuyer...

Commentaire de Bestiol le 16/08/2003 00:54:12

Merci Delphiprog, ce genre de commentaire fait bien plaisir !

Commentaire de koko le 16/08/2003 10:05:19

bravo bravo !!!
mais pourquoi se limiter au .dfm ?

Commentaire de Delphiprog le 16/08/2003 12:02:59 administrateur CS

"mais pourquoi se limiter au .dfm ?"
Réponse : il fallait bien commencer par quelque chose !
Si tu entrevois d'autres applications concrètes, ne te gênes pas pour faire une proposition, elle sera accueillie avec plaisir.

Commentaire de koko le 16/08/2003 12:12:32

pour du php, html, javascript... pour les languages web quoi...

mais par exemple j'avais essayé d'ouvrir un fichier .pas... mais il était pas content le prog !

Commentaire de Bestiol le 16/08/2003 15:12:47

Pour répondre à Koko, je me suis limité au .dfm car c'était d'après moi le plus simple pour faire un exemple :
-2/3 mots réservés à prendre en compte
-Une seule couleur qui différencie juste les valeurs "non symboliques", si on peut dire !

Mais je compte essayer de colorer du code Pascal, et peut-être du HTMl ou PHP...
Mais le mieux, c'est que la classe TParser, dont tu peux hériter pour faire une nouvelle classe, te permet également d'interpréter le code, par exemple !
C'est un gros travail mais au final l'outil est de taille !

Je vais essayer un autre type de fichier...
Bonne prog' !

PS: Si le "prog n'est pas content", c'est parce que ma boucle n'est en rien prévue pour trouver autre chose que le contenu d'un DFM !

Commentaire de koko le 16/08/2003 16:02:56

a oki ^^

Commentaire de Bestiol le 18/08/2003 02:06:50

voilà Koko maintenant les fichiers .pas sont gérés !

Bonne prog' !

Commentaire de koko le 18/08/2003 09:34:56

merci !!! vous faites de l'exellent travail !

Commentaire de koko le 18/08/2003 14:45:44

j'ai plusieurs questions :
1. Comment faire pour, par exemple, détecté un caractère spécial suivi d'un nombre et faire un action suivant le nombre ?
exemple..
on prend le caractère 3 avec un nombre. Chaque nombre correspond a une couleur (0 = blanc, 1 = noir, 2 = gris,...) et apres mettre ce qui suit avec la couleur...
exemple concret :
1 j'écris en noir
et alors dans le richedit, ca ecrit en noir...

2. J'ai essayé de justement faire ce que j'ai dis au dessus... mais juste loader un fichier qui est pas dfm ou pas, et ca bug au niveau du while Parser.Token <> toEOF...
donc voila (et encore bravo du beau travail :D)


Commentaire de Bestiol le 18/08/2003 14:49:22

merci beaucoup, ça fait bien plaisir ce genre de compliments !!

@+

Commentaire de Bestiol le 18/08/2003 15:05:51

en fait ce que tu demandes correspond un peu aux modifications apportées pour les commentaires...
Par exemple avec '(*'... On peut assimiler la parenthèse à ton caractère spécial, et l'étoile à un nombre !
Regarde dans l'unité TMonParser.pas, la fonction NextToken... En fin de fonction tu as un commentaire "PARTIE AJOUTEE", c'est là que tu pourras t'inspirer si tu veux agir au niveau de la classe...

Si tu veux ajouter cette gestion dans la classe TPasParser, ton caractère spécial ne devrait être reconnu comme aucun type de token... Il faut donc que tu rajoutes un else au CaseParser.Token Of, et que tu introduises le code par :
If (Parser.TokenString = CaractereSpecial) and (Parser.NextToken = toInteger) then
begin
  //Ici tu peux récupérer le chiffre donnant la couleur avec Parser.TokenInt et par exemple utiliser un tableau pour gérer la couleur en fonction du nombre !
end;

Voilà je pense que tout ça devrait faire l'affaire... Le plus facile est certainement la seconde solution !!
Bonne prog' !
Bestiol.

Commentaire de koko le 18/08/2003 16:25:36

pour la deuxieme solution, je dois ajouter le if apres le end du Case Parser.Token Of ??? ou bien autre part ?

Commentaire de Bestiol le 18/08/2003 17:47:35

non autre part...
Tu as :
Case Parser.Token Of
toString, toWString,....
...
toSymbol: ...
...
//Le else constitue un nouveau cas
else if (Parser.TokenString = CaractereSpecial) and (Parser.NextToken = toInteger) then
begin
  //Ici tu peux récupérer le chiffre donnant la couleur avec Parser.TokenInt et par exemple utiliser un tableau pour gérer la couleur en fonction du nombre !
end;
end;//le end du case est ici !!

Si tu veux je peux te créer une classe qui rajoutera cette fonctionnalité. Mais le code d'au-dessus est amplement suffisant normalement !!
Le mieux serait également que tu aies un caractère de fin, pour dire où la sélection s'arrête. Tu le trouverais alors avec un While !

Allez bonne prog' !

Commentaire de Bestiol le 20/08/2003 02:15:54

et voilà une nouvelle mise à jour !!
Le code du TDfmParser devient nettement plus lisible, et moins lourd ainsi !!

Bon... vais m'coucher moi !! =0)
Bonne prog' à tous !

Commentaire de DeVxX le 21/08/2003 18:56:55

Quoi doit-on faire si je veux gérer les balises HTML et aussi detecté les balise de scripts PHP.ASP,JSP, pour ensuite coloriser les functionner interieure (entre les 2 balise de script) ?

En passant, c'est la premiere fois que je trouve quelque chose d'excellent sur la syntax coloring. Tu m'as beaucoup aider a comprendre le fonctionnement et je t'en remercie infiniment.

Merci

Commentaire de Bestiol le 21/08/2003 21:00:36

Merci pour ses compliments... je dois dire que je suis assez content car j'ai repéré cette classe il y a longtemps, et j'ai enfin compris comment elle fonctionne !!

Pour ta question là j'ai pas trop le temps, mais j'ai l'intention de me pencher sur le problème !
La suite au prochain numéro, donc ! ;o)

Bonne prog' !
Bestiol.

Commentaire de loadspeed le 23/08/2003 16:06:12

Je suis en train de tenter de faire un interpretateur de grammaire generique, c'est a dire qu'a partir d'un fichier généré (le fichier de grammaire), mon programme interpretera automtiquement je vais tenter d'inclure ton source, ds le mien pour créer un IDE je te fais signe des que c'est opérationnel.
++

Commentaire de Bestiol le 23/08/2003 18:13:47

ok ok, je serai curieux de voir ce que ça va donner !!
Le TParser doit être un très bon outil pour gérer les interprétations lexicales...

Bonne prog' !
Bestiol.

Commentaire de grandvizir le 29/10/2004 19:04:25

Félicitation pour la rapidité de la coloration. On pourra toujours rétorquer que les composants SynEdit sont les meilleurs, mais la question n'est là. En effet, j'avais vu un composant TCodeMaster sur le site Delphi Super Page (http://delphi.icm.edu.pl/). Le principe était le même: un TRichEdit. Oui, mais l'atout ici est que la couleur est mise avant le texte, et pas le texte avant la couleur (sinon on est obligé de sélectionner pour appliquer la couleur). L'erreur n'est ici pas faite, contrairement au composant précédent. Et c'est de là que vient la rapidité.

L'autre chose très sympathique pour un test rapide: pas d'installation de composants dans la palette.

Et comme on est dans le parcours syntaxique des fichiers .PAS, ID=24746 propose une élimination des commentaires dans ces mêmes fichiers. Encore un programme sympa qui montre que le projet de cette page comporte en moyenne 40% de commentaires. Mais ça c'est juste une donnée expérimentale.

Commentaire de CLio908 le 23/10/2010 11:43:59

Bonjour
J'arrive pas à le faire tourner sur CodeGear 2009
PB1
  le Pb vient de toString dans la procedure TModifParser.CheckToken(T: Char);
  message: E2026: Expression constante attendue
  toString renvoie au fichier classes pour définir une constante
PB2
  FWideStr: WideString;
  message: identificateur de type attendu

Commentaire de Bestiol le 23/10/2010 13:49:54

Bonjour Clio908 !

Je suis désolé, depuis toutes ces années je suis toujours inscrit aux emails de notification, malheureusement je ne fais plus de Delphi depuis presque autant de temps... je n'ai pour ainsi dire plus de quoi ouvrir ces fichiers (pas même Windows...) et je ne pourrais donc pas t'aider à corriger les problèmes.

D'instinct, je dirais que pour le premier problème il faut que tu vérifies le paramètre passé à toString (s'il y en a un/en manque un ?) ou sur quoi l'appel est fait. L'API a pu changer depuis  2003...
Pour le second problème, le type WideString n'existe sans doute plus depuis le support Unicode par Delphi ?
De ce que je viens de lire, remplace WideString par UnicodeString et ça devrait rouler !
Je t'invite à lire cet article : http://delphi.about.com/gi/o.htm?zi=1/XJ&zTi=1&sdn=delphi&cdn=compute&tm=33&f=00&su=p284.9.336.ip_p504.1.336.ip_&tt=2&bt=0&bts=0&zu=http://edn.embarcadero.com/article/38437

Voilà voilà, je ne peux guère faire plus, j'espère que cela t'aidera :)
Et comme je le disais avant, "bonne prog' !" ^^
Olivier

Commentaire de Delphiprog le 28/10/2010 22:21:02 administrateur CS

Bonsoir Clio908 et Olivier,

Delphi 2009 interprète toString comme un appel à la méthode toString définie dans la classe TObject. Il faut donc remplacer tous les toString par Classes.toString à chaque fois que le compilateur bute sur une erreur de ce type. En revanche, je n'obtiens pas les autres erreurs relevées par Clio908.
Néanmoins l'application compilée avec Delphi 2009 ne colorise pas le code contenu dans l'éditeur comme attendu et semble ne rien faire.
Je continue de rechercher la raison et je reviendrai alors vers vous.

PS : je ne me souvenais plus d'avoir apporté ma contribution à ce projet...

Commentaire de Bestiol le 29/10/2010 10:05:15

Salut Delphiprog :)

Merci pour les investigations !

Pour ce qui est de ta participation je m'en souviens assez bien de mon côté !
Je crois que tu m'avais généré la doc et sans doute aidé sur le code avec Nono ^^

Commentaire de Delphiprog le 29/10/2010 20:07:18 administrateur CS

Bon, j'ai jeté un  oeil à ce projet. Jusque Delphi 2007, tout va bien et aucun changement n'est nécessaire. De plus, le contenu du buffer est parfaitement lisible pour un occidental moyen comme moi. En revanche, avec Delphi 2009, les caractères contenus dans le buffer ressemblent à du chinois ou du japonais, va savoir...
Je continue de chercher et je m'oriente vers un problème de jeu de caractères à priori. A suivre...

Commentaire de CLio908 le 03/11/2010 01:20:14

Bonjour et merci de jeter un ½il.
j'ai pris en compte la dif des tostring et mettant classes.tostring mais apparemment je ne rentre même pas dans la boucle
while Parser.Token <> toEOF do //tant qu'on est pas à la fin du fichier...

pb de caractère ...

A+

Commentaire de CLio908 le 06/11/2010 09:25:43

Bonjour
Je confirme, avec D2007 c'est OK mais avec 2009 pb,
a la place des caractères, j'ai des carré si je regarde dans la var FSoursPtr
avant les #$A0D
Help please...
A+

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,842 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales