Bonjour,
J'aimerais realiser un interpreteur a l'aide de flex/bison, qui me permettrait d'appeller les commandes shell correspondantes. Vu qu'un exemple est plus parlant, je mlance :
"ls" dans mon interpreteur de commande, lancerais la commande ls de mon shell, pour m'afficher le resultat dans ma fenetre, facile !

Alors voila ce que j'ai réalisé en me renseignant sur le net. Cependant, j'ai une erreur persisante a la compilation, qui me dit :
yaPi.y: Dans la fonction «yyparse» :
yaPi.y:38: erreur: incompatible types in assignment
Voila, ci vous pouviez m'eclaircir... voici mes sources :
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
%{
 
#include "yaPi.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
 
%}
 
chiffre  [0-9]
entier   {chiffre}+
lettre   [A-Za-z]
mot      {lettre}+
 
%%
 
{mot}  {
  strcpy(yylval.chaine,yytext);
  return COMMANDE;
}
 
{entier} {
  yylval.valeur=atoi(yytext);
  return NOMBRE;
}
 
"\n"  return FIN;

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
%{
 
#include "stdio.h"
#include "stdlib.h"
 
%}
 
%union{
  char chaine[256]; /*On definit deux "champs" possibles dans yylval.*/
  int valeur;
 }
 
%token <chaine> COMMANDE
%token <chaine> FIN
%token <valeur> NOMBRE
%type <chaine> ExpressionTexte Ligne
%type <valeur> ExpressionNombre
 
%start Input
 
%%
 
 
Input:
| Input Ligne
;
 
ExpressionNombre: 
  NOMBRE  {
    $$=$1;
  }
;
 
ExpressionTexte:
  COMMANDE  {
    $$=$1;
  }
;
 
Ligne:
  FIN
  | ExpressionTexte FIN { 
    printf("Vous avez tape: %s\n",$1);
    system("/bin/$1");
  }
  | ExpressionNombre FIN {
    printf("Vous avez tape: %s\n",$1);
  }
;
 
%%
 
int yyerror(char* s){
  yyparse();
}
 
int main(void){
  yyparse(); /*Appelle de l'analyseur synthaxique.*/
}