2
/* inclusions, d�finition */
11
int yyerror(char * msg);
14
int i, d; /* integer numerator, denominator */
25
#define YYSTYPE yystype
27
/* variables globales */
62
result.cq->constante($2.s);
63
result.cq->valeur($2.r);
72
cste : /* rien */ {$$.s = ""; $$.r = -1.0; /* valeur n�gative : non d�fini */}
73
| SpcLpar cste1 Rpar {$$ = $2;}
76
cste1 : spc01 nombre volt{$$.s = ""; $$.r = $2.r;}
77
| spc01 id spc01 Egal spc01 nombre volt{$$.s = $2.s; $$.r = $6.r;}
80
nombre : Real {$$.r=$1.r;}
81
| Int {$$.r=1.0*$1.i;}
82
| Plus spc01 Real{$$.r=$3.r;}
83
| Moins spc01 Real{$$.r=-$3.r;}
84
| Plus spc01 Int{$$.r=1.0*$3.i;}
85
| Moins spc01 Int{$$.r=-1.0*$3.i;}
89
| spc01 Atome {if ($2.s != std::string("V")) yyerror ("only 'V' allowed as unit"); }
92
id : Atome {/* $$.s contient le nom */}
95
chemeq : membre Spc Fleche spc01 membre{
96
$$.cq = new Chemeq($1.mb,$5.mb);
100
membre : membre SpcPlus spc01 molecs {
101
$$.mb->push_back($4.m);
105
$$.mb->push_back($1.m);
109
molecs : Int spc01 molec {
115
$$.m->nombre($1.i,$1.d);
126
molec : composition0 typage{
127
$$.m = new Molec($1.al,0); $$.m->typage($2.t);
129
| composition0 charge typage{
130
$$.m = new Molec($1.al,$2.i);$$.m->typage($3.t);
135
composition0 : composition {$$.al=$1.al;}
136
| Lsq spc01 composition spc01 Rsq {$$.al=$3.al; $$.al->sq(1);}
139
typage : /* rien */ {$$.t = aqueous;}
140
| Aqueous {$$.t = aqueous;}
145
charge : Plus {$$.i=1;}
146
| Haut Plus {$$.i=1;}
147
| Haut Charge {$$.i=$2.i;}
149
| Haut Moins{$$.i=-1;}
152
groupe : Lpar composition Rpar {
157
atome_general : groupe {
158
$$.al = new AtomeListe("",0,0,$1.al);
162
if ($1.i==-2) { /* ce n'est pas un atome recens� */
163
sprintf(buffer,"nonexistent atom : %s", $1.symb);
166
$$.al = new AtomeListe($1.symb,$1.i);
170
composition : atome_general molecularite composition {
172
$$.al->setmolecularite($2.i);
173
$$.al->setsuivant($3.al);
175
| atome_general molecularite{
177
$$.al->setmolecularite($2.i);
181
molecularite : /*rien*/{
190
#include "chemlex.cc"
195
return lexer.yylex();
198
/* le programme lui-m�me */
200
inline int yyerror(char * msg){
201
fprintf(stderr, "ERROR %s at %d\n ", msg, position);
206
std::cout << "Usage : chemeq [-m] [-l] [-c] [-w] [-n] [-h]" << std::endl;
207
std::cout << " default is equivalent to 'chemeq -mlcwn'" << std::endl;
208
std::cout << " chemeq reads its standard input which must be a standard" << std::endl;
209
std::cout << " chemical equation. It outputs many strings useful for chemical" << std::endl;
210
std::cout << " calculations." << std::endl;
211
std::cout << " As an example you can try the following command :" << std::endl;
212
std::cout << " echo \"Fes -> Fe^2+ + 2 e- (0.44 V)\" | chemeq" << std::endl;
215
int main(int argc, char * argv[]){
216
char * optstr = "mMlcwnh";
220
if (argc>1 && !strcmp(argv[1],"-h")){
221
printHelp(); return 0;
225
while (-1 != (ch=getopt(argc,argv,optstr))){
227
case 'm': nooption=0;
228
result.cq->printnorm(std::cout); std::cout << std::endl;
230
case 'M': nooption=0;
231
result.cq->printweight(std::cout);
232
std::cout << std::endl;
234
case 'l': nooption=0;
235
std::cout << *result.cq << std::endl;
237
case 'c': nooption=0;
238
std::cout << result.cq->equilibre() << std::endl;
240
case 'w': nooption=0;
241
result.cq->printNernst(std::cout); std::cout << std::endl;
243
case 'n': nooption=0;
244
result.cq->normalise();
245
result.cq->printnorm(std::cout); std::cout << std::endl;
253
result.cq->printnorm(std::cout); std::cout << std::endl;
254
std::cout << *result.cq << std::endl;
255
std::cout << result.cq->equilibre() << std::endl;
256
result.cq->printNernst(std::cout); std::cout << std::endl;
257
result.cq->normalise();
258
result.cq->printnorm(std::cout); std::cout << std::endl;
261
else { /* ce n'est pas une �quation */
262
while (-1 != (ch=getopt(argc,argv,optstr))){
264
case 'M': nooption=0;
265
std::cout << result.m->weight();
266
std::cout << std::endl;
271
std::cout << *result.m;