4 #include <ExprIntrp_yaccintrf.hxx>
5 #include <ExprIntrp_yaccanal.hxx>
6 #include <Expr_GeneralExpression.hxx>
7 #include <Expr_NamedExpression.hxx>
8 #include <Expr_NamedUnknown.hxx>
9 #include <Expr_NamedConstant.hxx>
10 #include <Expr_NamedFunction.hxx>
11 #include <Expr_NumericValue.hxx>
12 #include <Expr_UnaryFunction.hxx>
13 #include <Expr_BinaryFunction.hxx>
14 #include <Expr_PolyFunction.hxx>
15 #include <Expr_Exponentiate.hxx>
16 #include <Expr_Absolute.hxx>
17 #include <Expr_ArcCosine.hxx>
18 #include <Expr_ArcSine.hxx>
19 #include <Expr_ArcTangent.hxx>
20 #include <Expr_ArgCosh.hxx>
21 #include <Expr_ArgSinh.hxx>
22 #include <Expr_ArgTanh.hxx>
23 #include <Expr_Cosh.hxx>
24 #include <Expr_Cosine.hxx>
25 #include <Expr_Exponential.hxx>
26 #include <Expr_LogOf10.hxx>
27 #include <Expr_LogOfe.hxx>
28 #include <Expr_Sign.hxx>
29 #include <Expr_Sine.hxx>
30 #include <Expr_Sinh.hxx>
31 #include <Expr_SquareRoot.hxx>
32 #include <Expr_Tangent.hxx>
33 #include <Expr_Tanh.hxx>
34 #include <Expr_Equal.hxx>
35 #include <Expr_SystemRelation.hxx>
36 #include <Expr_UnknownIterator.hxx>
37 #include <Expr_FunctionDerivative.hxx>
38 #include <Expr.hxx> // ATTENTION POUR PROTECTION BUG STACK
40 #include <Expr_SequenceOfGeneralExpression.hxx>
41 #include <Expr_Operators.hxx>
42 #include <ExprIntrp_SyntaxError.hxx>
43 #include <Expr_Array1OfNamedUnknown.hxx>
44 #include <Expr_Array1OfGeneralExpression.hxx>
51 static char ExprIntrp_assname[30];
52 TCollection_AsciiString ExprIntrp_funcdefname;
53 static Standard_Integer ExprIntrp_nbargs;
54 static Standard_Integer ExprIntrp_nbdiff;
57 extern "C" void ExprIntrp_StartFunction()
61 nbcar = ExprIntrp_GetResult(funcname);
62 TCollection_AsciiString name(funcname);
63 ExprIntrp_Recept.PushName(name);
67 extern "C" void ExprIntrp_StartDerivate()
71 nbcar = ExprIntrp_GetResult(funcname);
72 TCollection_AsciiString name(funcname);
73 ExprIntrp_Recept.PushName(name);
76 extern "C" void ExprIntrp_EndDerivate()
79 degree = ExprIntrp_GetDegree();
80 ExprIntrp_Recept.PushValue(degree);
83 extern "C" void ExprIntrp_Derivation()
85 ExprIntrp_Recept.PushValue(1);
87 ExprIntrp_GetResult(name);
88 TCollection_AsciiString thename(name);
89 Handle(Expr_NamedExpression) namexp = ExprIntrp_Recept.GetNamed(thename);
90 if (namexp.IsNull()) {
91 namexp = new Expr_NamedUnknown(thename);
93 if (!namexp->IsKind(STANDARD_TYPE(Expr_NamedUnknown))) {
94 ExprIntrp_SyntaxError::Raise();
96 ExprIntrp_Recept.Push(namexp);
99 extern "C" void ExprIntrp_DerivationValue()
103 nbcar = ExprIntrp_GetResult(num);
104 Standard_Integer degree = ExprIntrp_Recept.PopValue();
106 ExprIntrp_Recept.PushValue(degree);
109 extern "C" void ExprIntrp_EndDerivation()
111 Standard_Integer degree = ExprIntrp_Recept.PopValue();
112 Handle(Expr_NamedUnknown) var = Handle(Expr_NamedUnknown)::DownCast(ExprIntrp_Recept.Pop());
113 Handle(Expr_GeneralExpression) exp = ExprIntrp_Recept.Pop();
114 exp = exp->NDerivative(var,degree);
115 ExprIntrp_Recept.Push(exp);
118 extern "C" void ExprIntrp_StartDifferential()
120 ExprIntrp_StartDerivate();
121 ExprIntrp_nbdiff = 0;
124 extern "C" void ExprIntrp_DiffDegreeVar()
127 ExprIntrp_GetResult(name);
129 if (strncasecmp(name,"X",1)) {
131 if ( name[ 0 ] != 'X' && name[ 0 ] != 'x' ) {
133 ExprIntrp_SyntaxError::Raise();
137 Standard_Integer rank = atoi(s);
138 ExprIntrp_Recept.PushValue(rank);
142 extern "C" void ExprIntrp_DiffVar()
144 ExprIntrp_Recept.PushValue(1);
145 ExprIntrp_DiffDegreeVar();
148 extern "C" void ExprIntrp_DiffDegree()
151 ExprIntrp_GetResult(name);
152 Standard_Integer deg = atoi(name);
153 ExprIntrp_Recept.PushValue(deg);
156 extern "C" void ExprIntrp_VerDiffDegree()
159 ExprIntrp_GetResult(name);
160 Standard_Integer deg = atoi(name);
161 Standard_Integer thedeg = ExprIntrp_Recept.PopValue();
163 ExprIntrp_SyntaxError::Raise();
165 ExprIntrp_Recept.PushValue(deg);
168 extern "C" void ExprIntrp_EndDifferential()
170 TCollection_AsciiString name = ExprIntrp_Recept.PopName();
171 Handle(Expr_GeneralFunction) thefunc = ExprIntrp_Recept.GetFunction(name);
172 if (thefunc.IsNull()) {
173 ExprIntrp_SyntaxError::Raise();
175 Standard_Integer rank,degree;
176 Handle(Expr_NamedUnknown) thediff;
177 Standard_Integer nbvars = thefunc->NbOfVariables();
179 for (Standard_Integer i=1; i<= ExprIntrp_nbdiff; i++) {
180 rank = ExprIntrp_Recept.PopValue();
181 degree = ExprIntrp_Recept.PopValue();
182 if ((rank > nbvars) || (rank < 1)) {
183 ExprIntrp_SyntaxError::Raise();
185 thediff = thefunc->Variable(rank);
186 thefunc = new Expr_FunctionDerivative(thefunc,thediff,degree);
188 ExprIntrp_Recept.PushFunction(thefunc);
191 extern "C" void ExprIntrp_EndDiffFunction()
193 Handle(Expr_GeneralFunction) thefunc = ExprIntrp_Recept.PopFunction();
194 if (thefunc.IsNull()) {
195 ExprIntrp_SyntaxError::Raise();
197 Standard_Integer nbargs = thefunc->NbOfVariables();
199 Handle(Expr_GeneralExpression) op = ExprIntrp_Recept.Pop();
200 Handle(Expr_UnaryFunction) res =
201 new Expr_UnaryFunction(thefunc,op);
202 ExprIntrp_Recept.Push(res);
204 else if (nbargs == 2) {
205 Handle(Expr_GeneralExpression) arg2 = ExprIntrp_Recept.Pop();
206 Handle(Expr_GeneralExpression) arg1 = ExprIntrp_Recept.Pop();
208 ExprIntrp_SyntaxError::Raise();
210 Handle(Expr_BinaryFunction) res =
211 new Expr_BinaryFunction(thefunc,arg1,arg2);
212 ExprIntrp_Recept.Push(res);
215 Expr_Array1OfGeneralExpression tabarg(1,nbargs);
216 Handle(Expr_GeneralExpression) arg;
217 for (Standard_Integer i = 1; i<= nbargs; i++) {
218 arg = ExprIntrp_Recept.Pop();
220 ExprIntrp_SyntaxError::Raise();
222 tabarg(nbargs-i+1) = arg;
224 Handle(Expr_PolyFunction) res =
225 new Expr_PolyFunction(thefunc,tabarg);
226 ExprIntrp_Recept.Push(res);
230 static Handle(Expr_GeneralExpression) ExprIntrp_StandardFunction(const TCollection_AsciiString& name, const Handle(Expr_GeneralExpression)& op)
232 // return standard functions equivalent corresponding to <name>
233 // with given operand <op> if exists. Returns null value if not.
234 // <name> is not case sensitive
236 Handle(Expr_GeneralExpression) res;
237 if ((name == "abs") || (name == "Abs")) {
238 res = new Expr_Absolute(op);
240 else if ((name == "acos") || (name == "ACos")) {
241 res = new Expr_ArcCosine(op);
243 else if ((name == "asin") || (name == "ASin")) {
244 res = new Expr_ArcSine(op);
246 else if ((name == "atan") || (name == "ATan")) {
247 res = new Expr_ArcTangent(op);
249 else if ((name == "acosh") || (name == "ACosh")) {
250 res = new Expr_ArgCosh(op);
252 else if ((name == "asinh") || (name == "ASinh")) {
253 res = new Expr_ArgSinh(op);
255 else if ((name == "atanh") || (name == "ATanh")) {
256 res = new Expr_ArgTanh(op);
258 else if ((name == "cosh") || (name == "Cosh")) {
259 res = new Expr_Cosh(op);
261 else if ((name == "cos") || (name == "Cos")) {
262 res = new Expr_Cosine(op);
264 else if ((name == "exp") || (name == "Exp")) {
265 res = new Expr_Exponential(op);
267 else if (name == "log") {
268 res = new Expr_LogOf10(op);
270 else if ((name == "Log") || (name == "Ln")) {
271 res = new Expr_LogOfe(op);
273 else if ((name == "sign") || (name == "Sign")) {
274 res = new Expr_Sign(op);
276 else if ((name == "sin") || (name == "Sin")) {
277 res = new Expr_Sine(op);
279 else if ((name == "sinh") || (name == "Sinh")) {
280 res = new Expr_Sinh(op);
282 else if ((name == "sqrt") || (name == "Sqrt")) {
283 res = new Expr_SquareRoot(op);
285 else if ((name == "tan") || (name == "Tan")) {
286 res = new Expr_Tangent(op);
288 else if ((name == "tanh") || (name == "Tanh")) {
289 res = new Expr_Tanh(op);
295 extern "C" void ExprIntrp_EndDerFunction()
297 TCollection_AsciiString name = ExprIntrp_Recept.PopName();
298 Handle(Expr_GeneralExpression) op = ExprIntrp_Recept.Pop();
299 Handle(Expr_GeneralExpression) resstand = ExprIntrp_StandardFunction(name,op);
301 if (!resstand.IsNull()) {
302 Handle(Expr_NamedUnknown) var;
303 Expr_UnknownIterator rit(resstand);
306 ExprIntrp_SyntaxError::Raise();
310 if (var->IsAssigned()) {
317 ExprIntrp_SyntaxError::Raise();
320 Handle(Expr_GeneralExpression) res = resstand->NDerivative(var,ExprIntrp_Recept.PopValue());
321 ExprIntrp_Recept.Push(res);
325 Handle(Expr_NamedFunction) thefunc = ExprIntrp_Recept.GetFunction(name);
326 if (thefunc.IsNull()) {
327 ExprIntrp_SyntaxError::Raise();
329 Standard_Integer nbargs = thefunc->NbOfVariables();
331 ExprIntrp_SyntaxError::Raise();
333 Handle(Expr_NamedUnknown) var = thefunc->Variable(1);
334 Handle(Expr_FunctionDerivative) thefuncder =
335 new Expr_FunctionDerivative(thefunc,var,ExprIntrp_Recept.PopValue());
336 Handle(Expr_UnaryFunction) res =
337 new Expr_UnaryFunction(thefuncder,op);
338 ExprIntrp_Recept.Push(res);
342 extern "C" void ExprIntrp_EndFunction()
344 TCollection_AsciiString name = ExprIntrp_Recept.PopName();
345 Handle(Expr_GeneralExpression) op = ExprIntrp_Recept.Pop();
347 Handle(Expr_GeneralExpression) resstand = ExprIntrp_StandardFunction(name,op);
348 if (!resstand.IsNull()) {
349 ExprIntrp_Recept.Push(resstand->ShallowSimplified());
352 Handle(Expr_NamedFunction) thefunc = ExprIntrp_Recept.GetFunction(name);
353 if (thefunc.IsNull()) {
354 ExprIntrp_SyntaxError::Raise();
356 Standard_Integer nbargs = thefunc->NbOfVariables();
358 Handle(Expr_UnaryFunction) res =
359 new Expr_UnaryFunction(thefunc,op);
360 ExprIntrp_Recept.Push(res);
362 else if (nbargs == 2) {
363 Handle(Expr_GeneralExpression) arg1 = ExprIntrp_Recept.Pop();
365 ExprIntrp_SyntaxError::Raise();
367 Handle(Expr_BinaryFunction) res =
368 new Expr_BinaryFunction(thefunc,arg1,op);
369 ExprIntrp_Recept.Push(res);
372 Expr_Array1OfGeneralExpression tabarg(1,nbargs);
373 Handle(Expr_GeneralExpression) arg;
375 for (Standard_Integer i = 1; i< nbargs; i++) {
376 arg = ExprIntrp_Recept.Pop();
378 ExprIntrp_SyntaxError::Raise();
380 tabarg(nbargs-i) = arg;
382 Handle(Expr_PolyFunction) res =
383 new Expr_PolyFunction(thefunc,tabarg);
384 ExprIntrp_Recept.Push(res);
389 extern "C" void ExprIntrp_NextFuncArg()
394 extern "C" void ExprIntrp_EndFuncArg()
399 extern "C" void ExprIntrp_SumOperator()
401 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
402 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
403 Handle(Expr_Sum) sres = op1 + op2;
404 Handle(Expr_GeneralExpression) res = sres->ShallowSimplified();
405 ExprIntrp_Recept.Push(res);
408 extern "C" void ExprIntrp_MinusOperator()
410 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
411 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
412 Handle(Expr_Difference) res = op1 - op2;
413 ExprIntrp_Recept.Push(res->ShallowSimplified());
416 extern "C" void ExprIntrp_DivideOperator()
418 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
419 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
420 Handle(Expr_Division) res = op1 / op2;
421 ExprIntrp_Recept.Push(res->ShallowSimplified());
424 extern "C" void ExprIntrp_ExpOperator()
426 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
427 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
428 Handle(Expr_Exponentiate) res = new Expr_Exponentiate(op1,op2);
429 ExprIntrp_Recept.Push(res->ShallowSimplified());
432 extern "C" void ExprIntrp_ProductOperator()
434 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
435 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
436 Handle(Expr_Product) res = op1 * op2;
437 ExprIntrp_Recept.Push(res->ShallowSimplified());
440 extern "C" void ExprIntrp_UnaryMinusOperator()
442 Handle(Expr_GeneralExpression) op = ExprIntrp_Recept.Pop();
443 Handle(Expr_UnaryMinus) res = new Expr_UnaryMinus(op);
444 ExprIntrp_Recept.Push(res->ShallowSimplified());
447 extern "C" void ExprIntrp_VariableIdentifier()
451 nbcar = ExprIntrp_GetResult(name);
452 TCollection_AsciiString thename(name);
453 Handle(Expr_NamedExpression) nameexp = ExprIntrp_Recept.GetNamed(thename);
454 if (nameexp.IsNull()) {
455 nameexp = new Expr_NamedUnknown(thename);
456 ExprIntrp_Recept.Use(nameexp);
458 ExprIntrp_Recept.Push(nameexp);
461 extern "C" void ExprIntrp_NumValue()
465 nbcar = ExprIntrp_GetResult(num);
466 Standard_Real value = atof(num);
467 Handle(Expr_NumericValue) nval = new Expr_NumericValue(value);
468 ExprIntrp_Recept.Push(nval);
471 extern "C" void ExprIntrp_AssignVariable()
474 nbcar = ExprIntrp_GetResult(ExprIntrp_assname);
477 extern "C" void ExprIntrp_Deassign()
481 nbcar = ExprIntrp_GetResult(name);
482 TCollection_AsciiString thename(name);
483 Handle(Expr_NamedExpression) nameexp = ExprIntrp_Recept.GetNamed(thename);
484 if (nameexp.IsNull()) {
485 ExprIntrp_SyntaxError::Raise();
487 if (!nameexp->IsKind(STANDARD_TYPE(Expr_NamedUnknown))) {
488 ExprIntrp_SyntaxError::Raise();
490 Handle(Expr_NamedUnknown) var = Handle(Expr_NamedUnknown)::DownCast(nameexp);
494 extern "C" void ExprIntrp_DefineFunction()
496 ExprIntrp_funcdefname = ExprIntrp_Recept.PopName();
497 ExprIntrp_Recept.PushValue(ExprIntrp_nbargs);
500 extern "C" void ExprIntrp_close()
502 ExprIntrp_stop_string();
505 extern "C" void ExprIntrperror(char* msg)
508 ExprIntrp_SyntaxError::Raise(msg);
512 extern "C" void ExprIntrp_EndOfEqual()
514 Handle(Expr_GeneralExpression) memb2 = ExprIntrp_Recept.Pop();
515 Handle(Expr_GeneralExpression) memb1 = ExprIntrp_Recept.Pop();
516 Handle(Expr_Equal) res = new Expr_Equal(memb1,memb2);
517 ExprIntrp_Recept.PushRelation(res);
520 extern "C" void ExprIntrp_EndOfRelation()
522 Handle(Expr_SystemRelation) sys;
523 Handle(Expr_GeneralRelation) currel;
524 Handle(Expr_GeneralRelation) oldrel;
525 while (!ExprIntrp_Recept.IsRelStackEmpty()) {
526 currel = ExprIntrp_Recept.PopRelation();
530 else if (!oldrel.IsNull()) {
531 sys = new Expr_SystemRelation(oldrel);
539 ExprIntrp_Recept.PushRelation(currel);
542 ExprIntrp_Recept.PushRelation(sys);
546 extern "C" void ExprIntrp_EndOfAssign()
548 Handle(Expr_NamedExpression) namexp = ExprIntrp_Recept.GetNamed(ExprIntrp_assname);
549 Handle(Expr_NamedUnknown) namu;
550 if (namexp.IsNull()) {
551 namu = new Expr_NamedUnknown(ExprIntrp_assname);
552 ExprIntrp_Recept.Use(namu);
555 if (!namexp->IsKind(STANDARD_TYPE(Expr_NamedUnknown))) {
556 ExprIntrp_SyntaxError::Raise();
558 namu = Handle(Expr_NamedUnknown)::DownCast(namexp);
560 namu->Assign(ExprIntrp_Recept.Pop());
563 extern "C" void ExprIntrp_EndOfFuncDef()
565 Handle(Expr_GeneralExpression) theexp = ExprIntrp_Recept.Pop();
566 Standard_Integer nbargs = ExprIntrp_Recept.PopValue();
567 Expr_Array1OfNamedUnknown vars(1,nbargs);
568 Expr_Array1OfNamedUnknown internvars(1,nbargs);
570 for (i=nbargs; i > 0; i--) {
571 vars(i) = Handle(Expr_NamedUnknown)::DownCast(ExprIntrp_Recept.Pop());
572 internvars(i) = Handle(Expr_NamedUnknown)::DownCast(vars(i)->Copy());
574 theexp = Expr::CopyShare(theexp); // ATTENTION, PROTECTION BUG STACK
575 for (i=1; i<= nbargs; i++) {
576 if (theexp->Contains(vars(i))) {
577 theexp->Replace(vars(i),internvars(i));
580 if (theexp == vars(i)) {
581 theexp = internvars(i);
585 Handle(Expr_NamedFunction) thefunc =
586 new Expr_NamedFunction(ExprIntrp_funcdefname,
589 ExprIntrp_Recept.Use(thefunc);
592 extern "C" void ExprIntrp_ConstantIdentifier()
595 ExprIntrp_GetResult(name);
596 TCollection_AsciiString thename(name);
597 ExprIntrp_Recept.PushName(thename);
600 extern "C" void ExprIntrp_ConstantDefinition()
602 TCollection_AsciiString name = ExprIntrp_Recept.PopName();
605 nbcar = ExprIntrp_GetResult(num);
606 Standard_Real val = atof(num);
607 Handle(Expr_NamedConstant) theconst = new Expr_NamedConstant(name,val);
608 ExprIntrp_Recept.Use(theconst);
609 ExprIntrp_Recept.Push(theconst);
613 extern "C" void ExprIntrp_Sumator()
615 Handle(Expr_NumericValue) number = Handle(Expr_NumericValue)::DownCast(ExprIntrp_Recept.Pop());
616 Standard_Integer nb = (Standard_Integer) number->GetValue();
617 Handle(Expr_GeneralExpression) inc = ExprIntrp_Recept.Pop();
618 Handle(Expr_GeneralExpression) first = ExprIntrp_Recept.Pop();
619 Handle(Expr_NamedUnknown) var = Handle(Expr_NamedUnknown)::DownCast(ExprIntrp_Recept.Pop());
620 Handle(Expr_GeneralExpression) theexp = ExprIntrp_Recept.Pop();
621 Standard_Boolean thesame = (theexp == var);
622 Handle(Expr_GeneralExpression) cur = Expr::CopyShare(first);
623 Handle(Expr_GeneralExpression) res;
624 Handle(Expr_GeneralExpression) member;
625 Expr_SequenceOfGeneralExpression seq;
626 for (Standard_Integer i=1; i<= nb; i++) {
631 member = Expr::CopyShare(theexp);
632 member->Replace(var,cur);
635 cur = (cur + inc)->ShallowSimplified();
637 res = new Expr_Sum(seq);
638 ExprIntrp_Recept.Push(res->ShallowSimplified());
641 extern "C" void ExprIntrp_Productor()
643 Handle(Expr_NumericValue) number = Handle(Expr_NumericValue)::DownCast(ExprIntrp_Recept.Pop());
644 Standard_Integer nb = (Standard_Integer) number->GetValue();
645 Handle(Expr_GeneralExpression) inc = ExprIntrp_Recept.Pop();
646 Handle(Expr_GeneralExpression) first = ExprIntrp_Recept.Pop();
647 Handle(Expr_NamedUnknown) var = Handle(Expr_NamedUnknown)::DownCast(ExprIntrp_Recept.Pop());
648 Handle(Expr_GeneralExpression) theexp = ExprIntrp_Recept.Pop();
649 Standard_Boolean thesame = (theexp == var);
650 Handle(Expr_GeneralExpression) cur = Expr::CopyShare(first);
651 Handle(Expr_GeneralExpression) res;
652 Handle(Expr_GeneralExpression) member;
653 Expr_SequenceOfGeneralExpression seq;
654 for (Standard_Integer i=1; i<= nb; i++) {
659 member = Expr::CopyShare(theexp);
660 member->Replace(var,cur);
663 cur = (cur + inc)->ShallowSimplified();
665 res = new Expr_Product(seq);
666 ExprIntrp_Recept.Push(res->ShallowSimplified());