S6 - 2025 4 semaines 4 étudiants

42sh

Un interpréteur de commandes écrit en C, capable d'analyser une partie du langage shell et d'en exécuter les structures à partir d'un arbre syntaxique.

C99 POSIX Lexer / Parser AST Autotools

Le projet en quelques mots

Un shell est le programme qui reçoit une commande dans un terminal, comprend sa structure puis lance les programmes demandés.

42sh reproduit ce parcours sans déléguer l'analyse à un shell existant. Le rendu lit une chaîne, un fichier ou l'entrée standard, découpe le texte en éléments syntaxiques, construit un arbre puis parcourt cet arbre pour exécuter les commandes et les structures reconnues.

Le sujet complet était organisé en quatre étapes. La copie conservée couvre les fondations des deux premières et quelques éléments de la troisième ; elle n'est donc pas présentée comme un shell POSIX complet.

Du texte à l'exécution

Le programme sépare l'analyse du langage et son exécution. Cette organisation permet de vérifier la syntaxe avant de lancer une commande et de représenter les blocs imbriqués sous une forme commune.

01

Entrée

Chaîne avec -c, fichier de script ou entrée standard.

02

Lexer

Découpe le texte en mots, opérateurs, redirections et mots réservés.

03

Parser

Contrôle l'ordre des éléments et reconnaît les règles de grammaire.

04

AST

Représente commandes, listes, conditions, boucles et redirections.

05

Exécution

Lance les commandes intégrées ou un programme externe avec execvp.

Inspection de l'arbre

L'option --pretty-print peut écrire l'AST au format DOT afin de visualiser la structure reconnue sans l'exécuter.

Ce qui est présent dans le rendu

Structures du langage

Commandes simples et listes, conditions if, elif et else, boucles while, until et for, ainsi que blocs entre accolades.

Mots et variables

Guillemets simples ou doubles, échappement, commentaires, affectations, variables utilisateur et paramètres spéciaux comme $? ou $$.

Contrôle de l'exécution

Opérateurs &&, || et !, redirections de fichiers et de descripteurs, codes de retour et lancement de programmes externes.

Commandes intégrées

Implémentations dédiées de true, false, echo, cd et exit afin de conserver l'état propre au shell lorsque nécessaire.

Vérification du rendu conservé

C99

Compilation stricte

Les 25 fichiers C compilent avec -Wall, -Wextra, -Werror, -Wvla et -pedantic.

154 / 155

Tests des étapes 1 et 2

Lors de l'audit local, la testsuite fournie valide les 80 cas de l'étape 1 et 74 des 75 cas de l'étape 2 face à Bash en mode POSIX.

Périmètre restant

Les fonctions shell, les sous-shells, la substitution de commandes, case, les alias et les builtins export, unset, break et continue ne sont pas implémentés dans cette copie. La syntaxe des pipelines est reconnue, mais le transfert de données entre processus n'y est pas finalisé.

Synthèse du projet

Travail réalisé

Le rendu assemble un lexer, un parser récursif, plusieurs types de nœuds AST, leur libération et leur évaluation. Il relie cette chaîne à la gestion des variables, des descripteurs de fichiers, des commandes intégrées et des processus externes.

Ce que le projet m'a apporté

Ce projet m'a donné une vue concrète du fonctionnement d'un interpréteur et de son lien avec Unix. J'y ai travaillé la grammaire d'un langage, les arbres syntaxiques, les processus, les codes de retour et la gestion rigoureuse des ressources en C.