Bonsoir,

Je me lance dans la réalisation d'un shell de commandes qui servira a effectuer des calculs mathématiques.

Exemple de fonctionnement :

Invite de commandes mathematiques.

> A = 1 saisie utilisateur
> B = 2 saisie utilisateur
> A + B saisie utilisateur
>> 3 un résultat
Et par la suite, je pourrais rajouter en plus de ces simples assignations et opérations de bases, des fonctions arithmétiques et géométrique plus amusantes :p

Voici à quoi ressemble mon main pour l'instant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
#include <stdio.h>
#include <stdlib.h>
#include "ed/inc/io.h"
 
 
#define TAILLE_MAX_COMMANDE 32
 
int main(int argc, char *argv[])
{
    printf("Invite de commandes mathematiques.\n\n");
 
    char commande[TAILLE_MAX_COMMANDE] = {0};
    int retour = 0;
 
    for(;;)
    {
        // Affichage du promt
        printf("> ");
        fflush(stdout);
 
        // Tant que la saisie ne se fait pas sans erreur
        while ((retour = get_s(commande, sizeof commande)) != IO_OK)
        {
            // Si l'erreur est un dépassement de taille du tableau
            if (retour == IO_ERR_LENGTH)
                printf("La commande est trop longue et ne sera donc pas traitee.\n");
 
            // Sinon, on n'analyse pas le cas par cas (inintéressant ici)
            else printf("Erreur indeterminee. La commande ne sera pas traitee.\n");
 
            // Affichage du promt
            printf("> ");
            fflush(stdout);
        }
 
        // Si la chaine saisie est "quit", on quitte le programme normalement
        if (strcmp(commande, "quit") == NULL)
            return EXIT_SUCCESS;
    }
}
Pour l'instant, il ne fait pas grand chose...

Le premier problème que je me pose : comment reconnaître correctement les commandes saisies ?
En effet, si l'utilisateur entre "A=1", "A= 1", " A = 1", le résultat devra être le même.

J'ai imaginé un début de solution à partir de fonctions que j'ai créées pour un projet précédant :

- lire la saisie
- définir les caractères qui doivent impérativement être "décollés" des autres expressions (ici, c'est =)
- compter le nombre d'espaces manquants, s'il manque des espaces
- allouer dynamiquement une nouvelle chaine avec assez de place pour contenir des espaces en plus
- copier la saisie en rajoutant les espaces manquants

En gros, ce morceau fait ça :
"A=1" devient "A = 1".

Ensuite :
- on peut désormais lire chaque mot indépendamment
- on regarde si ça correspond à un "modèle" (ici LETTRE = VALEUR), et on applique la fonction (je n'ai pas encore mis en place cette partie "reconnaissance de modèle")

Pensez-vous que je parte sur quelque chose de correct ?
Ca me paraît long comme démarche, fastidieux.
Comment feriez-vous pour reconnaître que la saisie appartient à un "modèle" défini ?

Par avance, merci.