30

ça revient exactement à faire à l'arrache si tu le fais lors de la même passe
«Les gens exigent la liberté d’expression pour compenser la liberté de pensée qu’ils préfèrent éviter.» - Sören Kierkegaard

La République, c’est comme la syphilis : quand on l’a attrapée, soit on se fait sauter le caisson, soit on essaie de vivre avec.

31

En tout cas, ça ressemble tout à fait à ce que je fais hehe

32

Folco (./24) :
Et sinon, merci pour strncmp, ceci dit, ça ne m'empêchera pas de vérifier qu'après un symbole, il n'y a pas d'autres caractères (donc je devrais trouver toujours ';', ',', '|', EOL, EOF, 0x20, 0x09, ou alors vérifier qu'il n'y a pas de chiffre/lettre/point/underscore. Et ça oblige à calculer la longueur de la chaine qui me sert de référence pour la comparaison. J'ai implémenté une comparaison "on-the-fly", ça me semble être le plus rapide.

size_t l=strlen(keyword);
if (!strncmp(source,keyword,l)&&(!keyword[l]||strchr(";,|\n \t",keyword[l]))
  ...

very (./30) :
ça revient exactement à faire à l'arrache si tu le fais lors de la même passe

Pas du tout, c'est le fonctionnement utilisé par presque tous les couples lexeur-parseur.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

33

( ben ben j'ai une version civilisé de "à l'arrache" alors... )
«Les gens exigent la liberté d’expression pour compenser la liberté de pensée qu’ils préfèrent éviter.» - Sören Kierkegaard

La République, c’est comme la syphilis : quand on l’a attrapée, soit on se fait sauter le caisson, soit on essaie de vivre avec.

34

Zephyr (./8) :
Bon, puisque le sujet Lex/Flex et Yacc/Bison est incontournable, autant ajouter un petit mot dessus : il s'agit de programmes avec lesquels tu vas respectivement pouvoir générer un lexeur et un parseur en indiquant d'un coté les "mots" valides de ton langage (sous la forme d'expressions régulières par exemple) et d'un autre la grammaire avec un formalisme proche de celui du ./6.

Avis perso : ça permet d'obtenir très vite un lexeur/parseur et donc ça peut être utile pour des petits programmes que tu veux réaliser rapidement, mais ça génère un code absolument immonde (aussi bien point de vue lisibilité qu'optimisation). Pour un "vrai" projet, et à fortiori si tu le fais en partie pour le plaisir d'apprendre, mon seul conseil serait de ne surtout jamais toucher à ces outils ^^

c'est le choix que j'ai fait pour etp-basic compiler...
(d'où des trucs du genre http://code.google.com/p/etpbasiccompiler/source/browse/trunk/ETPC/ETPC/Syntax/verisyn.cpp)
Tout ce qui passe pas par le port 80, c'est de la triche.

35

Bah c'est super et c'est ton droit le plus strict. Ceci dit ça ne contredit pas vraiment mon post, à moins que tu considères ETP comme un gros projet (à ne pas voir comme une critique, mais pour moi ça ressemble plus à un petit projet perso qu'autre chose).
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

36

Zephyr (./8) :
Bon, puisque le sujet Lex/Flex et Yacc/Bison est incontournable, autant ajouter un petit mot dessus : il s'agit de programmes avec lesquels tu vas respectivement pouvoir générer un lexeur et un parseur en indiquant d'un coté les "mots" valides de ton langage (sous la forme d'expressions régulières par exemple) et d'un autre la grammaire avec un formalisme proche de celui du ./6.

Avis perso : ça permet d'obtenir très vite un lexeur/parseur et donc ça peut être utile pour des petits programmes que tu veux réaliser rapidement, mais ça génère un code absolument immonde (aussi bien point de vue lisibilité qu'optimisation). Pour un "vrai" projet, et à fortiori si tu le fais en partie pour le plaisir d'apprendre, mon seul conseil serait de ne surtout jamais toucher à ces outils ^^

Code C qui n'est pas très maintenable c'est sur, mais en même temps tu n'a pas besoin de le maintenir, c'est le code lex ou yacc qui est a maintenir. Sinon celui qui sors le code le plus mauvais reste lex/flex, yacc/byycc/bison (enfin j'ai un doute pour le dernier) sort un code qui peut bien sur être optimisable par rapport a un fait a la main, mais il ne se démerde pas si mal. fait une analyse grammaticale sur un langage complexe peu vite être très difficile a la main sad

(et a vrai dire quand je vois le code C++ d'onur, si demain on découvre qu'il y a une erreur de précédence obscure sur l'utilisation des parenthèse dans un cas précis, bon courage pour corriger un tel bug dans un analyseur fait main :/)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

37

Ah c'est sûr, les langages deviennent aujourd'hui de plus en plus riche et c'est bien le point fort de ces outils que de proposer une méthode rapide pour construire lexeur/parseur (sinon ils n'auraient pas beaucoup d'intérêt). Mais je trouve quand même que ça vaut le coup, pour un gros projet, de prendre le temps d'écrire son parseur à la main pour le rendre plus spécifique et donc plus efficace.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

38

./37 Yep ^^ Même si je pense que ça n'a d'intérêt que si tu es sur de ta grammaire ^^ (enfin si c'est un gros projet, il y a de forte chances que ça soit le cas ^^)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

39

Zephyr (./35) :
Bah c'est super et c'est ton droit le plus strict. Ceci dit ça ne contredit pas vraiment mon post, à moins que tu considères ETP comme un gros projet (à ne pas voir comme une critique, mais pour moi ça ressemble plus à un petit projet perso qu'autre chose).

Non non ca ne contredit pas ton post, ça le confirme. Je dis pas _toujours_ exactement le contraire de ce que tu dis wink

Edit: cela dit, c'est un projet certes perso mais le langage est quand même assez complexe (cf le fichier de vérif syntaxique (et aussi de sémantique dont j'ai pas posté le lien)) en tout cas bien plus qu'un langage d'assemblage. Mais je pense que c'était un choix judicieux de coder moi meme, contrairement à ce que semblait dire K².
Tout ce qui passe pas par le port 80, c'est de la triche.

40

Et ben moi je dis que si tu avais utilisé Flex et Bison, peut-être la version C++ de ETP serait finie maintenant. roll Tu as perdu ton temps sur le parseur écrit à la main alors que tu aurais pu l'utiliser pour le reste du code.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

41

voué enfin faut pas raconter n'importe quoi non plus, écrire un parseur à la main c'est pas non plus la mer à boire et je suppose que c'est pas ça qui aurait multiplié par deux le temps qu'il aurait pu consacrer au reste du projet...
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

42

un parser a la main pour un language comme C++, ca doit pas etre super facile quand mm smile

43

en même temps c'est un peu "le" contre-exemple grin

mais bon d'une part je pense pas que la grammaire du langage d'Onur soit aussi complexe que celle du C++, d'autre part c'est pas franchement signe de qualité de la grammaire du C++ d'être aussi difficile à parser
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

44

ouep, c pas un signe de qualite de la grammaire, mais du language, ca l'aide a etre tres (trop?) souple smile (ce qui plait a pas mal de developers et ce qui plait pas aux QA/Sec)

45

Faut reconnaitre que l'avantage de l'assembleur, c'est que c'est un langage très rigide dans son écriture. J'imagine que la surcharge d'opérateurs ne doit pas être des plus simples à gérer à la main, alors qu'en assembleur, on est très loin de tout ça. smile

46

Un truc qui m'intrigue, toi qui codes quasi qu'en assembleur. Quand tu codes en assembleur, tu as pas l'impression de refaire tout le temps les memes choses? les memes schémas qui reviennent?...
Tout ce qui passe pas par le port 80, c'est de la triche.

47

Oui et non. cheeky Redimensionner un handle se fait toujours de la même manière, mes loaders se ressemblent tous etc... Donc en effet, il y a des ressemblances, mais c'est bien évidemment au niveau du concept d'un soft que ça fait que ça va changer.

Et par exemple, j'ai un parsing assez poussé de ma ligne de commande pour mon assembleur (parce qu'elle est assez puissante et flexible, on peut faire 36 trucs en un seul appel, générer plusieurs objets au choix et créer plusieurs binaires si l'on veut, et spécifier tout un tas d'option par fichier, même après l'avoir fait de manière globale). Ben pour faire mon parseur de ligne de commande, je m'y suis repris à 5 fois pour avoir un résultat qui me satisfasse. Ca ressemble à rien de ce que j'avais fait auparavant (même si ok, une comparaison de deux chaines sera toujours une comparaison de deux chaines, encore une fois j'avais jamais codé ce concept grin)

Maintenant j'attaque le parseur de source, pareil j'ai jamais fait ça. L'assemblage proprement dit des opcodes sera un autre défi. Enfin, le linker (et là je flippe déjà grin) sera encore quelque chose de complètement nouveau niveau programmation. smile

Donc en résumé clair, certaines routines reviennent évidemment, mais les concepts changent au gré des programmes. smile

48

|==================================================================
|	SkipSpaces
|==================================================================
|	Advance reading pointer to the first char which is not a space or a tab
|
|	input	a3	current position in the source
|	output	Z-flag	unset if a char is found, set if EOL/EOF
|		a3	is updated
|	destroy	d1.b
|==================================================================
SkipSpaces:
	move.b	(%a3)+,%d1			|read and test current char, update pointer
	beq.s	SkipSpacesEnd
	cmpi.b	#0x20,%d1			|space ?
	beq.s	SkipSpaces
	cmpi.b	#0x09,%d1			|tab ?
	beq.s	SkipSpaces
	cmpi.b	#0x0d,%d1			|EOL ?
SkipSpacesEnd:
	subq.l	#1,%a3				|don't modify Z-Flag
	rts

Kevin, j'ai écrit ça, t'aimes pas ce genre de fonction ?

edit -> j'attends bien sûr l'avis des autres, le but étant de savoir si c'est problématique ou sale d'avoir un flag comme valeur de retour. smile

49

sick bang ...
OK, il y a de ça dans le code de démarrage de TIGCCLIB (même écrit par moi grin dehors), mais dans un programme utilisateur, c'est quand-même limite. eek (Surtout que la taille de ton assembleur est probablement nettement supérieure à celle du code de démarrage de TIGCCLIB et que ta fonction risque d'être utilisée à beaucoup d'endroits qui ne sont pas forcément proches de ton commentaire sur la convention d'appel bizarre de cette fonction.)
Mais après tu fais ce que tu veux, mais il ne faudra pas t'étonner si tu introduis des bogues à cause de ce système. De plus, si la fonction évolue, il risque de devenir difficile de continuer à retourner un flag, tu risques de devoir changer ça à un moment.
Mais le pire reste quand-même quand je vois ce genre de fonctions dans l'API exportée d'une lib (qu'elle soit statique ou dynamique).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

50

Ok, mais dans mon cas ce n'est pas une lib tu l'as compris, c'est uniquement utilisé en interne. Je suis d'accord que côté maintenabilité c'est pas forcément évident, mais ça semble quand même dur à casser (dans quel cas une fonction appelante ne pourrait pas se contenter de lire ce flag pour savoir ce qu'elle doit faire ?).

51

Bof, moi je ne vois aucun problème à utiliser ce genre de conventions, et c’est même très bien si tu peux profiter du fait de coder en ASM pour accéder à certains avantage qui sont perdus avec les langages de haut niveau.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

52

Ce qui risque de casser, c'est que la fonction pourrait changer à un moment pour rajouter des trucs qui cassent ton flag (que tu es obligé de rajouter pour une raison ou pour une autre, ça arrive souvent qu'on trouve un cas particulier auquel on n'a pas pensé lors de la conception), et donc pour garder ta convention tu es obligé de faire quelque chose de tordu comme faire des tests sur un registre avec une valeur sauvegardée pour restaurer ton flag, ou carrément un "move to %ccr" (beurk!).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

53

Oui m'enfin, je suis d'accord sur le fond, je ferai pas ça avec une fonction de 500 octets, mais là c'est tout piti cheeky

54

Mais justement ça risque de ne pas rester comme ça.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

55

Tu dis ça de manière théorique ou tu vois un problème de design dans la fonction ?

56

Tu pourrais par exemple vouloir rajouter le support pour les /* commentaires style C */. (GNU as les permet.)
Et ce n'est qu'un exemple qui me vient comme ça, on ne peut pas toujours prévoir comment un logiciel va évoluer.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

57

Oui, mais ça irait plus dans une autre fonction ça, SkipComment (j'y ai déjà pensé, mais j'ai aucune envie de l'implanter pour le moment, ya des priorités grin)

58

Voilà, c'est cette fonction qui changerait dans ce cas :
|==================================================================
|	SkipComment
|==================================================================
|	Advance reading pointer to the beginning of the next line
|	Never return, jump to EndOfSource in case of EOF, or ReadLine in case of EOL
|
|	input	a3	current position in the source
|	output	a3	point to the first char of the next line
|		d4	updated
|		d5.b	becomes invalid
|	destroy	nothing
|==================================================================
SkipComment:
	addq.l	#1,%a3				|skip '|'
SkipCommentLoop:
	move.b	(%a3)+,%d5			|read next char
	beq	EndOfSource			|EOF => post treatment
	cmpi.b	#0x0d,%d5			|EOL ?
	bne.s	SkipCommentLoop			|no, loop until it's found
		addq.w	#1,%d4			|else update line counter
		bra	ReadLine		|and begin a new line

Mais ça ne casserait rien. Tu n'aimes pas non plus les fonctions qui ne retournent pas ? Je demande, hein cheeky



Et au passage, comment appeler correctement ce pointeur qui me sert à lire le texte ? J'ai écrit "reading pointer", mais ça doit être de l'anglais petit nègre, et le pire est que je ne trouve même pas un nom qui me convient en français poru désigner ce pointeur. grin

59

Curseur ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

60

Et:
/* foo */ move.l %d1,%d2
tu le parses comment?
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité