Mea culpa, le copié coller à partir des navigateurs c'est mal. Surtout quand on rectifie à la va vite comme je l'ai fait. Vraiment désolé zell, en fait y'a un else qui a sauté dans le tas, d'où le passage dans le dernier if de mon côté.
Sinon de mon côté, je préfère le C/C++ au Java même si cette année, j'ai surtout fait du Java. Pour la préférence, je pense que ça vient surtout du fait que c'est le langage avec lequel j'ai appris à programmer.
Message édité par shadow2 le 05-05-2008 à 19:14:17
---------------
Linux peut être sexy, le preuve :
shadow2@shadow2-linux:~$ who | grep -i blonde | talk; cd ~; wine; talk; touch; unzip; touch; strip; gasp; finger; mount; fsck; more; yes; gasp; unmount; make clean; sleep;
J'ai commencé vite fait avec le Basic sur calculatrice.
J'ai réellement commencé à programmer en C à l'IUT, puis en C++ (vite fait).
En deuxième année, on a attaqué Java et c'est là que j'ai été conquis par ce langage
J'ai commencé vite fait avec le Basic sur calculatrice.
J'ai réellement commencé à programmer en C à l'IUT, puis en C++ (vite fait).
En deuxième année, on a attaqué Java et c'est là que j'ai été conquis par ce langage
J'ai un parcours assez similaire même si j'ai vraiment programmé peu sur ma TI, d'abord C puis C++ et enfin Java. (en passant en vitesse sur du VB que je trouve vraiment affreux)
---------------
Linux peut être sexy, le preuve :
shadow2@shadow2-linux:~$ who | grep -i blonde | talk; cd ~; wine; talk; touch; unzip; touch; strip; gasp; finger; mount; fsck; more; yes; gasp; unmount; make clean; sleep;
J'aimerais bien une machine virtuelle Java optimisée et développée spécialement pour la DS et la PSP
Ca m'inciterait à développer 2 3 trucs sur ces plates-formes.
Bande d'hérétiques Le pire c'est que vu que la famille de procs utilisé par la DS est vachement utilisée dans tout ce qui est embarqué si ca se tu peux trouver une VM fonctionnelle sous DS (du moins sur le proc principal).
---------------
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d.
1f u c4n wr1t3 1t t00.
J'ai commencé vite fait avec le Basic sur calculatrice. J'ai réellement commencé à programmer en C à l'IUT, puis en C++ (vite fait). En deuxième année, on a attaqué Java et c'est là que j'ai été conquis par ce langage
Moi c'est l'inverse : j'ai commencé à programmer en Basic au lycée, puis en école j'ai commencé par le Java, puis on s'est mis au C/C++. Résultat : je déteste le C et le C++, et j'adore le Java (et le C# dans une moindre mesure, je n'y ai pas touché depuis un moment) Je pense que c'est parce que j'ai commencé par le Java, le C et le C++ présentent bien plus de contraintes pour quelqu'un qui a l'habitude de laisser la VM gérer la mémoire (pas de pointeurs à gérer, présence du Garbage Collector, ...). Ok, le Java est une usine à gaz (encore que ça s'améliore), mais pour l'écriture du code c'est quand même beaucoup plus rapide je trouve (je garde de mauvais souvenirs d'un projet en C++, sur lequel j'ai passé 1 semaine à écrire mon code et 2 semaines à le débugger ).
Je pense que c'est parce que j'ai commencé par le Java, le C et le C++ présentent bien plus de contraintes pour quelqu'un qui a l'habitude de laisser la VM gérer la mémoire (pas de pointeurs à gérer, présence du Garbage Collector, ...).
C'est marrant, c'est le Java que je trouve contraignant (et le garbage collector, je ne m'y fais pas, même s'il est disponible en C++ via diverses astuces, je n'aime pas).
J'ai fait le parcours Basic / Assembleur / Pascal / C / OCaml / C++ / Java (plus une trentaine d'autres), ça a du me sensibiliser avec le fonctionnement de la machine, et je n'apprécie pas les langages qui sont à mi-chemin entre le très haut niveau et ceux qui collent au fonctionnement du hard.
mais pour l'écriture du code c'est quand même beaucoup plus rapide je trouve
Je pense que c'est très relatif, mais si c'est ce que tu cherches, il y a des langages qui sont encore plus adaptés à un codage efficace. Pour le debugging, ça dépend aussi énormément de ta façon de coder...
23 ans que je chasse des bugs (je me fais vieux ), on finit par avoir l'habitude. Et puis ta fonction n'avait pas d'erreur visible, donc le seul moyen d'afficher deux chaînes était de l'appeler deux fois.
D'autant que j'ai fait du level-up à l'époque où j'enseignais l'info... en TP ou en encadrement de projet, on doit trouver en deux minutes un bug que les étudiants cherchent parfois depuis un ou deux jours, c'est un bon entraînement. Mais j'avoue que je ne suis pas insensible au regard de l'étudiant quand je parviens à localiser un bug presque sans regarder le code... Pêché de fierté que j'espère véniel.
J'ai fait le coup la semaine dernière, il m'a fallu un peu de temps, mais vous allez comprendre pourquoi :
Code :
test=false;
if (test) {
a=0; b=1;
} else {
a=1; b=0;
}
printf("%d %d\n", a, b);
renvoyait
Citation :
0 0
A force, je sens venir les problèmes... du coup, j'ai changé ça en
Code :
test=false;
if (test) {
a=0; b=1;
} else {
b=0; a=1;
}
printf("%d %d^n", a, b);
suspectant un débordement de l'inscription du 0 de b dans a (en fait, a et b sont deux éléments d'un même champ de bit) et... ça a marché...
Oui, c'est un semi-bug du compilateur. Le problème, c'est que le programme était compilé pour PIC, que le compilateur faisait (quasi à raison) un "Bit Reset" sur une broche d'un port pour effectuer b=0, sauf que... la doc du PIC spécifiait (à ma grande surprise d'ailleurs, les PICs, c'est de la m*** (tm) ) que les instructions Bit Reset pouvaient influer sur les autres bits du même bus (ce qui est profondément stupide).
D'autant que j'ai fait du level-up à l'époque où j'enseignais l'info... en TP ou en encadrement de projet, on doit trouver en deux minutes un bug que les étudiants cherchent parfois depuis un ou deux jours, c'est un bon entraînement. Mais j'avoue que je ne suis pas insensible au regard de l'étudiant quand je parviens à localiser un bug presque sans regarder le code... Pêché de fierté que j'espère véniel.
[...]
Oui, c'est un semi-bug du compilateur. Le problème, c'est que le programme était compilé pour PIC, que le compilateur faisait (quasi à raison) un "Bit Reset" sur une broche d'un port pour effectuer b=0, sauf que... la doc du PIC spécifiait (à ma grande surprise d'ailleurs, les PICs, c'est de la m*** (tm) ) que les instructions Bit Reset pouvaient influer sur les autres bits du même bus (ce qui est profondément stupide).
Mortalité, codez en assembleur... surtout sur du PIC Mais dans le cas présent et dans ton exemple, ca se serait vu avec une exécution pas à pas dans un debugger je pense.
Mortalité, codez en assembleur... surtout sur du PIC
Complètement d'accord (et même... ne programmez pas sur du PIC, choisissez de l'Atmel ) Ce n'est pas moi qui les ai poussé à faire du C++ sur PIC, je trouve que c'est une bien drôle d'idée.
Mais dans le cas présent et dans ton exemple, ca se serait vu avec une exécution pas à pas dans un debugger je pense.
Certes, mais vu les outils PIC, je ne suis même pas certain qu'il existe un débugger de PIC. Quant au simulateur, je ne suis pas persuadé qu'il aurait donné le bug, surtout quand les instructions assembleurs indiquent "dans ce cas là, on ne sait pas trop ce que ça va faire".
Mortalité, codez en assembleur... surtout sur du PIC Mais dans le cas présent et dans ton exemple, ca se serait vu avec une exécution pas à pas dans un debugger je pense.
en réalité,je code sous notepad ++
Je ne connais pas de logiciel traitant des les programmes palib...du coup je creer une "build.bat" pour compiler tout ça
Je connais pas PAlib, mais j'ai eu l'occasion de discuter avec des développeurs DS. Ils se débrouillaient pour que le programme compile nativement sous Windows pour pas avoir à passer par une DS pour faire du debug purement algorithmique (dès que ca part dans de l'optimisation t'as pas trop le choix). Mais faut dire aussi qu'ils tapaient directement dans le frame buffer pour faire l'affichage.
---------------
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d.
1f u c4n wr1t3 1t t00.
Je dois gérer plusieurs highscore car mon jeu est composé de minis jeux. Un high score est composé de 3 scores max
Je veux permettre au joueurs de pouvoir réinitialiser n'importe quel minis jeux malheureusement vu que je suis assez faible dans le domaine des "entrées/sorties" en C j'ai bricolé quelque chose d'un peu spécial (qui ne marche)
// On scan le fichier d'abord, puis on rentre les nombres scannés dans les var du tableau score[0] et score[1]
fclose(fichier);
// On ferme le fichier
} // Si l'ouverture n'a pas fonctionné
else {
// On affiche un message d'erreur
PA_OutputSimpleText(1, 0, 10, "Fichier: Ouverture du fichier échouée lors de la récupération des HighScores" );
}
while (sortie==0){
//En fonction de typeclass on affichera les high score des mini jeux
if(typclass==0){
PA_OutputText(1, 0, 8, "%d",typclass);
PA_OutputText(1, 0, 10, "High Score" );
PA_OutputText(1, 0, 12, "%d",score[0]);
PA_OutputText(1, 0, 14, "%d",score[1]);
PA_OutputText(1, 0, 16, "%d",score[2]);
}
elseif (typclass==1){
PA_OutputText(1, 0, 8, "%d",typclass);
PA_OutputText(1, 0, 10, "High Score" );
PA_OutputText(1, 0, 12, "%d",score[3]);
PA_OutputText(1, 0, 14, "%d",score[4]);
PA_OutputText(1, 0, 16, "%d",score[5]);
}
elseif (typclass==2){
PA_OutputText(1, 0, 8, "%d",typclass);
PA_OutputText(1, 0, 10, "High Score" );
PA_OutputText(1, 0, 12, "%d",score[6]);
PA_OutputText(1, 0, 14, "%d",score[7]);
PA_OutputText(1, 0, 16, "%d",score[8]);
}
else{
PA_OutputText(1, 0, 8, "%d",typclass);
PA_OutputText(1, 0, 10, "High Score" );
PA_OutputSimpleText(1, 0, 12, " " );
PA_OutputSimpleText(1, 0, 14, " " );
PA_OutputSimpleText(1, 0, 16, " " );
}
//Navigation de maniere tactile
if (Stylus.Newpress){
x=Stylus.X;
y=Stylus.Y;
}
if ((x>65) && (x<170) && (y>65) && (y<75)){
initHS(typclass,score,9);
}
else
if ( (x>90) && (x<150) && (y>90) && (y<100)){
sortie=1;
}
switch(position){
case 0:
PA_SetTextTileCol(0, TEXT_YELLOW);
PA_OutputSimpleText(0,9,5,"Reinit Score" );
PA_SetTextTileCol(0, TEXT_WHITE);
PA_OutputSimpleText(0,12,12,"Retour" );
if (Pad.Newpress.B){
initHS(typclass,score,7);
}
break;
case 1:
PA_SetTextTileCol(0, TEXT_YELLOW);
PA_OutputSimpleText(0,12,12,"Retour" );
PA_SetTextTileCol(0, TEXT_WHITE);
PA_OutputSimpleText(0,9,5,"Reinit Score" );
if (Pad.Newpress.B){
sortie=1;
PA_ClearTextBg(1);
PA_ClearTextBg(0);
}
break;
}
//Navigation avec le pad
if((Pad.Newpress.Up)){
position=0;
}
if((Pad.Newpress.Down)){
position=1;
}
if ((Pad.Newpress.Right) && typclass<3){
typclass++;
}
if ((Pad.Newpress.Left) && typclass>0){
typclass--;
}
PA_WaitForVBL();
}
}
et voici la fonction ou je réinitialise les scores: Je passe en arguement le type du mini jeu à mettre à jour,le tableau des scores actuel et sa taille..
PA_OutputSimpleText(1, 0, 10, "Fichier : Echec d'ouverture du fichier lors de la sauvegarde du scoreJ1" );
}
}
Ma technique est que en fonction de la valeur de typeclass,je ne met qu'a jour le mini jeu concerné pour le reste je réinscris le tableau des scores qui a été donnée en parametre
Par exemple dans ce cas seul le 3eme jeux est maj,les 2 1ers jeux reprennent les valeurs déjà sauvegardés dans le tableau score
Je trouve que ma technique semble être cohérente or malheureusement quand je fais ça tout mes scores de tout mes minis jeux passent à 0. Je ne comprend pas le problème,peut être parce que fprintf n'accepte qu'un tableau?
fprintf et fscanf prennent bien un nombre d'arguments variable déterminé à partir de la chaîne de format. Par contre à la ligne 13 de initHS, y'a un % en trop (ca m'étonne que ton compilateur t'aies pas mis une bonne paire de baffes sur ce coup).
Sinon en général quand y'a un problème avec fprintf / fscanf c'est des histoires de bufferisation. Essaye de rajouter un '\n' à la fin de tes chaînes de format pour frpintf et fscanf, ca devrait forcer le flush des buffers.
Message édité par Skyfighter le 28-05-2008 à 22:56:16
---------------
1f u c4n r34d th1s u r34lly n33d t0 g37 l41d.
1f u c4n wr1t3 1t t00.
Ah, ca c'est des projets marrants On te fait compiler quoi comme langage?
bah écoute je suis tellement nul que mes 2 collègues sont surement en train de faire le projet sans moi.. j'ai grave les boules
je dois a partir d'un langage inventer le compiler vers le langage C
Je dois programmer un "if" ,'else ' mais je cale severe
Code :
%%
A: line {printf("%s;\n",$1);}
| A line {printf("%s;\n",$2);}
line : expr NEWLINE {$$ = $1;}
expr: expr PLUS expr {$$ = affiche3($1," + ", $3);}
| expr MOINS expr {$$ = affiche3($1," - ", $3);}
| expr MULTIP expr {$$ = affiche3($1," * ", $3);}
| expr DIV expr {$$ = affiche3($1," / ", $3);}
| INT {$$=$1;}
| VAR expr2 {$$=$2;}
| SI expr5 {$$=$2;}
expr2: expr2 ENTIER {$$ = affiche2("int", $1);}
| expr2 REEL {$$ = affiche2("float", $1);}
| expr2 CHAINE {$$ = affiche2("char *", $1);}
| expr2 CARACTERE {$$ = affiche2("char", $1);}
| expr2 BOOL {$$ = affiche2("int", $1);}
| IDENTIFIANT {$$=$1;}
| expr2 DEUXP {$$=$1;}
| expr2 PVIRGULE {$$=$1;}
;
expr5: expr5 ALORS{$$ = affiche2("if",$1)}
| IDENTIFIANT {$$=$1;}
;
%%
Je ne sais pas comment faire un "if" dans le fichier bison en effet si il tape un else je dois avoir en résultat "if a else b" or ici je n'arrive que à faire "if a" comment faire pour dire au programme en cas de else d'alleir voir ailleurs en créant un aute expr6 par exemple?
m'enfin mes 2 "collègues" me prennent pour un gros con,et font le projet sans moi ca se trouve ils ont bien avancé alors que je perd mon temps
Message édité par zell789 le 29-05-2008 à 22:30:50
En fait, c'est tout simple, mais il faut piger le truc... Sans la spécification de ton langage, je vais avoir du mal à te répondre sur le IF, mais je peux peut-être t'éclaircir quelques trucs.
LEX (flex) prends un fichier qui est une suite (file) de caractères. Il explique comment on doit découper le fichier en "mots". Quand tu lis un texte en français, c'est facile : un mot, c'est une suite de lettres entre a et z (ou A et Z) encadrés par deux caractères qui ne sont pas des lettres. Entre les mots, tu as des signes de ponctuation (. , ! ? : ...) qui t'apportent des informations supplémentaires. Du coup, lex te permet de :
- retrouver les mots-clés (SI, ALORS, VAR, POUR, etc)
- retrouver les groupes de caractères qui ont un sens : un entier, un réel, une chaîne de caractères... Par exemple, un mot en français, c'est défini comme [azAZ]+ (série consécutive de lettres entre a et z ou entre A et Z). Bon, un détail, j'écris peut-être mal ce truc, je ne sais jamais comment écrire correctement les regexp de lex sans vérifier...
Après le passage de LEX, tu n'as plus une suite de caractère mais une suite de blocs qu'on appelle généralement "tokens". Par exemple la suite de caractère
Code :
SI (a=1) ALORS a := 2 SINON a := 1 FINSI
devient la suite de tokens
Code :
MOT_CLE_SI
PARENTHESE_OUVRANTE
VARIABLE (a)
OPERATEUR_EGALITE
CONSTANTE (1)
PARENTHESE_FERMANTE
MOT_CLE_ALORS
VARIABLE (a)
OPERATEUR_ATTRIBUTION
CONSTANTE (2)
MOT_CLE_SINON
VARIABLE (a)
OPERATEUR_ATTRIBUTION
CONSTANTE (1)
MOT_CLE_FINSI
Fin de LEX.
Ensuite vient Bison (ou Yacc). Il vise à déterminer dans quel ordre on doit trouver les tokens... (et ensuite ce que l'on doit faire dans chaque situation, on y reviendra ensuite). Je vais prendre un exemple...
Qu'est-ce qu'un programme ? C'est une suite d'instructions
Code :
Programme : Suite_Instructions
Qu'est-ce qu'une suite d'instruction ? C'est une instruction toute seule, ou une suite d'instruction suivie par une instruction... Ca, c'est un peu subtil à comprendre, mais tu ne peux pas dire qu'une suite d'instruction c'est une instruction, ou deux instructions, ou trois instructions, ou quatre instructions... parce que sinon tu ne t'en sors pas. Du coup, c'est la même chose que les récurrences : c'est soit 1 instruction, soit n+1 instructions (et dans le second cas, le n correspond à une suite d'instruction, et on boucle). Donc :
Code :
Suite_Instructions :
Instruction
| Suite_Instructions Instruction
Si tes instructions doivent être séparées par des points virgule, par exemple, tu peux mettre :
Jusque là ça va ? Bon, ben tu as compris l'essentiel... Ensuite, on définit ce qu'est une instruction, et ainsi de suite jusqu'au niveau le plus bas... On va faire le cas instruction :
Code :
Instruction :
Affectation
| Appel_de_fonction
| MOT_CLE_SI Booleen MOT_CLE ALORS Suite_Instructions MOT_CLE_FINSI
| MOT_CLE_SI Booleen MOT_CLE ALORS Suite_Instructions MOT_CLE_SINON Suite_Instructions MOT_CLE_FINSI
Puis après, on explique ce que c'est qu'une affectation :
Code :
Affectation :
VARIABLE OPERATEUR_AFFECTATION CONSTANTE
| VARIABLE OPERATEUR_AFFECTATION VARIABLE
Et là, super, il n'y a plus que des tokens, on a fini pour ce bout là ! Tu peux lui dire quoi faire dans cette situation-là : écrire le bout de code c qui range la constante dans la variable...
Bon, j'ai un peu triché, car en théorie, ça devrait être :
Je crois que ton problème, c'est que tu as perdu le fil, et que tu te focalises sur un détail (le if) qui doit venir en dernier (sauf à avoir BEAUCOUP d'habitude). Si je lis ton code :
- un programme doit être A (?)
- A est une suite de lignes
- une ligne est une 'expr' suivie par un retour chariot.
Et là, déjà, je pense que ça coince. Je ne connais pas ton langage, mais je ne pense pas qu'une ligne
Code :
1+1
ait un sens dans ton langage. Tu devrais avoir au moins, par exemple :
Code :
a=1+1
Tu mélanges les "instructions" (comme SI ... ALORS ... SINON ... FINSI ou bien VAR ... ou bien encore VARIABLE OPERATEUR_AFFECTATION Expression) et les expressions mathématiques comme (... PLUS ..., ... MOINS ..., etc.)
Déjà, il y a un GROS défaut dans ce que tu nous montre, tu ne devrais jamais avoir des trucs du genre expr3, expr5, mais uniquement des noms clairs, sinon c'est que tu ne vois pas bien où tu vas...
Après, ça va tout seul, si je reprends ce que je disais plus haut :
Code :
Instruction :
Affectation
| Appel_de_fonction
| MOT_CLE_SI Booleen MOT_CLE ALORS Suite_Instructions MOT_CLE_FINSI
| MOT_CLE_SI Booleen MOT_CLE ALORS Suite_Instructions MOT_CLE_SINON Suite_Instructions MOT_CLE_FINSI
Prends le deuxième cas : que faut-il faire ?
- afficher "if"
- laisser Yacc/Bison traiter l'expression booléenne (et écrire tout ce qu'il faut)
- afficher "{" (pour le then)
- laisser Yacc/Bison traiter la suite d'instructions (et écrire tout ce qu'il faut)
- afficher "}"
Donc un truc (modulo tes fonctions affiche dont je ne sais pas bien ce qu'elles font, c'est un poil bizarre) :
Code :
$$ = affiche5( "if" , $2 , "{" , $4 , "}" )
Dans le cas d'un SINON (troisième cas dans mon exemple) :
Si quelque chose n'est pas clair, n'hésite pas... Mais une fois que tu as pigé le truc, ce genre de code s'écrit en une ou deux heures... et quasiment sans réfléchir avec un minimum d'habitude.
(1) Bon, là, j'ai pris une liberté, car ça ne devrait pas être Expression OPERATEUR_PLUS Expression, mais Expression OPERATEUR_PLUS Terme, car sinon 1 + 2 + 3 peut être décomposé de deux façons différentes, et il est bon d'éviter les ambiguités. Mais c'est une sutilité qui n'a pas beaucoup d'importance dans ton projet. Maintenant, il y a des informaticiens qui vont me lire, alors je veux éviter les erreurs...
J'ai lu plus attentivement ton explication Koren,cela parait si simple
La manière que tu m'expliques est très différente de celle de 2 collgèues. En effet,leur but est de faire 1 par 1 des instructions simples comme : var i entier ==> int i 2 + 3 ===> 2+3
Toi,tu pars d'un cas global pour traiter petit à petit tout les cas
1) Ayant des lacunes pour rédiger en bison comment faire pour définir par exemple dans la suite d'instruction
Code :
# | MOT_CLE_SI Booleen MOT_CLE ALORS Suite_Instructions MOT_CLE_SINON Suite_Instructions MOT_CLE_FINSI
il faudrait faire quelques chose du type
Code :
if : SI BOOL ALORS if SINON
Suis je obligé de trjs mettre if pour symboliser la suite d'une instruction : comme tu le vois : je met "expr" pour signifier les arugements
Code :
expr : SI expr ALORS expr SINON expr FIN
or les expres signifient des instructions différentes comment pourrais-je traiter les différents cas alors que leurs appellations sont les mêmes?
2) Je n'arrive pas à saisir l'utilité du $$ par exemple dans cette partie
Code :
| SI expr5 {$$=$2;}
Cela signifie t-il que $$ envoit à une sous fonction (si on peut appeller cela ainsi) l'argument 2?
3)Comment appeller de détailler une suite d'instruction
Code :
expr5: expr5 ALORS expr5 SINON expr5 {$$=affiche5("if",$1,$3,"else",$5);};
mon expression ne marche pas par exemple si je met dans $1 a==b je ne peux mettre qu'une lettre or c'est tres loin de la fonction d'un if
Il faut donc dans cette expression qu'on rentre plus profondément pour détailler tout les données de (séparé le "a","=","=","b" ) or je ne vois pas comment faire la redirection même si tes exemples me mettent un peu sur la voie...ainsi je dois détailler chaque suite d'instruction.
Mes collègue me prenant pour un boulet m'apportent peu d'explication sauf m'insulter de faineant alors que je pourrai me cacher et bosser mes autres partiels. Vu qu'ils travaillent que tout les 2 (je ne reçois même plus les dernières modifs qu'ils ont fait enfin d'après eux ils ont rien modifié) je me retrouve avec comme seul explication "synthax error" alors que mon code est bon mais j'avais oublié un retour chariot dans le fichier de test par exemple .. ou qu'il fallait utiliser "# | IDENTIFIANT {$$=$1;}" sinon mes expression n'étaient pas qualifié comme terminal. De plus il y a très peu de tuto en français sur bison alors j'ai du énormément de mal à débugger et ainsi progresser.
Je joue mon pleurnicheur je l'admet,mais j'ai l'impression que cette situation m'échappe totalement alors que je pensais qu'en m'y penchant dessus sérieusement j'arriverai à faire quelques chose de productif,je n'arrive pour l'instant pas à cerner les reflexes pour flex/bison et il faut le rendre samedi à 00:00 et vu que c'est parti..je doute qu'en 2,3 heures je vais y arriver
1) Ayant des lacunes pour rédiger en bison comment faire pour définir par exemple dans la suite d'instruction
Code :
# | MOT_CLE_SI Booleen MOT_CLE ALORS Suite_Instructions MOT_CLE_SINON Suite_Instructions MOT_CLE_FINSI
En fait, vu ton programme d'exemple, j'ai l'impression que : - "si .... alors" être sur une ligne - "sinon" et "finsi" également
Donc pour traduire ça en C - "si .... alors" doit être transformé en "if (...) {" - "sinon" en "} else {" - "finsi" en "}"
Tout dépend si tu veux une vérification de la syntaxe de ton programme, ou simplement une transformation en supposant qu'il est correct. Tu remarqueras au passage qu'il manque le token pour fin_si. Cela dit, si ça s'arrêtait là, ça irait, mais il y a quantité de trucs qui ne fonctionnent pas sur le bout de code que tu donnes (tu peux l'effacer, si tu préfères... J'en ai gardé une copie si tu as une question précise dessus).
ca va commencer à faire n'importe quoi, et si tu allonges la ligne, ça va faire segfault (les "affiche" utilisent un buffer de 64 octets qui va vite être trop plein).
2) Je n'arrive pas à saisir l'utilité du $$ par exemple dans cette partie
Code :
| SI expr5 {$$=$2;}
Cela signifie t-il que $$ envoit à une sous fonction (si on peut appeller cela ainsi) l'argument 2?
Je ne me suis pas étendu là-dessus... Le $$, c'est ce qui doit rester quand on tient compte de la règle. Dans ce cas précis, si tu tombes sur "SI qqchose" : - le bout de code créé par Bison va décoder "qqchose" et en faire une chaine de caractère qu'il va stocker dans $2 - il te demande ce qu'il doit en faire : là, tu lui dit "remplace [SI qqchose] par le résultat de la règle sur qqchose
En gros, ça se lit "tu remplaces la suite de gauche par $2."
(techniquement, c'est sur Yacc, mais Bison est juste un portage GNU de Yacc - d'où le jeu de mot à la noix - et c'est pareil. D'ailleurs, l'auteur utilise flex/bison à la place de lex/yacc)
Effectivement, le travail en groupe, ça peut vite tourner au cauchemar s'il y a des problèmes dans le groupe
Pour l'instant,je pense qu''ils penchent vers une solution transformation brute comme
Citation :
Simplement une transformation en supposant qu'il est correct.
Car en effet je pense que en simple traducteur cela passe bien mais il est très facile de le faire planter
Citation :
$1 contient une chaîne de caractères (char*) et non un seul caractère... Je ne suis pas certain de bien te suivre...
Si $1 contient ma chaine de caractère alors le "a==b" devrait donc pouvoir être traduit,or dans la partie de mon programme j'ai une synthax error si je tape plus de une lettre
Merci pour le tutorail,je n'aurai pas pensé à chercher lex/yacc
Citation :
Effectivement, le travail en groupe, ça peut vite tourner au cauchemar s'il y a des problèmes dans le groupe
D'un autre côté,ils sont méga en retard (on doit le rendre ce soir même si pr toi en 2,3 h c'est fait ) donc il est "normal" qu'il me laisse de coté,par contre ceux que je n'apprécie pas,c'est me prendre des insultes "quoi t'as que fait ça en 15 minutes t'abuses" alors que je suis sur la touche et que je ne comprend pas grand chose
D'un autre côté,ils sont méga en retard (on doit le rendre ce soir même si pr toi en 2,3 h c'est fait )
En fait, la pause que j'ai faite ce midi a suffi, donc nettement moins que ça
Je t'envoie par MP des fichiers lex/yacc commentés qui ne sont pas la norme complète que vous avez à implémenter, mais qui en couvre une partie suffisante pour que le programme que tu donnais tout à l'heure soit traduit en C sans problème (il me semble). Je n'ai pas fait de tests extensifs, et il y a des ambiguïtés dans ma grammaire (il m'annonce une douzaine d'ambiguités je crois), mais il faut dire que j'ai du mal à comprendre où doivent se placer les points-virgule et les retour chariots dans le langage source...
Ce n'est bien évidemment pas une façon de faire le projet à votre place... Il y a plein de trous, c'est pour que tu puisses réfléchir sur une base à peu près propre... J'espère surtout que ça t'aidera à y voir un peu plus clair (après tout, le projet est surtout là pour vous compreniez comment ça fonctionne...). Essaie de voir comment rajouter ce qui manque, ça devrait t'éclairer sur la façon dont Flex/Bison se débrouille (tu verras, ça n'est pas si difficile). Et vois si ça peut t'aider à comprendre suffisamment comment ça marche pour que tu puisses te rendre utile aux deux autres.
En fait, la pause que j'ai faite ce midi a suffi, donc nettement moins que ça
Je t'envoie par MP des fichiers lex/yacc commentés qui ne sont pas la norme complète que vous avez à implémenter, mais qui en couvre une partie suffisante pour que le programme que tu donnais tout à l'heure soit traduit en C sans problème (il me semble). Je n'ai pas fait de tests extensifs, et il y a des ambiguïtés dans ma grammaire (il m'annonce une douzaine d'ambiguités je crois), mais il faut dire que j'ai du mal à comprendre où doivent se placer les points-virgule et les retour chariots dans le langage source...
Ce n'est bien évidemment pas une façon de faire le projet à votre place... Il y a plein de trous, c'est pour que tu puisses réfléchir sur une base à peu près propre... J'espère surtout que ça t'aidera à y voir un peu plus clair (après tout, le projet est surtout là pour vous compreniez comment ça fonctionne...). Essaie de voir comment rajouter ce qui manque, ça devrait t'éclairer sur la façon dont Flex/Bison se débrouille (tu verras, ça n'est pas si difficile). Et vois si ça peut t'aider à comprendre suffisamment comment ça marche pour que tu puisses te rendre utile aux deux autres.
Un grand merci à toi Koren
Mes collègues se sont même demandé ou est ce que je trouvais des personnes aussi sympa
En tout cas j'en resors un peu plus grandi après ce projet même si je doute y retoucher si mon orientation réussi..
Citation :
Le travail de groupe, hors entreprise, si on ne choisit pas les meilleurs élèves de la classe, c'est la galère :
Ce sont des "amis" enfin après cela je suis un peu plus distant avec eux (enfin je décide aussi de changer d'école même si je suis qu' 20 % d'être pris)
Je suis loin d'être 'clean' dans cette affaire,pire je me sentais vraiment un boulet..Je n'ai juste pas apprécier de me bouffer des insultes alors que je tentais ce que je pouvais..