Comment réaliser un mini-parser mIRC ?

uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 18 nov. 2008 à 16:37
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 20 nov. 2008 à 01:21
Bonjour à tous.
Je voulais savoir si quelqu'un avait déjà tenté de réaliser un parser mIRC (peut importe le langage, mIRC inclus).
Du moins, je cherche à vérifier syntaxiquement un code mIRC. Oulah... c'est du boulot, ça. Oui mais je m'explique.
Pour "vérifier un code", il y a deux étapes, elles-mêmes divisées en plusieurs étapes..
I- la syntaxe :
a- mot à mot (exemple : var %%a = 1 -> retourne une erreur sur "%%")
b- bloc à bloc (exemple : if (%pouet == 1) echo -a ok } -> retourne une erreur sur "}" car aucune accolade ouvrante n'a été écrite)
II- la logique & l'algorithmique:
a- logique (exemple : var %a = 1 | while (%b) echo -a ok -> retourne une erreur sur "%b" considérée comme non déclarée)
b- algorithmique (exemple :
var %a = 1 | echo -a %a | inc %a | echo -a %a | inc %a | echo -a %a | inc %a | echo -a %a | inc %a | echo -a %a
peut être remplacé par
var %a = 1 | while (%a <= 5) { echo -a %A | inc %a }
entre autres)

Je voulais donc savoir si quelqu'un s'était déjà intéressé à ce genre de chose (au moins une des plusieurs catégories citées plus haut) et si oui, quel(s) moyen(s) a-t-il pensé.
Lecture caractère par caractère ? Vérification ligne par ligne ? Bloc par bloc ? ...
Evidemment, le but n'est pas de recoder un interpréteur mIRC, mais de pouvoir détecter des erreurs ou problèmes de logique dans un code.

Je vais de mon côté me tourner sur les autres sites du réseau, certains ont déjà dû réaliser ce genre de chose.

Cordialement, uaip.

16 réponses

cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
18 nov. 2008 à 18:05
Moi, comme tu le sais, j'voudrais que tu fasse ma dll pour colorer le mirc script editor :(
J'ai commencer un parseur qui colore les $identifieur, %variable (j'avais deja un truc pour les parenthese) mais je crois que tu vois trop loin avec tes idees, tu dis que tu ne veux pas refaire un interpreteur, pourtant c'est exactement ce que tu vas faire dans ce que tu dis.Le parseur original est pas super top si on est pointilleux, et a pris pas mal de temps a ce faire, toi tu decris des situations que tu voudrais traiter que le vrai parseur ne gere meme pas, je pense vraiment que tu es trop ambitieux, mais bon, je serai bien content que tu me prouve le contraire mdr...

Petite truc de merde, le II a) n'est pas une erreur en mirc, c'est pas du C, une variable non delcare n'est pas du tout une erreur, tu peux si tu veux considere comme un warning genre "attention, variable non declare"
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
18 nov. 2008 à 18:14
Oui c'est exact pour le II a. IRC ne génère pas d'erreur mais le code n'est pas du tout logique (d'où le titre du II). Je suis trop ambitieux oui, c'est pour ça que je vais faire chaque chose en son temps. Celà dit, non je ne refais pas du tout le parser "officiel", car lui, il interprète le code. Exemple : $gettok(ahah eheh,2,32) va retourner eheh. Dans mon projet rien ne sera retourné, l'appli va juste vérifier si la syntaxe est [pratiquement, pour le moment] bonne. C'est donc une toute petite étape du parser "officiel".

Sinon pour ta dll, oui oui pourquoi ne pas tenter, mais comme tu le sais...
- je n'ai pas le code source
- je n'arrive pas à créer une dll valide avec Code::Blocks

Cordialement, uaip.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
18 nov. 2008 à 18:15
Oups, "mIRC" et non "IRC".

Cordialement, uaip.
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
18 nov. 2008 à 19:08
"car lui, il interprète le code. Exemple : $gettok(ahah eheh,2,32) va
retourner eheh. Dans mon projet rien ne sera retourné, l'appli va juste
vérifier si la syntaxe est [pratiquement, pour le moment] bonne."

Oui, mais en quoi tu ne refais pas le parseur lol ?
Vous parser le code tout les deux.
mIRC executera le code s'il doit le faire, et toi tu fera qqch si tu veux.
Par exemple avec ton gettok : $gettok(ahah eheh,2,32)
Vous allez tout les deux dire "il n'y a pas de fautes", mirc evalura et dira que c'est "eheh" et toi tu fera tres certainement rien parce que ton but est de detecter les erreurs :)

