2 /* explicit types: Value may be larger than a pointer (e.g. long long)
14 #include "arithmetique.h"
16 #include "contrainte.h"
21 extern int slx_error();
22 extern char * slx_text;
23 extern Psysteme ps_yacc;
26 extern Value fac; /* facteur multiplicatif suivant qu'on analyse un terme*/
27 /* introduit par un moins (-1) ou par un plus (1) */
28 extern int sens; /* indique le sens de l'inegalite
29 sens = -1 ==> l'operateur est soit > ,soit >=,
30 sens = 1 ==> l'operateur est soit <, soit <= */
31 extern short int cote; /* booleen indiquant quel membre est en cours d'analyse*/
32 extern Value b1, b2; /* element du vecteur colonne du systeme donne
33 par l'analyse d'une contrainte */
34 extern Pcontrainte eq; /* pointeur sur l'egalite ou l'inegalite courante */
35 extern Pvecteur cp ; /* pointeur sur le membre courant */
36 extern short int operat; /* dernier operateur rencontre */
38 extern Pcontrainte p_eg_fin;
39 extern Pcontrainte p_ineg_fin;
40 extern Pvecteur p_pred;
41 extern Pvecteur p_membre_courant;
42 Psyslist sl_yacc; Pbase ba_yacc; Variable va_yacc;
44 /*code des operateurs de comparaison */
56 %token ACCFERM /* accolade fermante */ 1
57 %token ACCOUVR /* accolade ouvrante */ 2
58 %token CONSTANTE /* constante entiere sans signe a recuperer dans yytext */ 3
59 %token EGAL /* signe == */ 4
60 %token IDENT /* identificateur de variable a recuperer dans yytext */ 5
61 %token INF /* signe < */ 6
62 %token INFEGAL /* signe <= */ 7
63 %token MOINS /* signe - */ 8
64 %token PLUS /* signe + */ 9
65 %token SUP /* signe > */ 10
66 %token SUPEGAL /* signe >= */ 11
67 %token VAR /* mot reserve VAR introduisant la liste de variables */ 12
68 %token VIRG /* signe , */ 13
77 s_list : inisl defvar l_sys endsl
81 { /* Initialisation de la liste des systemes */
88 { /* Fin de la list des systemes */
89 vect_rm( (Pvecteur) ba_yacc ); ba_yacc = NULL;
102 if(!base_contains_variable_p(ba_yacc, (Variable) slx_text))
103 ba_yacc = vect_add_variable(ba_yacc, (Variable) strdup(slx_text));
111 system : inisys ACCOUVR l_eq virg_opt ACCFERM endsys
115 { /* initialisation des parametres de la liste de systemes */
116 /* et initialisation des variables */
124 /* on rajoute le systeme trouve a la liste */
125 if (ps_yacc != NULL) {
126 ps_yacc->base = NULL;
127 sc_creer_base( ps_yacc );
129 sl_yacc = sl_append_system_first( sl_yacc, ps_yacc );
139 eq : debeq multi_membre op membre fin_mult_membre feq
151 eq = contrainte_new();
162 | { fac = VALUE_ONE;} terme
171 /* ajout du couple (ident,const) a la contrainte courante */
172 vect_add_elem(&(eq->vecteur), (Variable) $2,value_mult(fac,$1));
173 /* duplication du couple (ident,const) de la combinaison lineaire
175 if (operat) vect_add_elem(&cp,(Variable) $2,
176 value_uminus(value_mult(fac,$1)));
180 Value v = value_mult(fac,$1);
183 value_addto(b1,v); value_substract(b2,v);
187 value_addto(b2,v); value_substract(b1,v);
192 if (cote==DROIT) value_oppose(fac);
194 /* ajout du couple (ident,1) a la contrainte courante */
195 vect_add_elem (&(eq->vecteur),(Variable) $1,fac);
196 /* duplication du couple (ident,1) de la combinaison lineaire traitee */
197 if (operat) vect_add_elem(&cp,(Variable) $1,value_uminus(fac));
203 va_yacc = base_find_variable_name(ba_yacc,
205 variable_default_name);
206 if(VARIABLE_UNDEFINED_P(va_yacc)) {
207 (void) fprintf(stderr,
208 "Variable %s not declared. Add it to the VAR list!\n",
209 variable_default_name((Variable) slx_text));
217 { sscan_Value(slx_text, &valcst);
266 { fac = VALUE_MONE; }
269 multi_membre : membre
270 | multi_membre op membre fin_mult_membre
275 vect_add_elem(&(eq->vecteur),TCST,value_uminus(b1));
278 creer_ineg(ps_yacc,eq,sens);
279 vect_add_elem(&(eq->vecteur),TCST,VALUE_ONE);
282 creer_ineg(ps_yacc,eq,sens);
285 creer_ineg(ps_yacc,eq,sens);
288 creer_ineg(ps_yacc,eq,sens);
289 vect_add_elem (&(eq->vecteur),TCST,VALUE_ONE);
292 creer_eg(ps_yacc,eq);
296 eq = contrainte_new();
308 int slx_error(char * s)
310 /* procedure minimum de recouvrement d'erreurs */
312 (void) fprintf(stderr, "%s near %s\n",s, slx_text);
313 while ((c = getchar()) != EOF) putchar(c);