-
Notifications
You must be signed in to change notification settings - Fork 0
/
bison.y
executable file
·196 lines (157 loc) · 8.9 KB
/
bison.y
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
//%define api.pure
%define api.value.type {union YYSTYPE}
//%pure-parser
%define parse.error verbose
%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
%}
%{
#include "flex.lex.h"
#include "dichiarazioni.h"
%}
/* declare tokens */
%token NUMBER
//%token <fn> TYPE
%token TYPE
%token SEMI
%token <c> ALPHA
%token ASSIGN
%token VAR
%token LBRACE /*{*/
%token RBRACE /*}*/
%token LPAREN /*(*/
%token RPAREN /*)*/
%token EVENT
%token ACTION
%token COMMAND
%token STATE
%token COMMA
%token CHANGESTATE
%token COMMENT
//%token SPACE
%token IF
%token ELSE
%token ELIF
%token <fn> CMP
%token <fn> OPERATORE
%token WHILE
%token FOR
%token <fn> PRINT
%type <fn> term NUMBER TYPE
%type <op> operazioni
%type <c> string
%type <as> elenco_ass assegnazione definition
%type <even> elenco_ev_com events commands
%type <elen_stat> elenco_stati
%type <stat> state
%type <elen> elenchi
%type <azione> elenco_actions elenco_operazioni actions
%type <elen_con> elenco_cond
%type <cic> cicli
%type <camb_stat> elenco_cambio cambiostato
%type <con> cond
//%useless commenti
%start main
%%
main: definition events commands elenco_stati {run($1,$2,$3,$4);printf("stai runnando??\n");}
;
definition: VAR LBRACE RBRACE {$$=add_assegnazioni(NULL,new_assegnazioni(NULL,NULL,11));}
| VAR LBRACE elenco_ass RBRACE {$$=$3;}
;
elenco_ass: assegnazione SEMI
| elenco_ass assegnazione SEMI {$$= add_assegnazioni( $1, $2);}
;
assegnazione: TYPE string ASSIGN string {$$ = new_assegnazioni($2, $4, $1);}
| TYPE string ASSIGN term {$$ = new_assegnazioni($2, (void*) $4, $1);}
;
// per risolvere le avvertenze di cast uso la & al posto del cast
string: ALPHA {$$=$1;}
;
operazioni: string ASSIGN string OPERATORE string {$$=new_operazione( new_assegnazioni( $1, NULL, 15), new_assegnazioni( NULL, (void*)$3, 15), new_assegnazioni(NULL, (void*)$5, 15), $4, -1);}
| string ASSIGN string OPERATORE term {$$=new_operazione( new_assegnazioni( $1, NULL, 15), new_assegnazioni( NULL, (void*)$3, 15), new_assegnazioni( NULL, (void*)$5, 11), $4, -1);}
| string ASSIGN term OPERATORE string {$$=new_operazione( new_assegnazioni( $1, NULL, 15), new_assegnazioni( NULL, (void*) $3, 11), new_assegnazioni( NULL, (void*)$5, 15), $4, -1);}
| string ASSIGN term OPERATORE term {$$=new_operazione( new_assegnazioni( $1, NULL, 15), new_assegnazioni(NULL, (void*) $3, 11), new_assegnazioni( NULL, (void*) $5, 11), $4, -1);}
| OPERATORE LPAREN string RPAREN {$$=new_operazione( new_assegnazioni( $3, NULL, 15), NULL, NULL, $1, -1);}
| OPERATORE LPAREN term COMMA string RPAREN {$$=new_operazione( new_assegnazioni( $5, NULL, 15), NULL, NULL, $1, $3);}
| PRINT LPAREN string RPAREN {$$=new_operazione( new_assegnazioni( $3, NULL, 15), NULL, NULL, $1, -1);}
| PRINT {$$=new_operazione(NULL, NULL, NULL, $1, -1);}
;
/*
assignments: VAR LBRACE elenco_ass RBRACE {$$=$3;}
;*/
term: NUMBER
;
events: EVENT LBRACE elenco_ev_com RBRACE {$$=$3;}
;
elenco_ev_com: string SEMI {$$= new_evento((evento) $1,NULL);}
| elenco_ev_com string SEMI {$$= add_evento($1,new_evento((evento) $2,NULL));}
;
elenco_stati:state {$$=new_el_stati1($1);}
| elenco_stati state {$$=add_el_stati($1, $2);}
;
state: STATE string LBRACE actions elenchi RBRACE {$$=new_stato2($2,$4,$5);}
| STATE string LBRACE actions elenco_cond elenchi RBRACE {$$=new_stato4($2,$4,$5,$6);}
| STATE string LBRACE actions cicli RBRACE {$$=new_stato5($2,$4,NULL,NULL,$5);}
| STATE string LBRACE actions cicli elenco_cond RBRACE {$$=new_stato5($2,$4,$6,NULL,$5);}
| STATE string LBRACE actions cicli elenchi RBRACE {$$=new_stato5($2,$4,NULL,$6,$5);}
;
elenchi: elenco_operazioni {$$= new_elenchi($1, NULL);}
| elenco_cambio {$$= new_elenchi(NULL, $1);}
| elenchi elenco_cambio {$$= add_cambio_elenchi($1, $2);}
| elenchi elenco_operazioni {$$= add_oper_elenchi($1, $2);}
;
elenco_operazioni: operazioni SEMI {$$ = new_action((operazioni*) $1,NULL);;}
| elenco_operazioni SEMI operazioni {$$ = add_azione($1, new_action((operazioni*) $3, NULL));}
;
/*
azioni:string SEMI {$$ = new_action((operazioni*) $1,NULL);}
| azioni string SEMI {$$ = add_azione($1, new_action((operazioni*) $2, NULL));}
;
*/
actions: ACTION LBRACE RBRACE SEMI {$$= new_action(NULL, NULL);}
| ACTION LBRACE elenco_actions RBRACE SEMI {$$= $3;}
;
commands: COMMAND LBRACE elenco_ev_com RBRACE {$$=$3;}
;
elenco_actions: operazioni {$$ = new_action((operazioni*) $1,NULL);}
| elenco_actions COMMA operazioni {$$ = add_azione($1, new_action((operazioni*) $3, NULL));}
;
cambiostato: string CHANGESTATE string SEMI {$$= new_cambiostato(new_evento((evento*) $1,NULL),new_el_stati1(new_stato1($3)));}
| CHANGESTATE string SEMI {$$= new_cambiostato(new_evento( (evento*) "0",NULL),new_el_stati1(new_stato1($2)));}
;
elenco_cambio: cambiostato
| elenco_cambio cambiostato {$$=add_cambiostato($1,$2);}
;
commenti: COMMENT
|COMMENT string
;
cicli: FOR LPAREN assegnazione COMMA string CMP term COMMA operazioni RPAREN LBRACE elenco_cond RBRACE {$$=new_cicli(1, $3, $12, new_action((operazioni*) $9,NULL), new_cond(new_assegnazioni(NULL,(void*) $5,15),new_assegnazioni(NULL,(void*) $7,11), $6, NULL));}
| FOR LPAREN assegnazione COMMA term CMP string COMMA operazioni RPAREN LBRACE elenco_cond RBRACE {$$=new_cicli(1, $3, $12, new_action((operazioni*) $9,NULL), new_cond(new_assegnazioni(NULL,(void *) $5, 11),new_assegnazioni(NULL,(void *) $7, 15), $6, NULL));}
| FOR LPAREN assegnazione COMMA string CMP string COMMA operazioni RPAREN LBRACE elenco_cond RBRACE {$$=new_cicli(1, $3, $12, new_action((operazioni*) $9,NULL), new_cond(new_assegnazioni(NULL,(void *) $5, 15),new_assegnazioni(NULL,(void *) $7, 15), $6, NULL));}
| FOR LPAREN assegnazione COMMA string CMP term COMMA operazioni RPAREN LBRACE elenchi RBRACE {$$=new_cicli1(1, $3, $12, new_action((operazioni*) $9,NULL), new_cond(new_assegnazioni(NULL,(void *) $5, 15),new_assegnazioni(NULL,(void*) $7, 11), $6, NULL));}
| FOR LPAREN assegnazione COMMA term CMP string COMMA operazioni RPAREN LBRACE elenchi RBRACE {$$=new_cicli1(1, $3, $12, new_action((operazioni*) $9,NULL), new_cond(new_assegnazioni(NULL,(void*) $5, 11),new_assegnazioni(NULL,(void *) $7, 15), $6, NULL));}
| FOR LPAREN assegnazione COMMA string CMP string COMMA operazioni RPAREN LBRACE elenchi RBRACE {$$=new_cicli1(1, $3, $12, new_action((operazioni*) $9,NULL), new_cond(new_assegnazioni(NULL,(void *) $5, 15),new_assegnazioni(NULL,(void *) $7, 15), $6, NULL));}
| WHILE LPAREN term CMP term RPAREN LBRACE elenco_cond RBRACE {$$=new_cicli(2, NULL, $8, NULL, new_cond(new_assegnazioni(NULL,(void *) $3, 11),new_assegnazioni(NULL,(void *) $5,11), $4, NULL));}
| WHILE LPAREN string CMP term RPAREN LBRACE elenco_cond RBRACE {$$=new_cicli(2, NULL, $8, NULL, new_cond(new_assegnazioni(NULL,(void *) $3, 15),new_assegnazioni(NULL,(void *) $5, 11), $4, NULL));}
| WHILE LPAREN term CMP string RPAREN LBRACE elenco_cond RBRACE {$$=new_cicli(2, NULL, $8, NULL, new_cond(new_assegnazioni(NULL,(void *) $3,11),new_assegnazioni(NULL,(void *) $5,15), $4, NULL));}
| WHILE LPAREN string CMP string RPAREN LBRACE elenco_cond RBRACE {$$=new_cicli(2, NULL, $8, NULL, new_cond(new_assegnazioni(NULL,(void *) $3, 15),new_assegnazioni(NULL,(void *) $5,15), $4, NULL));}
| WHILE LPAREN term CMP term RPAREN LBRACE elenchi RBRACE {$$=new_cicli1(2, NULL, $8, NULL, new_cond(new_assegnazioni(NULL,(void *) $3, 11),new_assegnazioni(NULL,(void *) $5,11), $4, NULL));}
| WHILE LPAREN string CMP term RPAREN LBRACE elenchi RBRACE {$$=new_cicli1(2, NULL, $8, NULL, new_cond(new_assegnazioni(NULL,(void *) $3, 15),new_assegnazioni(NULL,(void *) $5, 11), $4, NULL));}
| WHILE LPAREN term CMP string RPAREN LBRACE elenchi RBRACE {$$=new_cicli1(2, NULL, $8, NULL, new_cond(new_assegnazioni(NULL,(void *) $3,11),new_assegnazioni(NULL, (void *) $5,15), $4, NULL));}
| WHILE LPAREN string CMP string RPAREN LBRACE elenchi RBRACE {$$=new_cicli1(2, NULL, $8, NULL, new_cond(new_assegnazioni(NULL,(void *) $3, 15),new_assegnazioni(NULL,(void *) $5,15), $4, NULL));}
;
metodo: IF
| ELIF
;
cond: metodo LPAREN term CMP term RPAREN LBRACE elenchi RBRACE {$$=new_cond(new_assegnazioni(NULL, (void *) $3, 11),new_assegnazioni(NULL,(void*) $5, 11), $4, $8);}
| metodo LPAREN term CMP string RPAREN LBRACE elenchi RBRACE {$$=new_cond(new_assegnazioni(NULL,(void*) $3, 11),new_assegnazioni(NULL, (void*)$5,15), $4, $8);}
| metodo LPAREN string CMP term RPAREN LBRACE elenchi RBRACE {$$=new_cond(new_assegnazioni(NULL,(void *) $3,15),new_assegnazioni(NULL,(void*) $5, 11), $4, $8);}
| metodo LPAREN string CMP string RPAREN LBRACE elenchi RBRACE {$$=new_cond(new_assegnazioni(NULL,(void *) $3, 15),new_assegnazioni(NULL,(void *) $5, 15), $4, $8);}
| ELSE LBRACE elenchi RBRACE {$$=new_cond(NULL,NULL,0, $3);}
;
elenco_cond: cond {$$=add_elencocond(new_elencocond($1),NULL);}
| elenco_cond cond {$$=add_elencocond($1,new_elencocond($2));}
;
%%