Et pour la dll, je sais surtout que tu n'a pas chercher a te faire aider comme il le faut  ;) , et tu n'a pas besoin de code source puisque tu doit faire la dll, c'est toi qui fait le code non :p ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
18 nov. 2008 à 19:28
Je pensais que tu voulais que je reprenne l'autre... Effectivement ça change, et ça devient même plus intéressant. Je dois installer Windows XP Pro (je l'aurais normalement d'ici la fin de la semaine), là dessus j'installerai Visual C++ 2005, et je pense que les créations de dlls devraient fonctionner là dessus. De toute façon je te tiendrais au courant.

Juste une remarque pour le parseur, le $gettok() était un bête exemple. Ce que je voulais dire c'est que moi je fais simplement un parseur générique. Concernant la syntaxe, il (je l'espère) détectera uniquement les erreurs "générales". Mais par exemple si le code appelle une alias créée par l'utilisateur, je n'irais pas vérifier si les paramètres envoyés à l'alias correspondent bien à ceux reçus (exemple : utiliser un $4 dans l'alias alors qu'il n'y a que 3 paramètres).
De plus
"Vous allez tout les deux dire "il n'y a pas de fautes", mirc evalura et
dira que c'est "eheh" et toi tu fera tres certainement rien parce que
ton but est de detecter les erreurs :)"
C'est ce que je dis, je ne fais qu'une toute petite partie du parser mIRC (détecter les éventuelles erreurs). C'est sans doute ce qu'il y a de plus simple.

Bref, à part ça je vois que personne ne s'y intéresse. (en même temps, c'est peut-être pas le bon site pour parler de parsers)...

Cordialement, uaip.
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
18 nov. 2008 à 20:24
En meme temps ta pas poster ya super longtemp, et le forum est pas des plus actifs...
Et contrairement a toi, je penses que detecter les erreurs comme tu dis, c'est loin d'etre aussi simple
0
cs_TropNul Messages postés 340 Date d'inscription dimanche 18 septembre 2005 Statut Membre Dernière intervention 22 octobre 2009
19 nov. 2008 à 07:42
Bonjour vous :)

Pour parser des chaines de caractères, c'est simple mais pour le faire intélligement, là c'est plus complexe mais pas impossible.

Et puis, est-ce que les expressions régulières en mIRC permettent des patterns multilignes? J'avais jamais pu le faire sauf en passant par des 'turnarounds' chiants au niveau de la performance.

@uaip : moi ça m'intéresse car je vais devoir faire un parser complet pour un site web. (je me suis mis au PHP maintenant lol)

- Idée : tu pourrais en faire une application web ou les clients viendraient vérifier leurs sources (c'est ce qui m'est venu en premier en lisant ce thread)

- Langage que j'aurais choisi : PHP, même si du C serait pas idiot non plus pour en faire un executable au final ^^.

- Comment je m'y prendrais (syntaxe) : Et bien j'analyserais d'abord les blocs de codes les plus gros possibles, puis je parcourais toutes les 'ramifications' qui s'y trouvent (donc du ligne par ligne et enfin du caractère par caractère).

- Comment je m'y prendrais (logique) : Là ça se corse (au ptain, faut que j'aille en vacances là-bas un jour ou l'autre, une amie m'en a parler hier et ça ma fait rêver), car faut carrément créer une IA, avec tous les 'contextes' possibles (enfin que tu connais). ou alors tu lui fais un module d'apprentissage, qui lorsqu'on lui aura fourni un code correcte et logique, gardera dans ses bases ce qu'il aura appris dans chaque cas).

Voila, c'est ce qui me vient là sur le moment.

En espérant que ça t'aidera si tu t'y mets.

Cordialement
0
WorldDMT Messages postés 871 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 6 janvier 2012 1
19 nov. 2008 à 11:02
salut

"Moi, comme tu le sais, j'voudrais que tu fasse ma dll pour colorer le mirc script editor :("

je ne sais pas si j'ai compris mais moi j'utilise mEditor ça color et c'est cool comme editeur.
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
19 nov. 2008 à 17:49
Oui WorldDMT j'ai déja testé, je n'aime pas, quand tu fait un code, si c'est pour le reloadez a chaque fois que tu le change, enfin bref meditor, s'pas pour moi, j'ai déja une dll qui colore directement le mirc script editor, mais elle n'est pas des plus efficaces.Cette dll elle detecte déja les erreurs d'accolades, mais mal...
Je me répete, c'est un bien beau projet, mais le scripting mirc est trop souple, et si tu veux géré exactement ce que mirc gère, je te souhaite pas bonne chance, mais une longue vie ;)

