This repository has been archived by the owner on May 31, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.mly
159 lines (135 loc) · 3.5 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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/* 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 VIRG
%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 NULL
%token NEW
%token ADRESSE
%token EOF
%token ENUM
%token SWITCH
%token CASE
%token BREAK
%token DPTS
%token DEFAULT
(* 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 <typ> typ
%type <(typ*string) list> dp
%type <expression> e
%type <expression list> cp
%type <affectable> a
%type <string list> idents
%type <typ> enum
%type <typ list> enums
%type <break> brk
%type <case list> lcase
%type <case> cas
(* Type et définition de l'axiome *)
%start <Ast.AstSyntax.programme> main
%%
main : lenum = enums lfi = prog EOF {let (Programme (_,lf1,li))=lfi in (Programme (lenum,lf1,li))}
prog :
| lf = fonc lfi = prog {let (Programme (lenum,lf1,li))=lfi in (Programme (lenum,lf::lf1,li))}
| ID li = bloc {Programme ([],[],li)}
fonc : t=typ n=ID PO p=dp PF AO li=is RETURN exp=e PV AF {Fonction(t,n,p,li,exp)}
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)}
| a1=a EQUAL e1=e PV {Affectation (a1,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)}
| SWITCH PO econd = e PF AO lc = lcase AF {Switch(econd, lc)}
dp :
| {[]}
| t=typ n=ID lp=dp {(t,n)::lp}
typ :
| BOOL {Bool}
| INT {Int}
| RAT {Rat}
| tid = TID {TypeEnum (tid,[])}
| typ1=typ MULT {Pointeur typ1}
a :
| n=ID {Ident n}
| PO MULT a1=a PF {Valeur a1}
e :
| CALL n=ID PO lp=cp PF {AppelFonction (n,lp)}
| CO e1=e SLASH e2=e CF {Rationnel (e1,e2)}
| NUM e1=e {Numerateur e1}
| DENOM e1=e {Denominateur e1}
| TRUE {True}
| FALSE {False}
| e=ENTIER {Entier e}
| 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}
| a1=a {Affectable a1}
| NULL {Null}
| PO NEW typ1=typ PF {New typ1}
| ADRESSE n=ID {Adresse n}
| tid = TID {ExpressionEnum (tid)}
cp :
| {[]}
| e1=e le=cp {e1::le}
enum :
|ENUM id = TID AO lid = idents AF PV {TypeEnum(id,lid)}
idents :
|idnt = TID {[idnt]}
|idnt = TID VIRG lid = idents {idnt::lid}
enums :
| {[]}
| i1=enum li=enums {i1::li}
brk :
| {Lambda}
| BREAK PV {Break}
lcase :
| {[]}
| i1=cas li=lcase {i1::li}
cas :
| CASE TRUE DPTS ins = is b = brk {CaseTrue(ins,b)}
| CASE FALSE DPTS ins = is b = brk {CaseFalse(ins,b)}
| CASE inte = ENTIER DPTS ins = is b = brk {CaseEntier (inte,ins,b)}
| CASE tid = TID DPTS ins = is b = brk {CaseTid(tid,ins,b)}
| DEFAULT DPTS ins = is b = brk {CaseDefault(ins,b)}