Bonjour à tous, je suis un débutant dans l'utilisation des outils bison/flex ou yacc/lex, et j'ai besoin de votre aide pour pouvoir génerer l'arbre syntaxique d'une expression arithmétique. voici mon fichier bison et flex:
<arith.y>
Code c : 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 %{ #define YYSTYPE double #include <math.h> #include <stdio.h> void yyerror (char const *); %} /* Bison declarations. */ %token NUM %token PLUS %token MINUS %token TIMES %token DIV %token MOD %token LPAR LPAR %% /* The grammar follows. */ input : /* empty */ | input line ; line : '\n' | arithExpr '\n' ; /* expression arithmetique*/ arithExpr:arithExpr PLUS terme |arithExpr MINUS terme |terme ; terme : terme TIMES facteur | terme DIV facteur | terme MOD facteur | facteur ; facteur : LPAR arithExpr RPAR | expr ; expr:NUM ; %% void yyerror (char const *s) { fprintf (stderr, "%s\n", s); } int main (int argc, char * argV[]) { if(argc > 1) yyin = fopen(argV[1],"r"); return yyparse (); }
<arith.l>
Code c : 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 %{ #define YYSTYPE int #include <stdio.h> #include <math.h> #include "arith.tab.h" extern int yyval; %} %% "+" {return PLUS;} "-" {return MINUS;} "/" {return DIV;} "*" {return TIMES;} "%" {return MOD;} \( {return LPAR;} \) {return RPAR;} [0-9][0-9]* { yylval.Reel = atof(yytext); return Num;} %%
Partager