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 :
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 ?
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;
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 :
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.
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) * **/
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.
Partager