Réalisation shell : comment reconnaître commandes ?
Bonsoir,
Je me lance dans la réalisation d'un shell de commandes qui servira a effectuer des calculs mathématiques.
Exemple de fonctionnement :
Citation:
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:
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.