-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.mly
133 lines (111 loc) · 2.99 KB
/
parser.mly
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* Imports. */
%{
open Type
open Ast.AstSyntax
%}
%token <int> ENTIER
%token <string> ID
%token <string> TID
%token RETURN
%token PV
%token AO
%token AF
%token PF
%token PO
%token EQUAL
%token CONST
%token PRINT
%token IF
%token ELSE
%token WHILE
%token BOOL
%token INT
%token RAT
%token CALL
%token CO
%token CF
%token SLASH
%token NUM
%token DENOM
%token TRUE
%token FALSE
%token PLUS
%token MULT
%token INF
%token EOF
%token NULL
%token NEW
%token AND
%token TYPEDEF
%token STRUCT
%token POINT
(* Type de l'attribut synthétisé des non-terminaux *)
%type <programme> prog
%type <instruction list> bloc
%type <fonction> fonc
%type <instruction list> is
%type <instruction> i
%type <affectable> a
%type <typ> typ
%type <(typ*string) list> dp
%type <expression> e
%type <expression list> cp
(* Type et définition de l'axiome *)
%start <Ast.AstSyntax.programme> main
%%
main : lfi = prog EOF {lfi}
prog :
| typenomme=td lf = fonc lfi = prog {let (Programme (ft,f1,li))=lfi in (Programme (typenomme::ft,lf::f1,li))}
| ID li = bloc {Programme ([],[],li)}
td :
| {[]}
| TYPEDEF a=TID EQUAL t=typ PV tdbase=td {DeclarationTypeNomme(a,t)::tdbase}
fonc : t=typ n=ID PO p=dp PF AO li=is AF {Fonction(t,n,p,li)}
bloc : AO li = is AF {li}
is :
| {[]}
| i1=i li=is {i1::li}
i :
| t=typ n=ID EQUAL e1=e PV {Declaration (t,n,e1)}
| affec=a EQUAL e1=e PV {AffectationPointeur(affec,e1)}
| affec=a PLUS EQUAL e1=e PV {AssignationAdd (affec,e1)}
| CONST n=ID EQUAL e=ENTIER PV {Constante (n,e)}
| PRINT e1=e PV {Affichage (e1)}
| IF exp=e li1=bloc ELSE li2=bloc {Conditionnelle (exp,li1,li2)}
| WHILE exp=e li=bloc {TantQue (exp,li)}
| RETURN exp=e PV {Retour (exp)}
| TYPEDEF a=TID EQUAL t=typ PV {DeclarationTypeNomme(a,t)}
a : | n=ID {Ident(n)}
| PO MULT ap=a PF {Dref(ap)}
| PO a1=a POINT n=ID PF {Champ(a1,n)}
dp :
| {[]}
| t=typ n=ID lp=dp {(t,n)::lp}
typ :
| BOOL {Bool}
| INT {Int}
| RAT {Rat}
| typee=typ MULT {Pointeur(typee)}
| nom=TID {TypeNomme(nom)}
| STRUCT AO dp1=dp AF {Enregistrement(dp1)}
e :
| CALL n=ID PO lp=cp PF {AppelFonction (n,lp)}
| CO e1=e SLASH e2=e CF {Binaire(Fraction,e1,e2)}
| TRUE {Booleen true}
| FALSE {Booleen false}
| e=ENTIER {Entier e}
| NUM e1=e {Unaire(Numerateur,e1)}
| DENOM e1=e {Unaire(Denominateur,e1)}
| PO e1=e PLUS e2=e PF {Binaire (Plus,e1,e2)}
| PO e1=e MULT e2=e PF {Binaire (Mult,e1,e2)}
| PO e1=e EQUAL e2=e PF {Binaire (Equ,e1,e2)}
| PO e1=e INF e2=e PF {Binaire (Inf,e1,e2)}
| PO exp=e PF {exp}
| affe=a {Affectable(affe)}
| NULL {Null}
| PO NEW typee=typ PF {NouveauType(typee)}
| AND n=ID {Adresse(n)}
| AO cp1=cp AF {ListeChamp(cp1)}
cp :
| {[]}
| e1=e le=cp {e1::le}