Bonjour, je suis actuellement �tudiant en 1ere ann�e d�une �cole d�informatique et je suis devant un exercice qui n�cessite d�impl�menter un arbre de syntaxe abstraite.

L�exercice consiste � programmer un minishell avec des r�gles pr�cises. Le comportement de r�f�rence du minishell est bas� sur celui de bash.
Pour le moment, j�ai un lexer qui prend l�entr�e standard et initialise une liste chain�e de token, voici ce dont j�ai besoin :

Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef	enum e_token_type
{
	TOK_INFILE_REDIR = 1, // '<'
	TOK_OUTFILE_REDIR, // '>'
	TOK_HERE_DOC, // ">>"
	TOK_APP_OUT_REDIR, // "<<"
	TOK_STRING, // text 'text' "text"
	TOK_AND, // "&&"
	TOK_OR, // "||"
	TOK_PIPE, // '|'
	TOK_L_PARENTHESIS, // '('
	TOK_R_PARENTHESIS // ')'
}	t_token_type;
Les token string ne contiennent qu�un argument au lieu de contenir une liste d�argument, aurait-il �t� pr�f�rable de mettre une suite de string dans le m�me token et ainsi all�ger la liste ?

Je veux maintenant mettre en place un arbre de syntaxe mais avant de foncer t�te baisser dans le code j�aimerais faire �valuer l�algorithme r�cursif que j�ai mis en place.
Les r�gles de grammaire de bash sont assez difficiles � mettre en �vidence et j�ai peut-�tre eu tendance � mettre trop de r�gles par � pr�caution �. La documentation de GNU m�a �t� utile pour d�finir l�ordre de priorit� mais j�ignore si je l�ai bien utilis� notamment dans la gestion des parenth�ses.

J�ai utilis� la forme Backus-Naur pour d�finir la grammaire de mon programme :

Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 *
        <list>                      ::=     '(' <command line> ')'   '||'     <list>
                                            |   '(' <command line> ')'  '&&'    <list>
                                            |   '(' <command line> ')'   '<'     <list>
                                            |   '(' <command line> ')'   '>'     <list>
                                            |   '(' <command line> ')'  '>>'    <list>
                                            |   '(' <command line> ')'  '<<'    <list>
                                            |   '(' <command line> ')'    '|'     <list>
                                            |   '(' <command line> ')'
                                            |   <command line>
    
    <command line>             ::=      <job>        '||'       <command line>
                                            |   <job>       '&&'      <command line>
                                                <job>
 
        <job>                 ::=       <command>   '|'     <job>
                                            |   <command>   '||'    <job>
                                            |   <command>  '&&'   <job>
                                            |   <command>
 
        <command>           ::= <simple command>   '<'    <filename>
                                            |   <simple command>   '>'    <filename>
                                            |   <simple command>  '>>'   <filename>
                                            |   <simple command>  '<<'   <EOF>
                                            |   <simple command>
 
        <simple command>::=     <pathname> <token list>
 
        <token list>         ::=        <token> <token list>
                                            |   (EMPTY)
 *
**/
Pour ce qui est de l�arbre j�ai suivi le cours https://rperrot.developpez.com/artic...ctures/arbres/ et je m�appr�te � regarder celui ci https://sjrd.developpez.com/algorith...xiques/#Lno-IX. Si quelqu�un � des ressources suppl�mentaires je suis preneur.

A premi�re vu je r�serverais bien les branches de gauche pour y mettre les arguments et op�rateurs entre parenth�se qui eux m�me se d�ploieront sur leur propre n�ud. Je redoute seulement que ce ne soit pas bien optimis� dans le cas o� l�entr�e serait une grande suite de commande sans parenth�se qui ne se d�veloppe que sur les branches de droites. Dans le cadre d�un minishell il semble qu�il n�est pas n�cessaire de s�en inqui�ter mais on doit anticiper le maximum de situations compromettantes.

Si quelqu�un peut m��clairer sur le sujet, je l�en remercie d�avance.