3 $Id: sc_gram.y 1647 2016-07-01 11:57:57Z coelho $
5 Copyright 1989-2016 MINES ParisTech
7 This file is part of Linear/C3 Library.
9 Linear/C3 Library is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Lesser General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
14 Linear/C3 Library is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU Lesser General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public License
21 along with Linear/C3 Library. If not, see <http://www.gnu.org/licenses/>.
33 #include "arithmetique.h"
35 #include "contrainte.h"
38 extern int syst_error(char*);
39 extern int syst_lex(void);
41 bool syst_syntax_error;
45 Value fac; /* facteur multiplicatif suivant qu'on analyse un terme*/
46 /* introduit par un moins (-1) ou par un plus (1) */
48 int sens; /* indique le sens de l'inegalite
49 sens = -1 ==> l'operateur est soit > ,soit >=,
50 sens = 1 ==> l'operateur est soit <, soit <= */
51 short int cote; /* booleen indiquant quel membre est en cours d'analyse*/
53 Value b1, b2; /* element du vecteur colonne du systeme donne par l'analyse*/
54 /* d'une contrainte */
56 Pcontrainte eq; /* pointeur sur l'egalite ou l'inegalite
59 extern Pvecteur cp ; /* pointeur sur le membre courant */
61 short int operat; /* dernier operateur rencontre */
64 /*code des operateurs de comparaison */
81 /* explicit types: Value may be larger than a pointer (e.g. long long)
84 %type <Variable> ident
86 %token ACCFERM /* accolade fermante */
87 %token ACCOUVR /* accolade ouvrante */
88 %term <Value> CONSTANTE /* constante entiere sans signe */
89 %token EGAL /* signe == */
90 %term <Variable> IDENT /* identificateur de variable */
91 %token INF /* signe < */
92 %token INFEGAL /* signe <= */
93 %token MOINS /* signe - */
94 %token PLUS /* signe + */
95 %token SUP /* signe > */
96 %token SUPEGAL /* signe >= */
97 %token VAR /* mot reserve VAR introduisant la liste de variables */
98 %token VIRG /* signe , */
102 system : inisys defvar ACCOUVR l_eq virg_opt ACCFERM
106 { /* initialisation des parametres du systeme */
107 /* et initialisation des variables */
110 syst_syntax_error = false;
115 { /* remise en ordre des vecteurs de base */
118 ps_yacc->base = base_reversal(b);
124 | l_var virg_opt newid
132 eq : debeq multi_membre op membre fin_mult_membre feq
144 eq = contrainte_new();
155 | { fac = VALUE_ONE;} terme
161 if (cote==DROIT) fac = value_uminus(fac);
162 /* ajout du couple (ident,const) a la contrainte courante */
163 vect_add_elem(&(eq->vecteur),$2,value_mult(fac,$1));
164 /* duplication du couple (ident,const)
165 de la combinaison lineaire traitee */
167 vect_add_elem(&cp,(Variable) $2,
168 value_uminus(value_mult(fac,$1)));
172 Value p = value_mult(fac,$1);
175 value_substract(b2, p);
177 value_substract(b1, p);
183 if (cote==DROIT) fac = value_uminus(fac);
184 /* ajout du couple (ident,1) a la contrainte courante */
185 vect_add_elem (&(eq->vecteur),(Variable) $1,fac);
186 /* duplication du couple (ident,1) de la
187 combinaison lineaire traitee */
189 vect_add_elem(&cp,(Variable) $1,value_uminus(fac));
193 ident : IDENT { $$ = rec_ident(ps_yacc, $1); }
196 newid : IDENT { new_ident(ps_yacc,$1); }
199 /* I'm pessimistic for long long here...
200 * should rather return a pointer to a Value stored somewhere...
244 { fac = VALUE_MONE; }
247 multi_membre : membre
248 | multi_membre op membre fin_mult_membre
253 vect_add_elem(&(eq->vecteur),TCST,value_uminus(b1));
257 creer_ineg(ps_yacc,eq,sens);
258 vect_add_elem(&(eq->vecteur),TCST,VALUE_ONE);
261 creer_ineg(ps_yacc,eq,sens);
264 creer_ineg(ps_yacc,eq,sens);
267 creer_ineg(ps_yacc,eq,sens);
268 vect_add_elem (&(eq->vecteur),TCST,VALUE_ONE);
271 creer_eg(ps_yacc,eq);
275 eq = contrainte_new();