IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Parser + Shell


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Par défaut Parser + Shell
    Bonjour,

    J'ai fait quelques recherches sur le forum mais rien ne correspond réellement à mon cas
    J'essaie de réaliser un shell. Je suis novice en programmation système donc ça me complique un peu les choses mais quoi de mieux pour bien me former

    Pouvez-vous me dire quelle "structure" adoptée ? Pour l'instant, j'ai 2 variables globales : celle qui contient le texte entré par l'utilisateur, et un tableau qui contient un pointeur vers chaque mot du texte entré par l'utilisateur. Mais ça ne me plaît pas vraiment.

    Déjà, les variables globales, je ne suis pas fan et en plus, j'ai l'impression que ce n'est pas "propre".

    Est-ce qu'une liste simplement chaînée est plus adaptée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct s_cmd {
    char *nom;
    char *argv;
    int argc;
    struct s_cmd *next;
    }cmd_t, *cmd;

    Aussi, je dois évidemment coder un parser en fonction de ce que je vais gérer. Y a-t'il un moyen efficace de s'y prendre ? Ca se code facilement ?

    PS : Le problème de mon raisonnement pour le découpage, c'est que je me base sur les espaces entre les mots. Ainsi, si je tape ls;pwd, ma fonction considère que ce n'est qu'un mot.


    Merci d'avance pour votre aide.

    EDIT : Erreur dans la structure

  2. #2
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Quel shell ? bash ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Par défaut
    J'avais pas précisé arf, oui c'est bien ça.

  4. #4
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Je ne suis pas sûr d'avoir compris : Créer un shell de toutes pièces pour remplacer le shell existant ?
    Toujours est-il que la séparation des items se fait sur espace, tabulation et retour à la ligne. (le fameux IFS (Internal Field Separator)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 17
    Par défaut
    Le but n'est pas de remplacer le shell existant mais de créer un mini-shell qui devra gérer certains opérateurs tels que : &, &&, |, ||, <, <<, >>, >

    Capable d'exécuter des binaires et quelques built-in que j'aurais recodé.

  6. #6
    Membre à l'essai
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 5
    Par défaut
    Un parseur se fait généralement avec une suite de deux étapes: analyse lexicale puis analyse grammaticale.

    L'analyse lexicale consiste à transformer une suite de charactère en une suite de tokens. Dans ton cas la suite de charactère c'est le text brut entré par l'utilisateur du shell, la suite de token, c'est une suite d'éléments qui ressemblent un peu à ta structure, chaque élément pouvant être soit un id (par exemple "ls" ou "pwd", mais aussi des arguments "/home/username") ou alors un "keyword", dans le cas d'un shell ce sera: "&", "|", "<", "<<" etc.

    Pour la structure de donnée, la manière dont je fais généralement c'est avec des ADT (algebraic data type), mais ça existe pas vraiment en C (les union est ce qui se fait de plus proche), donc je conseillerais de les simuler avec un enum type pouvant prendre valeurs comme: ID, BAR, REDIRECT, ASSIGN, etc. Autrement dit un type pour chaque genre de tokens que tu rencontreras. Ensuite une structure du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct token {
      type t;
      char *id;
    };
    Le champ id ne fait sens que quand le type est == à ID, dans les autres cas la valeur du type est suffisante pour déterminer de quel token il s'agit.
    Ensuite quand tu parse les charactères un par un, en fonction du char que tu rencontre tu essaie de former le token correspondant. C'est généralement à cette étape que les commentaires sont ignoré, ils sont considérés comme des espaces et ne sont pas transformé en tokens.

    Après cet étape tu as une liste de token, qui est une représentation beaucoup plus pratique de l'input. A ce moment là généralement on construit un arbre abstrait à partir des tokens, mais je pense que dans le cas du Shell on peut interpréter directement après cette étape. Mais dans la majorité des compilateurs, il s'agit de transformer cette liste en un AST (abstract syntax tree). Ca permet notament de simplifier la gestion de choses comme la priorité des opérateurs, qui est parfois delicate à gérer au moment de l'intérprétation. Avec cette transformation en arbre, elle est gérée au moment de l'analyse et donc l'intérprétation n'a plus à s'en soucier.

    Sinon un conseil pour gérer les id, il suffit de tester si c'est un mot builtin, si c'est le cas tu l'execute comme il le devrait. Sinon, bah tu considère que c'est un appel d'un binaire, et tu lances par défaut un appel système en lui propageant l'id comme argument.

    Enfin, j'avais du coder un shell pour un cours (dans lequel on avait pas vraiment respecté tout ce que je viens de décrire sur es phases de compilation ). Donc si ça t'intéresse de voir je peux te l'envoyer.

Discussions similaires

  1. SHELL : Parser une chaine de caractere
    Par dib52002 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 10/12/2010, 10h28
  2. Script shell pour parser un fichier txt
    Par pcsystemd dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/09/2008, 09h32
  3. Parser le resultat d'une commande shell
    Par coockie_jr dans le forum C++
    Réponses: 3
    Dernier message: 19/05/2008, 15h47
  4. [shell script] parser un fichier en colonne
    Par Blo0d4x3 dans le forum Linux
    Réponses: 11
    Dernier message: 22/04/2007, 11h38
  5. Parser une chaine en shell script
    Par Gogoye dans le forum Linux
    Réponses: 10
    Dernier message: 19/07/2004, 17h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo