102 |
|
|
103 |
int Div::evalInt() { |
int Div::evalInt() { |
104 |
IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs); |
IntExpr* pLHS = dynamic_cast<IntExpr*>(&*lhs); |
105 |
IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs);; |
IntExpr* pRHS = dynamic_cast<IntExpr*>(&*rhs); |
106 |
return (pLHS && pRHS) ? pRHS->evalInt() == 0 ? 0 : pLHS->evalInt() / pRHS->evalInt() : 0; |
if (!pLHS || !pRHS) return 0; |
107 |
|
int l = pLHS->evalInt(); |
108 |
|
int r = pRHS->evalInt(); |
109 |
|
if (r == 0) return 0; |
110 |
|
return l / r; |
111 |
} |
} |
112 |
|
|
113 |
void Div::dump(int level) { |
void Div::dump(int level) { |
359 |
|
|
360 |
void IntVariable::assign(Expression* expr) { |
void IntVariable::assign(Expression* expr) { |
361 |
IntExpr* intExpr = dynamic_cast<IntExpr*>(expr); |
IntExpr* intExpr = dynamic_cast<IntExpr*>(expr); |
362 |
if (intExpr) |
if (intExpr) { |
363 |
if (polyphonic) |
if (polyphonic) |
364 |
context->execContext->polyphonicIntMemory[memPos] = intExpr->evalInt(); |
context->execContext->polyphonicIntMemory[memPos] = intExpr->evalInt(); |
365 |
else |
else |
366 |
(*context->globalIntMemory)[memPos] = intExpr->evalInt(); |
(*context->globalIntMemory)[memPos] = intExpr->evalInt(); |
367 |
|
} |
368 |
} |
} |
369 |
|
|
370 |
int IntVariable::evalInt() { |
int IntVariable::evalInt() { |
378 |
|
|
379 |
void IntVariable::dump(int level) { |
void IntVariable::dump(int level) { |
380 |
printIndents(level); |
printIndents(level); |
381 |
|
printf("IntVariable\n"); |
382 |
//printf("IntVariable memPos=%d\n", memPos); |
//printf("IntVariable memPos=%d\n", memPos); |
383 |
} |
} |
384 |
|
|
712 |
} |
} |
713 |
|
|
714 |
String ConcatString::evalStr() { |
String ConcatString::evalStr() { |
715 |
return lhs->evalCastToStr() + rhs->evalCastToStr(); |
// temporaries required here to enforce the associative left (to right) order |
716 |
|
// ( required for GCC and Visual Studio, see: |
717 |
|
// http://stackoverflow.com/questions/25842902/why-stdstring-concatenation-operator-works-like-right-associative-one |
718 |
|
// Personally I am not convinced that this is "not a bug" of the |
719 |
|
// compiler/STL implementation and the allegedly underlying "function call" |
720 |
|
// nature causing this is IMO no profound reason that the C++ language's |
721 |
|
// "+" operator's left associativity is ignored. -- Christian, 2016-07-14 ) |
722 |
|
String l = lhs->evalCastToStr(); |
723 |
|
String r = rhs->evalCastToStr(); |
724 |
|
return l + r; |
725 |
} |
} |
726 |
|
|
727 |
void ConcatString::dump(int level) { |
void ConcatString::dump(int level) { |
883 |
printf(")\n"); |
printf(")\n"); |
884 |
} |
} |
885 |
|
|
886 |
|
StatementsRef ParserContext::userFunctionByName(const String& name) { |
887 |
|
if (!userFnTable.count(name)) { |
888 |
|
return StatementsRef(); |
889 |
|
} |
890 |
|
return userFnTable.find(name)->second; |
891 |
|
} |
892 |
|
|
893 |
VariableRef ParserContext::variableByName(const String& name) { |
VariableRef ParserContext::variableByName(const String& name) { |
894 |
if (!vartable.count(name)) { |
if (!vartable.count(name)) { |
895 |
return VariableRef(); |
return VariableRef(); |