J'écris un assembleur pour un micro-contrôleur personnalisé sur lequel je travaille. J'ai l'assembleur à un point où il va assembler les instructions jusqu'à binaire.Utilisation de yyparse() pour créer un assembleur à deux passes?
Cependant, j'ai maintenant des problèmes avec le fonctionnement des étiquettes. Actuellement, lorsque mon assembleur rencontre une nouvelle étiquette, il stocke le nom de l'étiquette et l'emplacement de mémoire auquel il se réfère. Lorsqu'une instruction référence une étiquette, l'assembleur recherche l'étiquette et remplace l'étiquette par la valeur appropriée.
Ceci est bien et dandy, mais que se passe-t-il si l'étiquette est définie après l'instruction référençant? Pour cette raison, j'ai besoin que mon parser exécute deux fois le code.
Voici ce que j'ai actuellement ma fonction principale:
303 int main(int argc, char* argv[])
304 {
305
306 if(argc < 1 || strcmp(argv[1],"-h")==0 || 0==strcmp(argv[1],"--help"))
307 {
308 //printf("%s\n", usage);
309 return 1;
310 }
311 // redirect stdin to the file pointer
312 int stdin = dup(0);
313 close(0);
314
315 // pass 1 on the file
316 int fp = open(argv[1], O_RDONLY, "r");
317 dup2(fp, 0);
318
319 yyparse();
320
321 lseek(fp, SEEK_SET, 0);
322
323 // pass 2 on the file
324 if(secondPassNeeded)
325 {
326 fp = open(argv[1], O_RDONLY, "r");
327 dup2(fp, 0);
328 yyparse();
329 }
330 close(fp);
331
332 // restore stdin
333 dup2(0, stdin);
334
335 for(int i = 0; i < labels.size(); i++)
336 {
337 printf("Label: %s, Loc: %d\n", labels[i].name.c_str(), labels[i].memoryLoc);
338 }
339 return 0;
340 }
J'utilise cette configuration dans un flex/bison.
Demandez-vous si vous avez besoin de deux passages, ou si votre code est correct? – grieve