--- linuxsampler/trunk/src/scriptvm/tree.h 2016/04/19 14:07:53 2879 +++ linuxsampler/trunk/src/scriptvm/tree.h 2016/07/15 15:29:04 2948 @@ -104,10 +104,12 @@ }; typedef Ref ArgsRef; -class Variable : virtual public Expression { +class Variable : virtual public VMVariable, virtual public Expression { public: - virtual bool isConstExpr() const { return bConst; } + bool isConstExpr() const OVERRIDE { return bConst; } + bool isAssignable() const OVERRIDE { return !bConst; } virtual void assign(Expression* expr) = 0; + void assignExpr(VMExpr* expr) OVERRIDE { Expression* e = dynamic_cast(expr); if (e) assign(e); } protected: Variable(ParserContext* ctx, int _memPos, bool _bConst) : context(ctx), memPos(_memPos), bConst(_bConst) {} @@ -148,6 +150,7 @@ VMIntRelPtr* ptr; public: BuiltInIntVariable(const String& name, VMIntRelPtr* ptr); + bool isAssignable() const OVERRIDE { return !ptr->readonly; } void assign(Expression* expr); int evalInt(); void dump(int level = 0); @@ -320,6 +323,23 @@ virtual Statements* branch(uint i) const = 0; }; +class DynamicVariableCall : public Variable, virtual public IntExpr, virtual public StringExpr { + VMDynVar* dynVar; + String varName; +public: + DynamicVariableCall(const String& name, ParserContext* ctx, VMDynVar* v); + ExprType_t exprType() const OVERRIDE { return dynVar->exprType(); } + bool isConstExpr() const OVERRIDE { return dynVar->isConstExpr(); } + bool isAssignable() const OVERRIDE { return dynVar->isAssignable(); } + bool isPolyphonic() const OVERRIDE { return false; } + void assign(Expression* expr) OVERRIDE { dynVar->assignExpr(expr); } + int evalInt() OVERRIDE; + String evalStr() OVERRIDE; + String evalCastToStr() OVERRIDE; + void dump(int level = 0) OVERRIDE; +}; +typedef Ref DynamicVariableCallRef; + class FunctionCall : virtual public LeafStatement, virtual public IntExpr, virtual public StringExpr { String functionName; ArgsRef args; @@ -518,6 +538,14 @@ }; typedef Ref OrRef; +class BitwiseOr : virtual public BinaryOp, virtual public IntExpr { +public: + BitwiseOr(IntExprRef lhs, IntExprRef rhs) : BinaryOp(lhs,rhs) {} + int evalInt(); + void dump(int level = 0); +}; +typedef Ref BitwiseOrRef; + class And : virtual public BinaryOp, virtual public IntExpr { public: And(IntExprRef lhs, IntExprRef rhs) : BinaryOp(lhs,rhs) {} @@ -526,6 +554,14 @@ }; typedef Ref AndRef; +class BitwiseAnd : virtual public BinaryOp, virtual public IntExpr { +public: + BitwiseAnd(IntExprRef lhs, IntExprRef rhs) : BinaryOp(lhs,rhs) {} + int evalInt(); + void dump(int level = 0); +}; +typedef Ref BitwiseAndRef; + class Not : virtual public IntExpr { IntExprRef expr; public: @@ -537,6 +573,17 @@ }; typedef Ref NotRef; +class BitwiseNot : virtual public IntExpr { + IntExprRef expr; +public: + BitwiseNot(IntExprRef expr) : expr(expr) {} + int evalInt() { return ~expr->evalInt(); } + void dump(int level = 0); + bool isConstExpr() const { return expr->isConstExpr(); } + bool isPolyphonic() const { return expr->isPolyphonic(); } +}; +typedef Ref BitwiseNotRef; + class ParserContext : public VMParserContext { public: struct Error { @@ -586,8 +633,8 @@ IntVariableRef globalIntVar(const String& name); StringVariableRef globalStrVar(const String& name); VariableRef variableByName(const String& name); - void addErr(int line, const char* txt); - void addWrn(int line, const char* txt); + void addErr(int firstLine, int lastLine, int firstColumn, int lastColumn, const char* txt); + void addWrn(int firstLine, int lastLine, int firstColumn, int lastColumn, const char* txt); void createScanner(std::istream* is); void destroyScanner(); bool setPreprocessorCondition(const char* name); @@ -601,6 +648,7 @@ void registerBuiltInConstIntVariables(const std::map& vars); void registerBuiltInIntVariables(const std::map& vars); void registerBuiltInIntArrayVariables(const std::map& vars); + void registerBuiltInDynVariables(const std::map& vars); }; class ExecContext : public VMExecContext {