1 //static const char* sccsid = "@(#)ExprIntrp_yaccintrf.cxx 3.2 95/01/10"; // Do not delete this line. Used by sccs.
6 #include <ExprIntrp_yaccintrf.hxx>
7 #include <ExprIntrp_yaccanal.hxx>
8 #include <Expr_GeneralExpression.hxx>
9 #include <Expr_NamedExpression.hxx>
10 #include <Expr_NamedUnknown.hxx>
11 #include <Expr_NamedConstant.hxx>
12 #include <Expr_NamedFunction.hxx>
13 #include <Expr_NumericValue.hxx>
14 #include <Expr_UnaryFunction.hxx>
15 #include <Expr_BinaryFunction.hxx>
16 #include <Expr_PolyFunction.hxx>
17 #include <Expr_Exponentiate.hxx>
18 #include <Expr_Absolute.hxx>
19 #include <Expr_ArcCosine.hxx>
20 #include <Expr_ArcSine.hxx>
21 #include <Expr_ArcTangent.hxx>
22 #include <Expr_ArgCosh.hxx>
23 #include <Expr_ArgSinh.hxx>
24 #include <Expr_ArgTanh.hxx>
25 #include <Expr_Cosh.hxx>
26 #include <Expr_Cosine.hxx>
27 #include <Expr_Exponential.hxx>
28 #include <Expr_LogOf10.hxx>
29 #include <Expr_LogOfe.hxx>
30 #include <Expr_Sign.hxx>
31 #include <Expr_Sine.hxx>
32 #include <Expr_Sinh.hxx>
33 #include <Expr_SquareRoot.hxx>
34 #include <Expr_Tangent.hxx>
35 #include <Expr_Tanh.hxx>
36 #include <Expr_Equal.hxx>
37 #include <Expr_SystemRelation.hxx>
38 #include <Expr_UnknownIterator.hxx>
39 #include <Expr_FunctionDerivative.hxx>
40 #include <Expr.hxx> // ATTENTION POUR PROTECTION BUG STACK
42 #include <Expr_SequenceOfGeneralExpression.hxx>
43 #include <Expr_Operators.hxx>
44 #include <ExprIntrp_SyntaxError.hxx>
45 #include <Expr_Array1OfNamedUnknown.hxx>
46 #include <Expr_Array1OfGeneralExpression.hxx>
53 static char ExprIntrp_assname[30];
54 TCollection_AsciiString ExprIntrp_funcdefname;
55 static Standard_Integer ExprIntrp_nbargs;
56 static Standard_Integer ExprIntrp_nbdiff;
59 extern "C" void ExprIntrp_StartFunction()
63 nbcar = ExprIntrp_GetResult(funcname);
64 TCollection_AsciiString name(funcname);
65 ExprIntrp_Recept.PushName(name);
69 extern "C" void ExprIntrp_StartDerivate()
73 nbcar = ExprIntrp_GetResult(funcname);
74 TCollection_AsciiString name(funcname);
75 ExprIntrp_Recept.PushName(name);
78 extern "C" void ExprIntrp_EndDerivate()
81 degree = ExprIntrp_GetDegree();
82 ExprIntrp_Recept.PushValue(degree);
85 extern "C" void ExprIntrp_Derivation()
87 ExprIntrp_Recept.PushValue(1);
90 Standard_Integer nbcar =
92 ExprIntrp_GetResult(name);
93 TCollection_AsciiString thename(name);
94 Handle(Expr_NamedExpression) namexp = ExprIntrp_Recept.GetNamed(thename);
95 if (namexp.IsNull()) {
96 namexp = new Expr_NamedUnknown(thename);
98 if (!namexp->IsKind(STANDARD_TYPE(Expr_NamedUnknown))) {
99 ExprIntrp_SyntaxError::Raise();
101 ExprIntrp_Recept.Push(namexp);
104 extern "C" void ExprIntrp_DerivationValue()
108 nbcar = ExprIntrp_GetResult(num);
109 Standard_Integer degree = ExprIntrp_Recept.PopValue();
111 ExprIntrp_Recept.PushValue(degree);
114 extern "C" void ExprIntrp_EndDerivation()
116 Standard_Integer degree = ExprIntrp_Recept.PopValue();
117 Handle(Expr_NamedUnknown) var = Handle(Expr_NamedUnknown)::DownCast(ExprIntrp_Recept.Pop());
118 Handle(Expr_GeneralExpression) exp = ExprIntrp_Recept.Pop();
119 exp = exp->NDerivative(var,degree);
120 ExprIntrp_Recept.Push(exp);
123 extern "C" void ExprIntrp_StartDifferential()
125 ExprIntrp_StartDerivate();
126 ExprIntrp_nbdiff = 0;
129 extern "C" void ExprIntrp_DiffDegreeVar()
133 Standard_Integer nbcar =
135 ExprIntrp_GetResult(name);
137 if (strncasecmp(name,"X",1)) {
139 if ( name[ 0 ] != 'X' && name[ 0 ] != 'x' ) {
141 ExprIntrp_SyntaxError::Raise();
145 Standard_Integer rank = atoi(s);
146 ExprIntrp_Recept.PushValue(rank);
150 extern "C" void ExprIntrp_DiffVar()
152 ExprIntrp_Recept.PushValue(1);
153 ExprIntrp_DiffDegreeVar();
156 extern "C" void ExprIntrp_DiffDegree()
160 Standard_Integer nbcar =
162 ExprIntrp_GetResult(name);
163 Standard_Integer deg = atoi(name);
164 ExprIntrp_Recept.PushValue(deg);
167 extern "C" void ExprIntrp_VerDiffDegree()
171 Standard_Integer nbcar =
173 ExprIntrp_GetResult(name);
174 Standard_Integer deg = atoi(name);
175 Standard_Integer thedeg = ExprIntrp_Recept.PopValue();
177 ExprIntrp_SyntaxError::Raise();
179 ExprIntrp_Recept.PushValue(deg);
182 extern "C" void ExprIntrp_EndDifferential()
184 TCollection_AsciiString name = ExprIntrp_Recept.PopName();
185 Handle(Expr_GeneralFunction) thefunc = ExprIntrp_Recept.GetFunction(name);
186 if (thefunc.IsNull()) {
187 ExprIntrp_SyntaxError::Raise();
189 Standard_Integer rank,degree;
190 Handle(Expr_NamedUnknown) thediff;
191 Standard_Integer nbvars = thefunc->NbOfVariables();
193 for (Standard_Integer i=1; i<= ExprIntrp_nbdiff; i++) {
194 rank = ExprIntrp_Recept.PopValue();
195 degree = ExprIntrp_Recept.PopValue();
196 if ((rank > nbvars) || (rank < 1)) {
197 ExprIntrp_SyntaxError::Raise();
199 thediff = thefunc->Variable(rank);
200 thefunc = new Expr_FunctionDerivative(thefunc,thediff,degree);
202 ExprIntrp_Recept.PushFunction(thefunc);
205 extern "C" void ExprIntrp_EndDiffFunction()
207 Handle(Expr_GeneralFunction) thefunc = ExprIntrp_Recept.PopFunction();
208 if (thefunc.IsNull()) {
209 ExprIntrp_SyntaxError::Raise();
211 Standard_Integer nbargs = thefunc->NbOfVariables();
213 Handle(Expr_GeneralExpression) op = ExprIntrp_Recept.Pop();
214 Handle(Expr_UnaryFunction) res =
215 new Expr_UnaryFunction(thefunc,op);
216 ExprIntrp_Recept.Push(res);
218 else if (nbargs == 2) {
219 Handle(Expr_GeneralExpression) arg2 = ExprIntrp_Recept.Pop();
220 Handle(Expr_GeneralExpression) arg1 = ExprIntrp_Recept.Pop();
222 ExprIntrp_SyntaxError::Raise();
224 Handle(Expr_BinaryFunction) res =
225 new Expr_BinaryFunction(thefunc,arg1,arg2);
226 ExprIntrp_Recept.Push(res);
229 Expr_Array1OfGeneralExpression tabarg(1,nbargs);
230 Handle(Expr_GeneralExpression) arg;
231 for (Standard_Integer i = 1; i<= nbargs; i++) {
232 arg = ExprIntrp_Recept.Pop();
234 ExprIntrp_SyntaxError::Raise();
236 tabarg(nbargs-i+1) = arg;
238 Handle(Expr_PolyFunction) res =
239 new Expr_PolyFunction(thefunc,tabarg);
240 ExprIntrp_Recept.Push(res);
244 static Handle(Expr_GeneralExpression) ExprIntrp_StandardFunction(const TCollection_AsciiString& name, const Handle(Expr_GeneralExpression)& op)
246 // return standard functions equivalent corresponding to <name>
247 // with given operand <op> if exists. Returns null value if not.
248 // <name> is not case sensitive
250 Handle(Expr_GeneralExpression) res;
251 if ((name == "abs") || (name == "Abs")) {
252 res = new Expr_Absolute(op);
254 else if ((name == "acos") || (name == "ACos")) {
255 res = new Expr_ArcCosine(op);
257 else if ((name == "asin") || (name == "ASin")) {
258 res = new Expr_ArcSine(op);
260 else if ((name == "atan") || (name == "ATan")) {
261 res = new Expr_ArcTangent(op);
263 else if ((name == "acosh") || (name == "ACosh")) {
264 res = new Expr_ArgCosh(op);
266 else if ((name == "asinh") || (name == "ASinh")) {
267 res = new Expr_ArgSinh(op);
269 else if ((name == "atanh") || (name == "ATanh")) {
270 res = new Expr_ArgTanh(op);
272 else if ((name == "cosh") || (name == "Cosh")) {
273 res = new Expr_Cosh(op);
275 else if ((name == "cos") || (name == "Cos")) {
276 res = new Expr_Cosine(op);
278 else if ((name == "exp") || (name == "Exp")) {
279 res = new Expr_Exponential(op);
281 else if (name == "log") {
282 res = new Expr_LogOf10(op);
284 else if ((name == "Log") || (name == "Ln")) {
285 res = new Expr_LogOfe(op);
287 else if ((name == "sign") || (name == "Sign")) {
288 res = new Expr_Sign(op);
290 else if ((name == "sin") || (name == "Sin")) {
291 res = new Expr_Sine(op);
293 else if ((name == "sinh") || (name == "Sinh")) {
294 res = new Expr_Sinh(op);
296 else if ((name == "sqrt") || (name == "Sqrt")) {
297 res = new Expr_SquareRoot(op);
299 else if ((name == "tan") || (name == "Tan")) {
300 res = new Expr_Tangent(op);
302 else if ((name == "tanh") || (name == "Tanh")) {
303 res = new Expr_Tanh(op);
309 extern "C" void ExprIntrp_EndDerFunction()
311 TCollection_AsciiString name = ExprIntrp_Recept.PopName();
312 Handle(Expr_GeneralExpression) op = ExprIntrp_Recept.Pop();
313 Handle(Expr_GeneralExpression) resstand = ExprIntrp_StandardFunction(name,op);
315 if (!resstand.IsNull()) {
316 Handle(Expr_NamedUnknown) var;
317 Expr_UnknownIterator rit(resstand);
320 ExprIntrp_SyntaxError::Raise();
324 if (var->IsAssigned()) {
331 ExprIntrp_SyntaxError::Raise();
334 Handle(Expr_GeneralExpression) res = resstand->NDerivative(var,ExprIntrp_Recept.PopValue());
335 ExprIntrp_Recept.Push(res);
339 Handle(Expr_NamedFunction) thefunc = ExprIntrp_Recept.GetFunction(name);
340 if (thefunc.IsNull()) {
341 ExprIntrp_SyntaxError::Raise();
343 Standard_Integer nbargs = thefunc->NbOfVariables();
345 ExprIntrp_SyntaxError::Raise();
347 Handle(Expr_NamedUnknown) var = thefunc->Variable(1);
348 Handle(Expr_FunctionDerivative) thefuncder =
349 new Expr_FunctionDerivative(thefunc,var,ExprIntrp_Recept.PopValue());
350 Handle(Expr_UnaryFunction) res =
351 new Expr_UnaryFunction(thefuncder,op);
352 ExprIntrp_Recept.Push(res);
356 extern "C" void ExprIntrp_EndFunction()
358 TCollection_AsciiString name = ExprIntrp_Recept.PopName();
359 Handle(Expr_GeneralExpression) op = ExprIntrp_Recept.Pop();
361 Handle(Expr_GeneralExpression) resstand = ExprIntrp_StandardFunction(name,op);
362 if (!resstand.IsNull()) {
363 ExprIntrp_Recept.Push(resstand->ShallowSimplified());
366 Handle(Expr_NamedFunction) thefunc = ExprIntrp_Recept.GetFunction(name);
367 if (thefunc.IsNull()) {
368 ExprIntrp_SyntaxError::Raise();
370 Standard_Integer nbargs = thefunc->NbOfVariables();
372 Handle(Expr_UnaryFunction) res =
373 new Expr_UnaryFunction(thefunc,op);
374 ExprIntrp_Recept.Push(res);
376 else if (nbargs == 2) {
377 Handle(Expr_GeneralExpression) arg1 = ExprIntrp_Recept.Pop();
379 ExprIntrp_SyntaxError::Raise();
381 Handle(Expr_BinaryFunction) res =
382 new Expr_BinaryFunction(thefunc,arg1,op);
383 ExprIntrp_Recept.Push(res);
386 Expr_Array1OfGeneralExpression tabarg(1,nbargs);
387 Handle(Expr_GeneralExpression) arg;
389 for (Standard_Integer i = 1; i< nbargs; i++) {
390 arg = ExprIntrp_Recept.Pop();
392 ExprIntrp_SyntaxError::Raise();
394 tabarg(nbargs-i) = arg;
396 Handle(Expr_PolyFunction) res =
397 new Expr_PolyFunction(thefunc,tabarg);
398 ExprIntrp_Recept.Push(res);
403 extern "C" void ExprIntrp_NextFuncArg()
408 extern "C" void ExprIntrp_EndFuncArg()
413 extern "C" void ExprIntrp_SumOperator()
415 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
416 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
417 Handle(Expr_Sum) sres = op1 + op2;
418 Handle(Expr_GeneralExpression) res = sres->ShallowSimplified();
419 ExprIntrp_Recept.Push(res);
422 extern "C" void ExprIntrp_MinusOperator()
424 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
425 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
426 Handle(Expr_Difference) res = op1 - op2;
427 ExprIntrp_Recept.Push(res->ShallowSimplified());
430 extern "C" void ExprIntrp_DivideOperator()
432 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
433 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
434 Handle(Expr_Division) res = op1 / op2;
435 ExprIntrp_Recept.Push(res->ShallowSimplified());
438 extern "C" void ExprIntrp_ExpOperator()
440 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
441 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
442 Handle(Expr_Exponentiate) res = new Expr_Exponentiate(op1,op2);
443 ExprIntrp_Recept.Push(res->ShallowSimplified());
446 extern "C" void ExprIntrp_ProductOperator()
448 Handle(Expr_GeneralExpression) op2 = ExprIntrp_Recept.Pop();
449 Handle(Expr_GeneralExpression) op1 = ExprIntrp_Recept.Pop();
450 Handle(Expr_Product) res = op1 * op2;
451 ExprIntrp_Recept.Push(res->ShallowSimplified());
454 extern "C" void ExprIntrp_UnaryMinusOperator()
456 Handle(Expr_GeneralExpression) op = ExprIntrp_Recept.Pop();
457 Handle(Expr_UnaryMinus) res = new Expr_UnaryMinus(op);
458 ExprIntrp_Recept.Push(res->ShallowSimplified());
461 extern "C" void ExprIntrp_VariableIdentifier()
465 nbcar = ExprIntrp_GetResult(name);
466 TCollection_AsciiString thename(name);
467 Handle(Expr_NamedExpression) nameexp = ExprIntrp_Recept.GetNamed(thename);
468 if (nameexp.IsNull()) {
469 nameexp = new Expr_NamedUnknown(thename);
470 ExprIntrp_Recept.Use(nameexp);
472 ExprIntrp_Recept.Push(nameexp);
475 extern "C" void ExprIntrp_NumValue()
479 nbcar = ExprIntrp_GetResult(num);
480 Standard_Real value = atof(num);
481 Handle(Expr_NumericValue) nval = new Expr_NumericValue(value);
482 ExprIntrp_Recept.Push(nval);
485 extern "C" void ExprIntrp_AssignVariable()
488 nbcar = ExprIntrp_GetResult(ExprIntrp_assname);
491 extern "C" void ExprIntrp_Deassign()
495 nbcar = ExprIntrp_GetResult(name);
496 TCollection_AsciiString thename(name);
497 Handle(Expr_NamedExpression) nameexp = ExprIntrp_Recept.GetNamed(thename);
498 if (nameexp.IsNull()) {
499 ExprIntrp_SyntaxError::Raise();
501 if (!nameexp->IsKind(STANDARD_TYPE(Expr_NamedUnknown))) {
502 ExprIntrp_SyntaxError::Raise();
504 Handle(Expr_NamedUnknown) var = Handle(Expr_NamedUnknown)::DownCast(nameexp);
508 extern "C" void ExprIntrp_DefineFunction()
510 ExprIntrp_funcdefname = ExprIntrp_Recept.PopName();
511 ExprIntrp_Recept.PushValue(ExprIntrp_nbargs);
514 extern "C" void ExprIntrp_close()
516 ExprIntrp_stop_string();
519 extern "C" void ExprIntrperror(char* msg)
522 ExprIntrp_SyntaxError::Raise(msg);
526 extern "C" void ExprIntrp_EndOfEqual()
528 Handle(Expr_GeneralExpression) memb2 = ExprIntrp_Recept.Pop();
529 Handle(Expr_GeneralExpression) memb1 = ExprIntrp_Recept.Pop();
530 Handle(Expr_Equal) res = new Expr_Equal(memb1,memb2);
531 ExprIntrp_Recept.PushRelation(res);
534 extern "C" void ExprIntrp_EndOfRelation()
536 Handle(Expr_SystemRelation) sys;
537 Handle(Expr_GeneralRelation) currel;
538 Handle(Expr_GeneralRelation) oldrel;
539 while (!ExprIntrp_Recept.IsRelStackEmpty()) {
540 currel = ExprIntrp_Recept.PopRelation();
544 else if (!oldrel.IsNull()) {
545 sys = new Expr_SystemRelation(oldrel);
553 ExprIntrp_Recept.PushRelation(currel);
556 ExprIntrp_Recept.PushRelation(sys);
560 extern "C" void ExprIntrp_EndOfAssign()
562 Handle(Expr_NamedExpression) namexp = ExprIntrp_Recept.GetNamed(ExprIntrp_assname);
563 Handle(Expr_NamedUnknown) namu;
564 if (namexp.IsNull()) {
565 namu = new Expr_NamedUnknown(ExprIntrp_assname);
566 ExprIntrp_Recept.Use(namu);
569 if (!namexp->IsKind(STANDARD_TYPE(Expr_NamedUnknown))) {
570 ExprIntrp_SyntaxError::Raise();
572 namu = Handle(Expr_NamedUnknown)::DownCast(namexp);
574 namu->Assign(ExprIntrp_Recept.Pop());
577 extern "C" void ExprIntrp_EndOfFuncDef()
579 Handle(Expr_GeneralExpression) theexp = ExprIntrp_Recept.Pop();
580 Standard_Integer nbargs = ExprIntrp_Recept.PopValue();
581 Expr_Array1OfNamedUnknown vars(1,nbargs);
582 Expr_Array1OfNamedUnknown internvars(1,nbargs);
584 for (i=nbargs; i > 0; i--) {
585 vars(i) = Handle(Expr_NamedUnknown)::DownCast(ExprIntrp_Recept.Pop());
586 internvars(i) = Handle(Expr_NamedUnknown)::DownCast(vars(i)->Copy());
588 theexp = Expr::CopyShare(theexp); // ATTENTION, PROTECTION BUG STACK
589 for (i=1; i<= nbargs; i++) {
590 if (theexp->Contains(vars(i))) {
591 theexp->Replace(vars(i),internvars(i));
594 if (theexp == vars(i)) {
595 theexp = internvars(i);
599 Handle(Expr_NamedFunction) thefunc =
600 new Expr_NamedFunction(ExprIntrp_funcdefname,
603 ExprIntrp_Recept.Use(thefunc);
606 extern "C" void ExprIntrp_ConstantIdentifier()
610 Standard_Integer nbcar =
612 ExprIntrp_GetResult(name);
613 TCollection_AsciiString thename(name);
614 ExprIntrp_Recept.PushName(thename);
617 extern "C" void ExprIntrp_ConstantDefinition()
619 TCollection_AsciiString name = ExprIntrp_Recept.PopName();
622 nbcar = ExprIntrp_GetResult(num);
623 Standard_Real val = atof(num);
624 Handle(Expr_NamedConstant) theconst = new Expr_NamedConstant(name,val);
625 ExprIntrp_Recept.Use(theconst);
626 ExprIntrp_Recept.Push(theconst);
630 extern "C" void ExprIntrp_Sumator()
632 Handle(Expr_NumericValue) number = Handle(Expr_NumericValue)::DownCast(ExprIntrp_Recept.Pop());
633 Standard_Integer nb = (Standard_Integer) number->GetValue();
634 Handle(Expr_GeneralExpression) inc = ExprIntrp_Recept.Pop();
635 Handle(Expr_GeneralExpression) first = ExprIntrp_Recept.Pop();
636 Handle(Expr_NamedUnknown) var = Handle(Expr_NamedUnknown)::DownCast(ExprIntrp_Recept.Pop());
637 Handle(Expr_GeneralExpression) theexp = ExprIntrp_Recept.Pop();
638 Standard_Boolean thesame = (theexp == var);
639 Handle(Expr_GeneralExpression) cur = Expr::CopyShare(first);
640 Handle(Expr_GeneralExpression) res;
641 Handle(Expr_GeneralExpression) member;
642 Expr_SequenceOfGeneralExpression seq;
643 for (Standard_Integer i=1; i<= nb; i++) {
648 member = Expr::CopyShare(theexp);
649 member->Replace(var,cur);
652 cur = (cur + inc)->ShallowSimplified();
654 res = new Expr_Sum(seq);
655 ExprIntrp_Recept.Push(res->ShallowSimplified());
658 extern "C" void ExprIntrp_Productor()
660 Handle(Expr_NumericValue) number = Handle(Expr_NumericValue)::DownCast(ExprIntrp_Recept.Pop());
661 Standard_Integer nb = (Standard_Integer) number->GetValue();
662 Handle(Expr_GeneralExpression) inc = ExprIntrp_Recept.Pop();
663 Handle(Expr_GeneralExpression) first = ExprIntrp_Recept.Pop();
664 Handle(Expr_NamedUnknown) var = Handle(Expr_NamedUnknown)::DownCast(ExprIntrp_Recept.Pop());
665 Handle(Expr_GeneralExpression) theexp = ExprIntrp_Recept.Pop();
666 Standard_Boolean thesame = (theexp == var);
667 Handle(Expr_GeneralExpression) cur = Expr::CopyShare(first);
668 Handle(Expr_GeneralExpression) res;
669 Handle(Expr_GeneralExpression) member;
670 Expr_SequenceOfGeneralExpression seq;
671 for (Standard_Integer i=1; i<= nb; i++) {
676 member = Expr::CopyShare(theexp);
677 member->Replace(var,cur);
680 cur = (cur + inc)->ShallowSimplified();
682 res = new Expr_Product(seq);
683 ExprIntrp_Recept.Push(res->ShallowSimplified());