Je voulais juste savoir comment on faisait un compilateur de haut niveau?
Autre question: comment on fait un assemembleur... (ca rien a voir avec un compilo de haut niveau, mais je voudrai savoir comment on fait



TokensBin NextToken(char* Buffer, char SymGen)
{
char *DebutP;
register char Oper2;
register int i;
char CarSpecial;
register Symbole *SymP;
long *PtrT;
NbTokensTotal++;
*Buffer= 0;
while (EstBlanc(*Curseur)) Curseur++;
AncienCurseur= DebutP= Curseur;
if (!*Curseur)
{
if (fichier == 0)
{
if (niveau != 0)
{
Erreur("fin de fichier dans une fonction")
FermerCompilo();
}
NbTokensTotal--;
return FIN;
}
HeapUnlock(ListeFichs[fichier--].handle);
Curseur= ListeFichs[fichier].curseur;
return NextToken(Buffer, SymGen);
}
if (EstSigne(*Curseur))
{
Oper2= Curseur[1];
switch (*Curseur++)
{
case '?' : return INTERROGATION;
case '[' : return CROCHETO;
case ']' : return CROCHETF;
case '(' : return PARENTO;
case ')' : return PARENTF;
case '{' : return ACCOLADEO;
case '}' : return ACCOLADEF;
case '@' : return AROBAS;
case ',' : return VIRGULE;
case ';' : return PNTVIRGULE;
case '.' : if (Oper2 != '.')
return POINT;
else
{
if (*(++Curseur) == '.')
{
Curseur++;
return SUSPENSION;
}
else
{
Curseur--;
return POINT;
}
}
case '$' : {
register char *ALNSO= ALNS;
i= 0;
while (EstAlphaNumOPTIM(*Curseur))
{
*Buffer++= *Curseur++;
if (i++ == 31)
{
while (EstAlphaNumOPTIM(*Curseur)) Curseur++;
break;
}
}
*Buffer= 0;
Buffer-= i;
if (SymGen)
{
SymP= SymOffsetToPtr(NewSymbole());
PtrT= (long *)SymP->tailles;
*PtrT++= 0; *PtrT++= 0; *PtrT++= 0; *PtrT= 0;
sprintf(SymP->adresse, "#%lu", Base16toDeci(Buffer));
strcpy2(Buffer, LabelUnique(SymP->identif));
SymP->OffsetAdr= SymAdrOff1;
SymP->point= 0;
SymP->adressage= IMMEDIAT;
SymP->signe= FALSE;
SymP->readonly= TRUE;
SymP->adrmodif= TRUE;
SymP->PseudoPtr= FALSE;
SymP->unite= 0;
SymP->hierarchie= niveau;
SymP->UniteSiPtr= 0;
return IDENTIF;
} else
{
sprintf(Buffer, "%lu", Base16toDeci(Buffer));
return NOMBRE;
}
}
case '%' : {
register char *ALNSO= ALNS;
i= 0;
while (EstAlphaNumOPTIM(*Curseur))
{
*Buffer++= *Curseur++;
if (i++ == 31)
{
while (EstAlphaNumOPTIM(*Curseur)) Curseur++;
break;
}
}
*Buffer= 0;
Buffer-= i;
if (SymGen)
{
SymP= SymOffsetToPtr(NewSymbole());
PtrT= (long *)SymP->tailles;
*PtrT++= 0; *PtrT++= 0; *PtrT++= 0; *PtrT= 0;
sprintf(SymP->adresse, "#%lu", Base02toDeci(Buffer));
strcpy2(Buffer, LabelUnique(SymP->identif));
SymP->OffsetAdr= SymAdrOff1;
SymP->point= 0;
SymP->adressage= IMMEDIAT;
SymP->signe= FALSE;
SymP->readonly= TRUE;
SymP->adrmodif= TRUE;
SymP->PseudoPtr= FALSE;
SymP->unite= 0;
SymP->hierarchie= niveau;
SymP->UniteSiPtr= 0;
return IDENTIF;
} else
{
sprintf(Buffer, "%lu", Base02toDeci(Buffer));
return NOMBRE;
}
}
case '~' : DebutP= Curseur;
if (SymGen)
{
char Adresse[33];
if (NextToken(&Adresse[2], FALSE) == NOMBRE)
{
SymP= SymOffsetToPtr(NewSymbole());
PtrT= (long *)SymP->tailles;
*PtrT++= 0; *PtrT++= 0; *PtrT++= 0; *PtrT= 0;
strcpy2(Buffer, LabelUnique(SymP->identif));
SymP->OffsetAdr= SymAdrOff1;
SymP->point= 0;
SymP->adressage= IMMEDIAT;
SymP->readonly= TRUE;
SymP->adrmodif= TRUE;
SymP->PseudoPtr= FALSE;
SymP->unite= 0;
SymP->hierarchie= niveau;
SymP->UniteSiPtr= 0;
if (Adresse[2] == '-')
{
Adresse[2]= '#';
strcpy2(SymP->adresse, &Adresse[2]);
SymP->signe= FALSE;
} else
{
Adresse[0]= '#';
Adresse[1]= '-';
strcpy2(SymP->adresse, Adresse);
SymP->signe= TRUE;
}
return IDENTIF;
} else
{
Curseur= DebutP;
return NEGATION;
}
} else
{
char Adresse[33];
if (NextToken(&Adresse[1], FALSE) == NOMBRE)
{
Adresse[0]= '-';
if (Adresse[1] != '-') strcpy2(Buffer, Adresse);
else strcpy2(Buffer, &Adresse[2]);
return NOMBRE;
} else
{
Curseur= DebutP;
return NEGATION;
}
}
case ''': if (Oper2 != ''' && *(Curseur+1) != ''')
{
Erreur("trop grand pour une constante caractère")
while (*Curseur != ''' && *Curseur) Curseur++;
if (*Curseur) Curseur++;
return ERREUR;
}
SymP= SymOffsetToPtr(NewSymbole());
if (Oper2 == ''' && *(Curseur+1) != ''')
{
SymP->adresse[0]= '#';
SymP->adresse[1]= '0';
SymP->adresse[2]= 0;
Curseur++;
} else
{
sprintf(SymP->adresse, "#%u", (unsigned int)Oper2);
Curseur+= 2;
}
if (SymGen)
{
PtrT= (long *)SymP->tailles;
*PtrT++= 0; *PtrT++= 0; *PtrT++= 0; *PtrT= 0;
strcpy2(Buffer, LabelUnique(SymP->identif));
SymP->OffsetAdr= SymAdrOff1;
SymP->point= 0;
SymP->adressage= IMMEDIAT;
SymP->signe= FALSE;
SymP->readonly= TRUE;
SymP->adrmodif= TRUE;
SymP->PseudoPtr= FALSE;
SymP->unite= 0;
SymP->hierarchie= niveau;
SymP->UniteSiPtr= 0;
return IDENTIF;
} else
{
strcpy2(Buffer, SymP->adresse + 1);
NbSymboles--;
return NOMBRE;
}
case '"': Oper2= *(Curseur-1);
while ((*Curseur!='"' || Oper2=='\') && *Curseur)
Oper2= *Curseur++;
if (!*Curseur)
{
Erreur("chaîne sans fin")
return ERREUR;
}
Curseur++;
if (SymGen)
{
if (IndexGlobal % 2)
{
IndexGlobal++;
if (CommenterCodeASM) fprintf(Vars, " dc.b 0 ;evenn")
else fprintf(Vars, " dc.b 0n")
}
fprintf(Vars, " dc.b ")
i= -1;
while (DebutP != Curseur)
{
if ((Oper2= *DebutP++) != 13 && Oper2 != '\') fputc(Oper2, Vars);
else
{
if (Oper2 == 13)
{
CarSpecial= 'n';
DebutP++;
} else
switch (*DebutP++)
{
case '0' : ;
case '1' : ;
case '2' : ;
case '3' : ;
case '4' : ;
case '5' : ;
case '6' : ;
case '7' : ;
case '8' : ;
case '9' : CarSpecial= *(DebutP-1) - '0';
if (EstNumerique(*DebutP))
{
CarSpecial*= 10;
CarSpecial+= (*DebutP++) - '0';
if (EstNumerique(*DebutP))
{
CarSpecial*= 10;
CarSpecial+= (*DebutP++) - '0';
}
}
break;
case '\': CarSpecial= '\'; break;
case 'n' : CarSpecial= 'n'; break;
case '"': CarSpecial= '"'; break;
case ''': CarSpecial= '''; break;
default : Erreur("séquence d'échappement inconnue")
return ERREUR;
} // fin switch (Oper2)
fprintf(Vars, "",%u,"", CarSpecial & 0xFF);
} // fin else de if ((Oper2= *DebutP++) != 13 && Oper2 != '\')
i++;
} // fin while (DebutP != Curseur)
fprintf(Vars, ",0n")
SymP= SymOffsetToPtr(NewSymbole());
sprintf(SymP->adresse, "%u(a5)", IndexGlobal);
PtrT= (long *)SymP->tailles;
*PtrT++= 0; *PtrT++= 0; *PtrT++= 0; *PtrT= 0;
strcpy2(Buffer, LabelUnique(SymP->identif));
SymP->OffsetAdr= SymAdrOff1;
SymP->tailles[0]= i;
SymP->point= 0;
SymP->adressage= DEPLACE;
SymP->signe= FALSE;
SymP->readonly= TRUE;
SymP->adrmodif= TRUE;
SymP->PseudoPtr= TRUE;
SymP->TabOuFonc= 0;
SymP->unite= 1;
SymP->hierarchie= niveau;
SymP->UniteSiPtr= 1;
IndexGlobal+= i;
return IDENTIF;
} else // faux if (SymGen)
{
i= 0;
DebutP++;
while (DebutP != Curseur)
{
*(Buffer++)= *DebutP++;
if (i++ == 32) break;
}
*(--Buffer)= 0;
return CHAINE;
}
case ':' : NbTokensTotal--;
if (Oper2 == ':')
{
Curseur++;
while (*Curseur++ != ':' || *Curseur != ':');
Curseur++;
return NextToken(Buffer, SymGen);
} else
{
SynchroRC();
return NextToken(Buffer, SymGen);
}
break;
case '#' : if (!NextToken(Buffer, FALSE))
{
SynchroRC();
return NextToken(Buffer, SymGen);
}
switch (Buffer[0])
{
case 'i' : if (!strcmp2(Buffer, "include"))
{
if (fichier == 31)
{
Erreur("limite de 32 imbrications de fichiers atteinte")
FermerCompilo();
}
if (!NextToken(Buffer, FALSE))
{
SynchroRC();
return NextToken(Buffer, SymGen);
}
ListeFichs[fichier].curseur= Curseur;
fichier++;
Buffer[17]= 0;
if (!strchr2(Buffer, '\'))
{
sprintf(ListeFichs[fichier].nom, "%s%s", RepSrc, Buffer);
if (!CompleterSource(&ListeFichs[fichier]))
{
sprintf(ListeFichs[fichier].nom, "azur\%s", Buffer);
if (!CompleterSource(&ListeFichs[fichier]))
{
fichier--;
Erreur("le fichier indiqué n'existe pas")
return NextToken(Buffer, SymGen);
}
}
HeapLock(ListeFichs[fichier].handle);
Curseur= ListeFichs[fichier].curseur;
return NextToken(Buffer, SymGen);
}
strcpy2(ListeFichs[fichier].nom, Buffer);
if (!CompleterSource(&ListeFichs[fichier]))
{
fichier--;
Erreur("le fichier indiqué n'existe pas")
return NextToken(Buffer, SymGen);
}
HeapLock(ListeFichs[fichier].handle);
Curseur= ListeFichs[fichier].curseur;
return NextToken(Buffer, SymGen);
}
break;
case 'r' : if (!strcmp2(Buffer, "redecon"))
{
TesterRedeclarations= TRUE;
return NextToken(Buffer, SymGen);
} else
if (!strcmp2(Buffer, "redecoff"))
{
TesterRedeclarations= FALSE;
return NextToken(Buffer, SymGen);
}
break;
case 'c' : if (!strcmp2(Buffer, "common"))
{
CommenterCodeASM= TRUE;
return NextToken(Buffer, SymGen);
} else
if (!strcmp2(Buffer, "commoff"))
{
CommenterCodeASM= FALSE;
return NextToken(Buffer, SymGen);
}
break;
case 'f' : if (!strcmp2(Buffer, "falselabels"))
{
ImposerLabels= TRUE;
return NextToken(Buffer, SymGen);
}
break;
case 't' : if (!strcmp2(Buffer, "truelabels"))
{
ImposerLabels= FALSE;
return NextToken(Buffer, SymGen);
}
break;
}
Erreur("directive de compilation inconnue")
SynchroRC();
return NextToken(Buffer, SymGen);
case '!' : if (Oper2 == '=') {Curseur++; return DIFFERENT;}
else if (Oper2 == '!') {Curseur++; return EXCLAM2;}
else {return EXCLAM;}
case '*' : if (Oper2 != '=') {return MULTIPL;}
else {Curseur++; return MULTEGAL;}
case '/' : if (Oper2 != '=') {return DIVISE;}
else {Curseur++; return DIVISEGAL;}
case '\': if (Oper2 != '=') {return MODULO;}
else {Curseur++; return MODULOEGAL;}
case '+' : if (Oper2 == '+') {Curseur++; return PLUSPLUS;}
else if (Oper2 != '=') {return PLUS;}
else {Curseur++; return PLUSEGAL;}
case '-' : if (Oper2 == '-') {Curseur++; return MOINSMOINS;}
else if (Oper2 != '=') {return MOINS;}
else {Curseur++; return MOINSEGAL;}
case '=' : if (Oper2 != '=') {return EGAL;}
else {Curseur++; return EGALC;}
case '&' : if (Oper2 == '&') {Curseur++; return ANDC;}
else if (Oper2 == '=') {Curseur++; return ANDEGAL;}
else {return AND;}
case '^' : if (Oper2 == '=') {Curseur++; return XOREGAL;}
else {return XOR;}
case '|' : if (Oper2 == '|') {Curseur++; return ORC;}
else if (Oper2 == '=') {Curseur++; return OREGAL;}
else {return OR;}
case '<' : if (Oper2 == '<')
{
if (*(++Curseur) != '=')
{return DECALG;}
else
{Curseur++; return DECALGEGAL;}
}
else if (Oper2 == '=') {Curseur++; return INFEREG;}
else if (Oper2 != '>') {return INFERIEUR;}
else {Curseur++; return PERMUTATION;}
case '>' : if (Oper2 == '>')
{
if (*(++Curseur) != '=')
{return DECALD;}
else
{Curseur++; return DECALDEGAL;}
}
else if (Oper2 == '=') {Curseur++; return SUPEREG;}
else {return SUPERIEUR;}
default : Erreur("opérateur inexistant en Azur")
return ERREUR;
} // fin switch (*Curseur++)
} // faux if EstSigne(*Curseur)
else if (EstAlphabetique(*Curseur)) // Identificateurs & mots réservés
{
register char *ALNSO= ALNS;
i= 0;
while (EstAlphaNumOPTIM(*Curseur))
{
*Buffer++= *Curseur++;
if (i++ == 30)
{
while (EstAlphaNumOPTIM(*Curseur)) Curseur++;
break;
}
}
*Buffer= 0;
Buffer-= i;
switch (*Buffer++)
{
case 'b' : if (!strcmp2(Buffer, "yte")) return BYTE;
else if (!strcmp2(Buffer, "reak")) return BREAK;
return IDENTIF;
case 'c' : if (!strcmp2(Buffer, "ontinue")) return CONTINUE;
return IDENTIF;
case 'd' : if (!strcmp2(Buffer, "o")) return DO;
return IDENTIF;
case 'e' : if (!strcmp2(Buffer, "lse")) return ELSE;
else if (!strcmp2(Buffer, "xtern")) return EXTERN;
return IDENTIF;
case 'f' : if (!strcmp2(Buffer, "or")) return FOR;
return IDENTIF;
case 'g' : if (!strcmp2(Buffer, "oto")) return GOTO;
return IDENTIF;
case 'i' : if (!strcmp2(Buffer, "f")) return IF;
return IDENTIF;
case 'l' : if (!strcmp2(Buffer, "ong")) return LONG;
return IDENTIF;
case 'r' : if (!strcmp2(Buffer, "eturn")) return RETURN;
return IDENTIF;
case 's' : if (!strcmp2(Buffer, "tep")) return STEP;
return IDENTIF;
case 't' : if (!strcmp2(Buffer, "hen")) return THEN;
else if (!strcmp2(Buffer, "o")) return TO;
return IDENTIF;
case 'v' : if (!strcmp2(Buffer, "oid")) return VOID;
return IDENTIF;
case 'w' : if (!strcmp2(Buffer, "ord")) return WORD;
else if (!strcmp2(Buffer, "hile")) return WHILE;
return IDENTIF;
} // fin switch (*Buffer++)
return IDENTIF;
} // faux if (EstAlphabetique(*Curseur))
else if (EstNumerique(*Curseur))
{
SymP= SymOffsetToPtr(NewSymbole());
DebutP= SymP->adresse;
*DebutP++= '#';
i= 0;
while (EstNumerique(*Curseur))
{
*DebutP++= *Curseur++;
if (i++ == 9)
{
while (EstAlphaNum(*Curseur)) Curseur++;
break;
}
}
*DebutP= 0;
if (EstAlphabetique(*Curseur))
{
Erreur("format numérique incorrect")
while (EstAlphaNum(*Curseur)) Curseur++;
return ERREUR;
}
if (SymGen)
{
PtrT= (long *)SymP->tailles;
*PtrT++= 0; *PtrT++= 0; *PtrT++= 0; *PtrT= 0;
strcpy2(Buffer, LabelUnique(SymP->identif));
SymP->OffsetAdr= SymAdrOff1;
SymP->point= 0;
SymP->adressage= IMMEDIAT;
SymP->signe= FALSE;
SymP->readonly= TRUE;
SymP->adrmodif= TRUE;
SymP->PseudoPtr= FALSE;
SymP->unite= 0;
SymP->hierarchie= niveau;
SymP->UniteSiPtr= 0;
return IDENTIF;
} else
{
strcpy2(Buffer, &SymP->adresse[1]);
NbSymboles--;
return NOMBRE;
}
}
else
{
Curseur++;
Erreur("caractère inconnu du compilateur")
return ERREUR;
}
}