cs_Fanch56
Messages postés2Date d'inscriptionmardi 20 mai 2003StatutMembreDernière intervention 2 novembre 2005
-
2 nov. 2005 à 20:31
florenth -
22 mai 2008 à 19:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
pour le reste, tout semble parfait ... comme d'hab.
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 3 nov. 2005 à 22:15
Etudiant en force...
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 3 nov. 2005 à 17:59
tout pareil ;o)
Enfin étudiant, maintenant... Toujours un plaisir de programmer, mais c'est vrai que j'ai un peu déserté ici, pour différentes raisons.
"du temps où j'étais actif sur delphifr ;o)" => Bestiol reviens, tes bons tuyaux nous manquent !!
Oui c'est plus adapté mais c'est aussi (et surtout) pour me faire plaisir (on est toujours plus content d'utiliser une classe que l'on a soi même developpée).
D'autant plus que la prog', c'est pas mon travail !! ;-) je suis lycéen.
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 3 nov. 2005 à 17:45
"en son temps" = du temps où j'étais actif sur delphifr ;o)
Ceci dit pour "mon" parser, ce n'est qu'une adaptation commentée (enfin j'espère que je l'avais commentée :op) de la classe TParser.
Vu ce que tu décris, ton mode de fonctionnement semble le plus indiqué pour ton projet ^^
Delphiprog > J'ai evidement vu la source de Bestiol avant de coder celle-ci. C'est grâce à elle que j'ai pu comprendre le fonctionnement d'un parser.
"en son temps" = lol. Il est loin d'être démodé son parser. Surtout que niveau vitese, je suis loin derrière.
Si je ne fais pas dériver ma classe TStringParser en fonction du contexte, c'est que, dans le projet que je fais, le contexte est défini dynamiquement à l'execution. L'héritage dans ce cas n'est donc pas possible (en totu cas, pas à a connaissance, avis aux initiés ...).
Pour le Application.CreateForm(TFrmDebug, FrmDebug); je vais mettre à jour ma source.
Mais tout le monde avait compris qu'elle ne servait que pour le dubbggage.
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 3 nov. 2005 à 17:37
Bestiol > Tu as raison, on peux tout faire avec le TCustomStringParser. Seulement, j'ai eu besoin de masquer certaines méthodes et d'en rajouter d'autres pour un projet. J'ai donc divisé ma classe en deux: une partie qui sert pour tous les descendants (TcustomStringParser), ensute j'ai crée la classe TStringParser (qui je l'avoue, d'un point de vue POO n'est pas très génail) et une autre classe descendante de TCustomStringParser.
En gros, je n'ai publié qu'une partie du code.
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 3 nov. 2005 à 15:38
Source de très bonne qualité (code, commentaires etc), c'est vraiment top !
Le seul "reproche" que je ferai, c'est que si on n'utilise pas de Callback, la procédure ParserChaine ne sert pas vraiment, il y aurait sans doute eu moyen de tout faire avec le constructeur et une fonction de parsing non ?
Delphiprog, pour ce qui est du contexte du langage tu as tout à fait raison ! :o)
Et cela ne se limite d'ailleurs pas à un langage de programmation ^^
le point fort de ce parser c'est justement de pouvoir définir son propre contexte. Mais à vrai dire je trouve que ça masque un peu l'intérêt de l'héritage de classe : tout peut être fait avec la classe TCustomStringParser.
L'idée de créer un TCustomParser dérivé en TStringParser, THTMLParser, TPascalParser etc. me plait plus d'un point de vue POO.
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 2 nov. 2005 à 22:06
Par contre un truc, oublie pas d'enlever dans l'unité program
Application.CreateForm(TFrmDebug, FrmDebug);
Sinon çà marche, c'est propre, c'est indenté, aéré ... j'adore !
Je n'ai pas encore fait tout le tour mais tu as su contourné les bugs que j'avais rencontré, notamment avec les " ' " et la delimitation de certain token.. Bravo !
Damien (un admirateur lol)
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 2 nov. 2005 à 21:56
J'avais oublier de dire un truc ... excellente source et merci pour la mise a jour :-)
PS : Je comprend pas pourquoi il y a si peu de commentaire ...
cs_Fanch56
Messages postés2Date d'inscriptionmardi 20 mai 2003StatutMembreDernière intervention 2 novembre 2005 2 nov. 2005 à 20:31
merci pour cette classe, cet exactement ce dont j'avais besoin pour mon projet :)
22 mai 2008 à 19:32
Tu récupères bien "toto test 6" dans une chaîne.
Après, un petit coup de Copy(Str, 11, Length(Str) - 10) fait l'affaire pour retrouver "6".
Sinon, faut passer par un parser de regexpr, c'est quand même plus complet.
22 mai 2008 à 01:26
Ma variable est pour l'exemple, "toto test 6".
je veux récupérer "toto test" dans une chaine et 6 dans une autre. (le tout sans les " bien sur)
Tout le fichier que je parse est comme ça.
enfin bien sur, 20% d'exception qui sont "normales" genre tutu 6, et la pas de problème.
Amitiés
21 mai 2008 à 15:33
Tu déclares 'test toto', mais AVANT des trucs comme 'test' ou ['a'..z'] et compagnie.
Et tout roule...
21 mai 2008 à 08:20
mais il manque toujours une option dans tous les parsers que
j'ai essayé.
Tout simplement : Si mon Mot clef est composé de 2 Mots ?
pour exemple , mot clef = "test toto" (sans les " bien sur.)
comment fait-on ?
Amitiés et bravo pour le travail.
29 avril 2006 à 07:27
petite amelioration de performances que tu peux faire :
{ -31..46ms sur 100000 requettes }
function EnleverAccent(C: Char): Char;
var
CR : Char;
begin
case ord(C) of
192..197 : CR := 'A';
199 : CR := 'C';
200..203 : CR := 'E';
204..207 : CR := 'I';
209 : CR := 'N';
210..214 : CR := 'O';
138 : CR := 'S';
217..220 : CR := 'U';
159,221 : CR := 'Y';
142 : CR := 'Z';
224..229 : CR := 'a';
231 : CR := 'c';
232..235 : CR := 'e';
236..239 : CR := 'i';
241 : CR := 'n';
242..246 : CR := 'o';
154 : CR := 's';
249..252 : CR := 'u';
253,255 : CR := 'y';
158 : CR := 'z';
else
CR := C;
end;
Result := CR;
end;
{ -1900..1910ms sur 100000 requettes}
function EnleverAccents(const S: string): string;
var
PResult : PChar;
PStr : PChar;
begin
SetLength(Result,Length(S));
PResult := PChar(Result);
PStr := PChar(S);
while PStr[0] <> #0 do begin
PResult[0] := EnleverAccent(PStr[0]);
inc(PResult);
inc(PStr);
end;
end;
{ -1125..-1200ms sur 100000 requettes }
function TSysCharSetToString(const X: TSysCharSet): string;
var
C : Char;
PResult : PChar;
begin
SetLength(Result,256);
PResult := PChar(result);
PResult[0] := '"';
inc(PResult);
for C := #1 to #255 do {pas bien! #0 marque la fin d'une chaine AZT}
if C in X then begin
PResult[0] := C;
inc(PResult);
end;
PResult[0] := '"';
inc(PResult);
PResult[0] := #0;
end;
pour le reste, tout semble parfait ... comme d'hab.
3 nov. 2005 à 22:15
3 nov. 2005 à 17:59
Enfin étudiant, maintenant... Toujours un plaisir de programmer, mais c'est vrai que j'ai un peu déserté ici, pour différentes raisons.
(mais mon espion personnel est là mdr :0D)
3 nov. 2005 à 17:54
Oui c'est plus adapté mais c'est aussi (et surtout) pour me faire plaisir (on est toujours plus content d'utiliser une classe que l'on a soi même developpée).
D'autant plus que la prog', c'est pas mon travail !! ;-) je suis lycéen.
3 nov. 2005 à 17:45
Ceci dit pour "mon" parser, ce n'est qu'une adaptation commentée (enfin j'espère que je l'avais commentée :op) de la classe TParser.
Vu ce que tu décris, ton mode de fonctionnement semble le plus indiqué pour ton projet ^^
3 nov. 2005 à 17:40
"en son temps" = lol. Il est loin d'être démodé son parser. Surtout que niveau vitese, je suis loin derrière.
Si je ne fais pas dériver ma classe TStringParser en fonction du contexte, c'est que, dans le projet que je fais, le contexte est défini dynamiquement à l'execution. L'héritage dans ce cas n'est donc pas possible (en totu cas, pas à a connaissance, avis aux initiés ...).
Pour le Application.CreateForm(TFrmDebug, FrmDebug); je vais mettre à jour ma source.
Mais tout le monde avait compris qu'elle ne servait que pour le dubbggage.
3 nov. 2005 à 17:37
Quoi qu'il en soit, ça reste un très bon code ;o)
3 nov. 2005 à 17:34
En gros, je n'ai publié qu'une partie du code.
3 nov. 2005 à 15:38
Le seul "reproche" que je ferai, c'est que si on n'utilise pas de Callback, la procédure ParserChaine ne sert pas vraiment, il y aurait sans doute eu moyen de tout faire avec le constructeur et une fonction de parsing non ?
Delphiprog, pour ce qui est du contexte du langage tu as tout à fait raison ! :o)
Et cela ne se limite d'ailleurs pas à un langage de programmation ^^
le point fort de ce parser c'est justement de pouvoir définir son propre contexte. Mais à vrai dire je trouve que ça masque un peu l'intérêt de l'héritage de classe : tout peut être fait avec la classe TCustomStringParser.
L'idée de créer un TCustomParser dérivé en TStringParser, THTMLParser, TPascalParser etc. me plait plus d'un point de vue POO.
2 nov. 2005 à 22:06
Application.CreateForm(TFrmDebug, FrmDebug);
Sinon çà marche, c'est propre, c'est indenté, aéré ... j'adore !
Je n'ai pas encore fait tout le tour mais tu as su contourné les bugs que j'avais rencontré, notamment avec les " ' " et la delimitation de certain token.. Bravo !
Damien (un admirateur lol)
2 nov. 2005 à 21:56
PS : Je comprend pas pourquoi il y a si peu de commentaire ...
2 nov. 2005 à 20:31