All pastes #995779 Raw Edit

Unnamed

public text v1 · immutable
#995779 ·published 2008-04-24 14:09 UTC
rendered paste body
    char param2[15];};

// Définition d'un tableau dynamique qui contiendra les lignes.
ligne_inst *code;
code = (ligne_inst *) calloc (1, sizeof(ligne_inst));

// On parcours le code et on le range dans le tableau.
int i=0; // pointeur vers le caractère du buffer d'instructions.
int no_ligne=0; // numéro de la ligne lue.
int position=0; // Position dans la ligne
int nb_lignes = 1; // nombre de lignes d'instruction.
int j=0; // Un pointeur qui servira à se déplacer dans les tableaux etiquette, instruction, param1 et param2.
#define car buffer_inst[i] // Simplification de l'écriture

while (i<size_inst-1)
    {

    if (commentaire(car)) // Du commentaire. On avance jusqu'à la ligne suivante.
        while (!retchar(car))
        i++;
    i++;

    if (minuscule(car)) // On a affaire à une étiquette. On la note dans le tableau prévu à cet effet.
        {               // On parcourt ensuite toute la ligne d'instruction.
            j=0;
            while (caractere(car))
                {
                    cout<<car;
                    if (j==50) // On évite de dépasser le tableau si un fou a utilisé plus de 50 caractères sur une étiquette.
                    j=49;      // L'étiquette est alors différenciée par ses 49 premiers caractères + par le dernier.
                    code[no_ligne].etiquette[j]=car;
                    i++;
                    j++;
                }
            // On est à la fin de l'étiquette. On attend maintenant l'instruction.
                while (espace(car))
                    i++;

            // On attend une majuscule pour le début d'une instruction. S'il n'y a pas de majuscule, on crie.
            if (!majuscule(car))
                    {
                        cout<<"Instruction manquante a la ligne "<<no_ligne;
                        return 1;
                    }
            else   // On a une majuscule. Copie de l'instruction dans le tableau prévu à cet effet.
                    {
                        j=0;
                        while (majuscule(car)) // Une instruction ne contient que des majuscules. Sinon y'a problème.
                            {
                                if (j==6) // Si une instruction dépasse 6 caractères, ce n'est pas une instruction.
                                    {
                                        cout<<"Instruction non valide a la ligne "<<no_ligne;
                                        return 1;
                                    }
                                code[no_ligne].instruction[j]=car;
                                i++;
                                j++;
                            }
                        // On n'a plus de majuscules. Est-ce une erreur dans le nom de l'instruction, ou la fin de celle-ci?
                        if (!espace(car))
                            {
                                cout<<"Erreur dans le nom de l'instruction a la ligne "<<no_ligne;
                                return 1;
                            }
                    }
                    i++;
                // On est à la fin de l'instruction. On attend de lire 0, 1 ou deux paramètres.
            while (espace(car))
                    i++;

            if (commentaire(car)) //du commentaire tout de suite. Donc pas de paramètres.
                {
                    code[no_ligne].param1[1]=0; // Le premier caractère d'un paramètre non utilisé est mis à 0.
                    code[no_ligne].param1[2]=0; // Cela servira plus tard lors de la traduction.
                }
            else  //la syntaxe des paramètres sera testée à la traduction, car potentiellement complexe et variable selon l'instruction.
                {
                    while (caractere(car))
                        {
                            if (j==15) // Si un paramètre dépasse 15 caractères, ce n'est pas un paramètre.
                                {
                                    cout<<"Premier parametre non valide a la ligne "<<no_ligne;
                                    return 1;
                                }
                                code[no_ligne].param1[j]=car;
                                i++;
                                j++;
                        }
                    // Fin du premier paramètre. Soit il y a une virgule et un deuxième paramètre, soit du commentaire, soit une erreur.
            while (espace(car))
                    i++;