-
Notifications
You must be signed in to change notification settings - Fork 0
/
grammaire.tkt
162 lines (115 loc) · 2.77 KB
/
grammaire.tkt
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
160
161
162
//Definition de la grammaire syntaxique d'un programme CAML
//Lexemes terminaux en MAJUSCULES:
//Lexemes de controles
FIN_PRG: ;;
FIN_EXPR: ;
//Lexemes de mots clés
LET: let
AND: and
IN: in
IF: if
ELSE: else
THEN: then
BEGIN: begin
END: end
PARO: (
PARF: )
COMMENTO: (*
COMMENTF: *)
//Lexemes d'opérateurs
PLUS: +
MINUS: -
MUL: *
DIV: /
EQUAL: =
NOT: !
LOGIC_AND: &
LOGIC_OR: or
GREATER_THAN: >
LOWER_THAN: <
EQUALITY: ==
INEQUALITY: !=
GREATER_OR_EQUAL: >=
LOWER_OR_EQUAL: <=
//Grammaire par ordre d'évaluation (a peu près)
//Axiome
programme -> seq_expression FIN_PRG
//Une multitude d'expression
seq_expression -> expression ss_expression
//Chaque expression est séparée par une FIN_EXPR
ss_expression -> eps
-> FIN_EXPR expression ss_expression
//Une expression seule
expression -> affectation //let
-> condition // if then else
-> operation // operation de valeur
//Affectation : let <var> = <expr> [and <var> = <expr> ...] in <expr>
affectation -> LET seq_affect suite_affect
suite_affect -> eps
-> IN expression
seq_affect -> affect ss_affect
ss_affect -> eps
-> AND affect ss_affect
affect -> object EQUAL expression
object -> nom_var /* seq_fparam
seq_fparam -> fparam ss_fparam
ss_fparam -> eps
-> fparam ss_fparam
fparam -> nom_var */
//Opérations (EAG modifiées)
operation -> seq_terme
seq_terme -> terme ss_terme
ss_terme -> eps
-> op1 terme ss_terme
terme -> seq_facteur
seq_facteur -> facteur ss_facteur
ss_facteur -> eps
-> op2 facteur ss_facteur
facteur -> MINUS valeur
-> valeur
-> PARO operation PARF
op1 -> PLUS
-> MINUS
op2 -> MUL
-> DIV
valeur -> constante
-> identificateur //Nom de variable
constante -> chaine de caractère
-> entier
-> flottant
//Nom de variable (ou appel de fonction)
identificateur -> nom_var /*seq_param
seq_param -> param ss_param
-> eps
ss_param -> eps
-> param ss_param
param -> nom_var
-> constante
*/
nom_var -> chaine de caractères commençant par une lettre
//Conditions logiques
condition -> IF seq_boolor THEN expression suite_condition
suite_condition -> eps
-> ELSE expression
seq_boolor ->boolor ss_boolor
ss_boolor -> eps
-> op1log boolor ss_boolor
boolor -> seq_booland
-> NOT seq_booland
seq_booland -> booland ss_booland
ss_booland -> eps
-> op2log booland ss_booland
boland -> NOT comparaison
-> comparaison
comparaison-> expression suitecomparaison
suitecomparaison -> op_compar expression
-> eps
//Opérateurs d'expression logiques
op1log -> LOGIC_OR
op2log -> LOGIC_AND
op_compar -> EQUALITY
-> INEQUALITY
-> GREATER_THAN
-> LOWER_THAN
-> LOWER_OR_EQUAL
-> GREATER_OR_EQUAL