Hyalma est le shell (coquillage) des Hauts Elfes. Son code se situe dans apps/hyalma/
Hyalma utilise flex
pour générer son lexer à partir de lexer.lpp
et bison
pour générer son parser à partir de parser.ypp
.
La documentation sur l'utilisation de flex
et bison
avec C++
(et non C
) étant quasi-inexistante, nous sommes partis de la configuration proposée dans https://github.com/ezaquarii/bison-flex-cpp-example.
Une classe Command
(dans command.hpp
, command.cpp
) représente les commandes. Sont notables :
vector<string> argv
<, >, 2>, <<, >>, 2>>
);, &&, ||, |
)Pas de subtilité particulière dans lexer.lpp
. Actuellement, les guillemets n'expandent pas les variables.
La classe Scanner
(scanner.hpp
) est la déclaration du lexer généré par flex
.
Le bloc de base est subst_word
, une concaténation de mots (WORD
) et de variables substituées (VAR
).
Une simple_command
ne contient pas de séquence.
Les BLANK
sont gérés de manière à éviter les conflits :
BLANK
contient une quantité arbitraire de blancsBLANK
optionnels sont développés directement dans la règle sans utiliser opt_blank
(bison
ne semble pas permettre d'inliner des règles)simple_command
ne commence ni ne finit par un BLANK
, alors que command
permet les BLANK
en début et en finLe parser appelle la fonction exec
du shell, avec éventuellement un paramètre background
pour gérer &
.
shell.cpp
gère la lecture et l'exécution des commandes, le prompt et le Ctrl+C
.
Plusieurs niveaux :
fd
à utiliser pour stdin,stdout,stderr
am=cd, export, exit
)|
, les deux en même tempsexec()
exec_complex()
en passant les fds par défaut (stdin,stdout,stderr
)$?
Le handler se contente de passer un booléen à true
. Selon là où en est le shell (prompt, exécution d'une commande), le signal est transmis à un fils ou le buffer est vidé.
Nous ne supportons pas les read
non bloquants sur un pipe, ce qui empêche de vider stdin
lors d'un Ctrl+C
: on bufferise donc l'entrée (voir bigbuf). Ce n'est pas suffisant : actuellement, si on tape du texte pendant l'exécution d'une commande, il ne sera pas vidé.