2.4. Langage de commande

Dans cet exercice, on étudie brièvement la structure d’un langage de commande. Ce langage est défini comme suit :
<suite commandes> ::= <commande> | <commande> ; <suite commandes>
<commande> ::= <mot> | <mot> <suite paramètres>
<suite paramètres> ::= <mot> | <mot> <suite paramètres>
Un mot est une unité lexicale constituée d’une suite de caractère de longueur quelconque (>0), ne contenant pas d’espace, tabulation, fin de ligne ou point-virgule, sauf s’il commence par le caractère “ ' ” auquel cas le mot se termine sur le caractère “ ' ” suivant, quels que soient les caractères situés entre les deux. Dans ce cas, le mot lui-même ne contient pas les caractères “ ' ” de début et de fin.
A– Donner le découpage en mots et commandes des lignes suivantes, en justifiant votre réponse :
cc -c toto.c
ld toto.o -o toto; rm toto.o
truc c'est le schmilblick
alias virus 'bidule toto; machin'
B– L’interpréteur de commande reconnaît la commande interne alias, qui a deux arguments A1 et A2, et qui ajoute le couple <A1, A2> à une table de correspondance des alias. Cette table conserve donc les associations entre les arguments des commandes alias déjà exécutées. Après avoir effectué le découpage en mot d’une commande quelconque, l’interpréteur recherche le premier mot de la commande dans cette table (première composante d’un couple), et s’il le trouve, le remplace, dans la commande en cours, par la valeur associée (deuxième composante du couple). Expliquer l’intérêt de ce mécanisme, et décrire son effet sur la ligne suivante :
virus alpha
Solution de l’exercice 2.4

2.4.1. Question A

Il y a peu de difficulté sur le découpage des mots. En fait, c’est en général l’espace ou la fin de ligne qui détermine la fin d’un mot, sauf si le mot commence avec le caractère “ ' ”. Le seul caractère particulier étant lui-même unité lexicale est le “ ; ”. Le découpage en mot est la suivante :
 cc  -c   toto.c  Il n’y a qu’une seule commande avec deux paramètres.
 ld   toto.o   -o   toto   ;   rm   toto.o  Il y a ici deux commandes, l’une ld avec trois paramètres, et l’autre rm avec un paramètre.
 truc   c'est   le   schmilblick  Il n’y a qu’une seule commande avec trois paramètres. Le caractère “ ' ” présent dans c'est, n’étant pas en début de mot est considéré, comme un caractère ordinaire.
 alias   virus   bidule toto; machin  Il y a une seule commande, avec deux paramètres. Notons que le caractère “ ' ” étant en début de mot implique que la fin du mot est le caractère “ ' ” suivant. Ces deux caractères spéciaux ont été enlevés du mot, puisqu’ils n’en font pas partie. Ce ne sont pas non plus des symboles du langage, mais des délimiteurs lexicaux, comme l’espace ou la fin de la ligne. Par ailleurs, le “ ; ” est considéré ici comme un caractère quelconque faisant partie du mot, et non symbole du langage.

2.4.1. Question A

Le mécanisme d’alias est en fait un mécanisme d’abréviation (voir 15.2.4). Sur la commande virus alpha, il va y avoir substitution du mot virus par le mot associé, pour donner la suite de commandes :
bidule toto; machin alpha
Ceci sera donc interprété comme une suite de deux commandes : bidule toto suivie de machin alpha.