40 |
STMT_NOOP, |
STMT_NOOP, |
41 |
}; |
}; |
42 |
|
|
43 |
|
/** |
44 |
|
* Convenience function used for retrieving the (assumed) data type of a given |
45 |
|
* script variable name. |
46 |
|
* |
47 |
|
* @param name - some script variable name (e.g. "$foo") |
48 |
|
* @return variable's assumed data type (e.g. INT_EXPR for example above) |
49 |
|
*/ |
50 |
|
inline ExprType_t exprTypeOfVarName(const String& name) { |
51 |
|
if (name.empty()) return (ExprType_t) -1; |
52 |
|
const char prefix = name[0]; |
53 |
|
switch (prefix) { |
54 |
|
case '$': return INT_EXPR; |
55 |
|
case '%': return INT_ARR_EXPR; |
56 |
|
case '~': return REAL_EXPR; |
57 |
|
case '?': return REAL_ARR_EXPR; |
58 |
|
case '@': return STRING_EXPR; |
59 |
|
case '!': return STRING_ARR_EXPR; |
60 |
|
} |
61 |
|
return (ExprType_t) -1; |
62 |
|
} |
63 |
|
|
64 |
class Node { |
class Node { |
65 |
public: |
public: |
66 |
Node(); |
Node(); |
91 |
}; |
}; |
92 |
typedef Ref<Unit,Node> UnitRef; |
typedef Ref<Unit,Node> UnitRef; |
93 |
|
|
94 |
class ScalarNumberExpr : virtual public Unit, virtual public VMScalarNumberExpr, virtual public Expression { |
class NumberExpr : virtual public Unit, virtual public VMNumberExpr, virtual public Expression { |
95 |
public: |
public: |
96 |
}; |
}; |
97 |
typedef Ref<ScalarNumberExpr,Node> ScalarNumberExprRef; |
typedef Ref<NumberExpr,Node> NumberExprRef; |
98 |
|
|
99 |
class IntExpr : virtual public ScalarNumberExpr, virtual public VMIntExpr { |
class IntExpr : virtual public NumberExpr, virtual public VMIntExpr { |
100 |
public: |
public: |
101 |
ExprType_t exprType() const OVERRIDE { return INT_EXPR; } |
ExprType_t exprType() const OVERRIDE { return INT_EXPR; } |
102 |
vmint evalIntToUnitFactor(vmfloat unitFactor); |
vmint evalIntToUnitFactor(vmfloat unitFactor); |
104 |
}; |
}; |
105 |
typedef Ref<IntExpr,Node> IntExprRef; |
typedef Ref<IntExpr,Node> IntExprRef; |
106 |
|
|
107 |
class RealExpr : virtual public ScalarNumberExpr, virtual public VMRealExpr { |
class RealExpr : virtual public NumberExpr, virtual public VMRealExpr { |
108 |
public: |
public: |
109 |
ExprType_t exprType() const OVERRIDE { return REAL_EXPR; } |
ExprType_t exprType() const OVERRIDE { return REAL_EXPR; } |
110 |
vmfloat evalRealToUnitFactor(vmfloat unitFactor); |
vmfloat evalRealToUnitFactor(vmfloat unitFactor); |
230 |
}; |
}; |
231 |
typedef Ref<Variable,Node> VariableRef; |
typedef Ref<Variable,Node> VariableRef; |
232 |
|
|
233 |
class ScalarNumberVariable : public Variable, virtual public ScalarNumberExpr { |
class NumberVariable : public Variable, virtual public NumberExpr { |
234 |
bool polyphonic; |
bool polyphonic; |
235 |
bool finalVal; |
bool finalVal; |
236 |
protected: |
protected: |
240 |
bool isFinal() const OVERRIDE { return finalVal; } |
bool isFinal() const OVERRIDE { return finalVal; } |
241 |
vmfloat unitFactor() const OVERRIDE; |
vmfloat unitFactor() const OVERRIDE; |
242 |
protected: |
protected: |
243 |
ScalarNumberVariable(const VariableDecl& decl); |
NumberVariable(const VariableDecl& decl); |
244 |
}; |
}; |
245 |
typedef Ref<ScalarNumberVariable,Node> ScalarNumberVariableRef; |
typedef Ref<NumberVariable,Node> NumberVariableRef; |
246 |
|
|
247 |
class IntVariable : public ScalarNumberVariable, virtual public IntExpr { |
class IntVariable : public NumberVariable, virtual public IntExpr { |
248 |
public: |
public: |
249 |
IntVariable(const VariableDecl& decl); |
IntVariable(const VariableDecl& decl); |
250 |
void assign(Expression* expr) OVERRIDE; |
void assign(Expression* expr) OVERRIDE; |
253 |
}; |
}; |
254 |
typedef Ref<IntVariable,Node> IntVariableRef; |
typedef Ref<IntVariable,Node> IntVariableRef; |
255 |
|
|
256 |
class RealVariable : public ScalarNumberVariable, virtual public RealExpr { |
class RealVariable : public NumberVariable, virtual public RealExpr { |
257 |
public: |
public: |
258 |
RealVariable(const VariableDecl& decl); |
RealVariable(const VariableDecl& decl); |
259 |
void assign(Expression* expr) OVERRIDE; |
void assign(Expression* expr) OVERRIDE; |
457 |
}; |
}; |
458 |
typedef Ref<BinaryOp,Node> BinaryOpRef; |
typedef Ref<BinaryOp,Node> BinaryOpRef; |
459 |
|
|
460 |
class ScalarNumberBinaryOp : public BinaryOp, virtual public ScalarNumberExpr { |
class NumberBinaryOp : public BinaryOp, virtual public NumberExpr { |
461 |
public: |
public: |
462 |
ScalarNumberBinaryOp(ScalarNumberExprRef lhs, ScalarNumberExprRef rhs) : BinaryOp(lhs, rhs) { } |
NumberBinaryOp(NumberExprRef lhs, NumberExprRef rhs) : BinaryOp(lhs, rhs) { } |
463 |
bool isFinal() const OVERRIDE; |
bool isFinal() const OVERRIDE; |
464 |
}; |
}; |
465 |
typedef Ref<ScalarNumberBinaryOp,Node> ScalarNumberBinaryOpRef; |
typedef Ref<NumberBinaryOp,Node> NumberBinaryOpRef; |
466 |
|
|
467 |
class IntBinaryOp : public ScalarNumberBinaryOp, virtual public IntExpr { |
class IntBinaryOp : public NumberBinaryOp, virtual public IntExpr { |
468 |
public: |
public: |
469 |
IntBinaryOp(IntExprRef lhs, IntExprRef rhs) : ScalarNumberBinaryOp(lhs, rhs) { } |
IntBinaryOp(IntExprRef lhs, IntExprRef rhs) : NumberBinaryOp(lhs, rhs) { } |
470 |
}; |
}; |
471 |
typedef Ref<IntBinaryOp,Node> IntBinaryOpRef; |
typedef Ref<IntBinaryOp,Node> IntBinaryOpRef; |
472 |
|
|
473 |
class VaritypeScalarBinaryOp : public ScalarNumberBinaryOp, virtual public IntExpr, virtual public RealExpr { |
class VaritypeScalarBinaryOp : public NumberBinaryOp, virtual public IntExpr, virtual public RealExpr { |
474 |
public: |
public: |
475 |
VaritypeScalarBinaryOp(ScalarNumberExprRef lhs, ScalarNumberExprRef rhs) : ScalarNumberBinaryOp(lhs, rhs) { } |
VaritypeScalarBinaryOp(NumberExprRef lhs, NumberExprRef rhs) : NumberBinaryOp(lhs, rhs) { } |
476 |
ExprType_t exprType() const OVERRIDE; |
ExprType_t exprType() const OVERRIDE; |
477 |
String evalCastToStr() OVERRIDE; |
String evalCastToStr() OVERRIDE; |
478 |
}; |
}; |
480 |
|
|
481 |
class Add FINAL : public VaritypeScalarBinaryOp { |
class Add FINAL : public VaritypeScalarBinaryOp { |
482 |
public: |
public: |
483 |
Add(ScalarNumberExprRef lhs, ScalarNumberExprRef rhs); |
Add(NumberExprRef lhs, NumberExprRef rhs); |
484 |
vmint evalInt() OVERRIDE; |
vmint evalInt() OVERRIDE; |
485 |
vmfloat evalReal() OVERRIDE; |
vmfloat evalReal() OVERRIDE; |
486 |
vmfloat unitFactor() const OVERRIDE; |
vmfloat unitFactor() const OVERRIDE; |
490 |
|
|
491 |
class Sub FINAL : public VaritypeScalarBinaryOp { |
class Sub FINAL : public VaritypeScalarBinaryOp { |
492 |
public: |
public: |
493 |
Sub(ScalarNumberExprRef lhs, ScalarNumberExprRef rhs); |
Sub(NumberExprRef lhs, NumberExprRef rhs); |
494 |
vmint evalInt() OVERRIDE; |
vmint evalInt() OVERRIDE; |
495 |
vmfloat evalReal() OVERRIDE; |
vmfloat evalReal() OVERRIDE; |
496 |
vmfloat unitFactor() const OVERRIDE; |
vmfloat unitFactor() const OVERRIDE; |
500 |
|
|
501 |
class Mul FINAL : public VaritypeScalarBinaryOp { |
class Mul FINAL : public VaritypeScalarBinaryOp { |
502 |
public: |
public: |
503 |
Mul(ScalarNumberExprRef lhs, ScalarNumberExprRef rhs); |
Mul(NumberExprRef lhs, NumberExprRef rhs); |
504 |
vmint evalInt() OVERRIDE; |
vmint evalInt() OVERRIDE; |
505 |
vmfloat evalReal() OVERRIDE; |
vmfloat evalReal() OVERRIDE; |
506 |
vmfloat unitFactor() const OVERRIDE; |
vmfloat unitFactor() const OVERRIDE; |
510 |
|
|
511 |
class Div FINAL : public VaritypeScalarBinaryOp { |
class Div FINAL : public VaritypeScalarBinaryOp { |
512 |
public: |
public: |
513 |
Div(ScalarNumberExprRef lhs, ScalarNumberExprRef rhs); |
Div(NumberExprRef lhs, NumberExprRef rhs); |
514 |
vmint evalInt() OVERRIDE; |
vmint evalInt() OVERRIDE; |
515 |
vmfloat evalReal() OVERRIDE; |
vmfloat evalReal() OVERRIDE; |
516 |
void dump(int level = 0) OVERRIDE; |
void dump(int level = 0) OVERRIDE; |
758 |
typedef Ref<SyncBlock,Node> SyncBlockRef; |
typedef Ref<SyncBlock,Node> SyncBlockRef; |
759 |
|
|
760 |
class Neg FINAL : virtual public IntExpr, virtual public RealExpr { |
class Neg FINAL : virtual public IntExpr, virtual public RealExpr { |
761 |
ScalarNumberExprRef expr; |
NumberExprRef expr; |
762 |
public: |
public: |
763 |
Neg(ScalarNumberExprRef expr) : Unit(expr->unitType()), expr(expr) { } |
Neg(NumberExprRef expr) : Unit(expr->unitType()), expr(expr) { } |
764 |
ExprType_t exprType() const OVERRIDE { return expr->exprType(); } |
ExprType_t exprType() const OVERRIDE { return expr->exprType(); } |
765 |
vmint evalInt() OVERRIDE { return (expr) ? -(expr->asInt()->evalInt()) : 0; } |
vmint evalInt() OVERRIDE { return (expr) ? -(expr->asInt()->evalInt()) : 0; } |
766 |
vmfloat evalReal() OVERRIDE { return (expr) ? -(expr->asReal()->evalReal()) : vmfloat(0); } |
vmfloat evalReal() OVERRIDE { return (expr) ? -(expr->asReal()->evalReal()) : vmfloat(0); } |
872 |
typedef Ref<BitwiseNot,Node> BitwiseNotRef; |
typedef Ref<BitwiseNot,Node> BitwiseNotRef; |
873 |
|
|
874 |
class Final FINAL : virtual public IntExpr, virtual public RealExpr { |
class Final FINAL : virtual public IntExpr, virtual public RealExpr { |
875 |
ScalarNumberExprRef expr; |
NumberExprRef expr; |
876 |
public: |
public: |
877 |
Final(ScalarNumberExprRef expr) : Unit(expr->unitType()), expr(expr) {} |
Final(NumberExprRef expr) : Unit(expr->unitType()), expr(expr) {} |
878 |
ExprType_t exprType() const OVERRIDE { return expr->exprType(); } |
ExprType_t exprType() const OVERRIDE { return expr->exprType(); } |
879 |
vmint evalInt() OVERRIDE { return expr->asInt()->evalInt(); } |
vmint evalInt() OVERRIDE { return expr->asInt()->evalInt(); } |
880 |
vmfloat evalReal() OVERRIDE { return expr->asReal()->evalReal(); } |
vmfloat evalReal() OVERRIDE { return expr->asReal()->evalReal(); } |