Tropnul : http://www.ircfr.com/forum/sujet-REGEX-MULTILIGNE_822230.aspx
mais vu qu'il ne compte pas le faire en mirc...
0
WorldDMT Messages postés 871 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 6 janvier 2012 1
19 nov. 2008 à 17:53
mm je vois oui
0
WorldDMT Messages postés 871 Date d'inscription jeudi 6 juillet 2006 Statut Membre Dernière intervention 6 janvier 2012 1
19 nov. 2008 à 18:17
pour la syntaxe pas si grave je pense c'est possible avec mIRC
mais pour la logique et l'algorithmique 
pour la partie "a" peu etre simple mais la partie "b" houlala !!
c'est pas du n'importe quoi :/
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
19 nov. 2008 à 18:44
Exact, je compte coder tout ça en C.
Pour le moment, l'état du "projet" est assez précaire.
L'interface graphique y est, il y a touts les options de l'éditeur mIRC (notamment le test de parité des accolades), réindentation, coloration, ainsi que des rajouts automatisés d'aliases, commentaires, (assez pratique pour les débutants, par exemple) etc...
J'avais déjà fait un projet de ce style, bien mieux, mais trop largement beugué. Celui-là ne comporte (à mes tests) aucun beug.
Screen :

Mais je trouve ça trop "basique", car des éditeurs de texte, il y en a plein. Je voulais donc rajouter une touche d'originalité, c'est pour celà que j'avais pensé au parser...

Cordialement, uaip.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
19 nov. 2008 à 18:48
Oulah, petite erreur, il est codé en C++. J'ai posté un screen dans l'espoir qu'un codeur tombe sur ce topic est soit intéressé pour m'aider éventuellement.

Cordialement, uaip.
0
cs_wims Messages postés 2466 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 1 août 2010 1
19 nov. 2008 à 20:08
Tu m'avais déja expliqué, mais là, tu ne fait pas la coloration syntaxique, on le fait pour toi c'est ça ?
Et c'est ce qui me fait penser que ta coloration syntaxique est fausse, il y a des espece d'incohérence non ? ? Le screen shot donne envie, mais ne ressemble t-il pas exactement ton ancien programme ?
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
20 nov. 2008 à 01:09
Du tout ^^
Le composant qui permet la coloration est une dll (Scintilla.dll) qui permet de créer une sorte de RichEdit qui colore "automatiquement" des mots-clés. Mais pour savoir quels mots-clés colorer et comment les colorer, c'est à toi de le programmer. L'avantage par rapport à un RichEdit normal, c'est qu'une fois programmé, le composant colore lui-même les mots-clés. Ca évite simplement de devoir boucler à chaque ajout de mot. C'est d'ailleurs la "seule" possibilité pour créer un éditeur de texte performant. Je ne suis pas sûr à 100% (on n'est jamais trop sûr) mais pour tous les IDE, éditeurs, etc qui colorent le texte, aucun n'utilise un RichEdit "brut".
Mon ancienne source faisait pareil (entre autres), mais avec tellement de bogues que je ne les compte même plus. Là, j'ai entièrement recodé l'appli. La toolbar aussi est différente et des menus ont été (et d'autres encore seront) rajoutés.
Toutes les conneries du style, auto-indentation, folder (c'est le fait de pouvoir cacher des blocs), vérifications de brackets, parité, etc... c'est du putain de boulot de ouf. J'ai entièrement refait quelques algos pour ça.
Mais bon... le sujet maintenant c'est la réalisation du parser

Cordialement, uaip.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
20 nov. 2008 à 01:21
Ah oui et pour répondre à ta remarque de coloration foireuse, en effet il y a des petits défauts, du style par exemple (dans le screen) de 243786.html et %flood.
J'explique vite fait pourquoi : Scintilla permet d'utiliser plusieurs lexers, selon le langage à colorer (C, Perl, TCL, Fortran, Caml, etc) mais ne propose pas de lexer pour le mIRC.
Donc, j'ai trouvé que le plus logique était de reprendre le lexer C, qui est le plus proche du mIRC (j'aurais aussi pu choisir le Perl pour colorer les $identifieurs mais bon...)

On peut cependant créer nos propres lexers à inclure dans Scintilla. Mais il faut :
- d'une part créer le lexer (c'est pas si simple, sachant que la doc est assez pauvre là dessus)
- d'autre part implémenter le lexer créé dans la dll. Là aussi c'est assez chiant. En m'aidant de la doc j'avais tenté de passer par Python mais en vain...
En bref, je trouve que les "beugs" de coloration sont assez mineurs dans l'ensemble. On retrouve bien les structures conditionnelles (if / elseif / else) les boucles, etc
Ma priorité reste le parser (et oui, encore ce foutu parser).

Cordialement, uaip.
0
Rejoignez-nous