Parsing ligne commande - shell UNIX en C

Fermé
Utilisateur anonyme - Modifié par enzoaguado le 9/05/2015 à 11:50
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 - 11 mai 2015 à 22:39
Bonjour à tous !

Je suis en train de créer un interpréteur de commande UNIX en C dans le cadre d'un projet.

Je dois donc gérer les séparateurs et opérateurs tels que | < > << >> ; && etc

Je récupère déjà la ligne utilisateur, je sais comment faire les pipes, les exécutions de commande et tout le reste.

Le problème étant au niveau du parsing de la ligne récupérée.

Par exemple j'ai cette ligne

ls -l | grep Bureau > hello.txt ; ls | wc



Je pensais la parser de manière classique en prenant :
  • Le nom de la commande
  • Les arguments
  • L'opérateur


Et envoyer le tout à la fonction appropriée à l'opérateur (une fonction par opérateur)

Le problème vient sur la partie

grep Bureau > hello.txt ;


Si je suis ma logique, j'aurais un groupe qui se finira par la redirection > et un autre groupe qui ne contient que test.txt et ; (un groupe est une structure qui contient le nom de la fonction, les arguments et l'opérateur)

Ma question est la suivante :comment gérer les redirections au niveau du parsing ? Sachant que la redirection peut elle même être redirigée ou passée dans un pipe, etc.

Si vous avez besoin de plus de renseignements, n'hésitez pas à demander. Merci !
A voir également:

1 réponse

Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 726
Modifié par Sugel le 11/05/2015 à 22:40
Je suis vraiment très loin d'être un expert en parsing, mais j'ai quand même mon idée là dessus:
Face au même problème, je considérerai probablement que chaque opérateur a un argument qui est lui même traité comme un nouveau groupe.
A chaque nouvel opérateur, on crée un nouveau membre dans une liste chainée comportant les informations adaptées, et quand on arrive à un break (;), and (&&) ou à la fin de la commande, on ferme la liste et on la traite.

Qu'en pense-tu ?

Si tu es vraiment à cours d'idée, lis les sources de bash ou d'un autre shell populaire.

------------------------------------------------------------------------------------
"La peur mène à la colère. La colère mène à la haine. Et la haine ... mène à la souffrance." - Yoda
0