1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef USCRIPT_CONTEXT_H 16 #define USCRIPT_CONTEXT_H 17 18 #include <map> 19 #include <memory> 20 #include <string> 21 #include <vector> 22 #include "script_instruction.h" 23 #include "script_manager.h" 24 25 namespace uscript { 26 class ScriptInterpreter; 27 class UScriptValue; 28 class UScriptInterpretContext; 29 30 using UScriptValuePtr = std::shared_ptr<UScriptValue>; 31 using UScriptContextPtr = std::shared_ptr<UScriptInterpretContext>; 32 33 class UScriptValue { 34 public: 35 enum UScriptValueType { 36 VALUE_TYPE_INTEGER = UScriptContext::PARAM_TYPE_INTEGER, 37 VALUE_TYPE_FLOAT = UScriptContext::PARAM_TYPE_FLOAT, 38 VALUE_TYPE_STRING = UScriptContext::PARAM_TYPE_STRING, 39 VALUE_TYPE_ERROR, 40 VALUE_TYPE_LIST, 41 VALUE_TYPE_RETURN, 42 }; 43 UScriptValue(UScriptValueType type)44 explicit UScriptValue(UScriptValueType type) : type_(type) {} ~UScriptValue()45 virtual ~UScriptValue() {} 46 GetValueType()47 UScriptValueType GetValueType() const 48 { 49 return type_; 50 } 51 IsTrue()52 virtual bool IsTrue() const 53 { 54 return false; 55 } 56 57 virtual UScriptValuePtr Computer(int32_t action, UScriptValuePtr rightValue); 58 59 virtual std::string ToString(); 60 61 static std::string ScriptToString(UScriptValuePtr value); 62 63 static UScriptValuePtr GetRightCompluteValue(UScriptValuePtr rightValue); 64 private: 65 UScriptValueType type_; 66 }; 67 68 class IntegerValue : public UScriptValue { 69 public: IntegerValue(int32_t value)70 explicit IntegerValue(int32_t value) : UScriptValue(UScriptValue::VALUE_TYPE_INTEGER), value_(value) {} ~IntegerValue()71 ~IntegerValue() override {} 72 IsTrue()73 bool IsTrue() const override 74 { 75 return value_ != 0; 76 } 77 GetValue()78 int32_t GetValue() const 79 { 80 return value_; 81 } 82 83 UScriptValuePtr Computer(int32_t action, UScriptValuePtr rightValue) override; 84 std::string ToString() override; 85 86 private: 87 int32_t value_; 88 }; 89 90 class FloatValue : public UScriptValue { 91 public: FloatValue(float value)92 explicit FloatValue(float value) : UScriptValue(UScriptValue::VALUE_TYPE_FLOAT), value_(value) {} ~FloatValue()93 ~FloatValue() override {} 94 IsTrue()95 bool IsTrue() const override 96 { 97 return value_ != 0; 98 } 99 GetValue()100 float GetValue() const 101 { 102 return value_; 103 } 104 105 UScriptValuePtr Computer(int32_t action, UScriptValuePtr rightValue) override; 106 std::string ToString() override; 107 108 private: 109 bool ComputerEqual(UScriptValuePtr rightValue); 110 float value_; 111 }; 112 113 class StringValue : public UScriptValue { 114 public: StringValue(std::string value)115 explicit StringValue(std::string value) : UScriptValue(UScriptValue::VALUE_TYPE_STRING), 116 value_(std::move(value)) {} ~StringValue()117 ~StringValue() override {} 118 IsTrue()119 bool IsTrue() const override 120 { 121 return !value_.empty(); 122 } 123 GetValue()124 std::string GetValue() const 125 { 126 return value_; 127 } 128 129 UScriptValuePtr Computer(int32_t action, UScriptValuePtr rightValue) override; 130 131 UScriptValuePtr ComputerReturn(int32_t action, UScriptValuePtr rightValue, UScriptValuePtr defReturn) const; 132 133 std::string ToString() override; 134 private: 135 int32_t ComputerLogic(UScriptValuePtr rightValue) const; 136 std::string value_; 137 }; 138 139 class ReturnValue : public UScriptValue { 140 public: ReturnValue()141 ReturnValue() : UScriptValue(UScriptValue::VALUE_TYPE_LIST) {} ~ReturnValue()142 ~ReturnValue() override 143 { 144 values_.clear(); 145 } 146 IsTrue()147 bool IsTrue() const override 148 { 149 return false; 150 } 151 152 UScriptValuePtr Computer(int32_t action, UScriptValuePtr rightValue) override; 153 std::string ToString() override; 154 155 void AddValue(const UScriptValuePtr value); 156 void AddValues(const std::vector<UScriptValuePtr> values); 157 std::vector<UScriptValuePtr> GetValues() const; 158 159 private: 160 std::vector<UScriptValuePtr> values_ {}; 161 }; 162 163 class ErrorValue : public UScriptValue { 164 public: ErrorValue(int32_t retCode)165 explicit ErrorValue(int32_t retCode) : UScriptValue(UScriptValue::VALUE_TYPE_ERROR), retCode_(retCode) {} ~ErrorValue()166 ~ErrorValue() override {} 167 168 // 对于返回值,true表示返回ok IsTrue()169 bool IsTrue() const override 170 { 171 return retCode_ == USCRIPT_SUCCESS; 172 } 173 GetValue()174 int32_t GetValue() const 175 { 176 return retCode_; 177 } 178 SetValue(const int32_t code)179 int32_t SetValue(const int32_t code) 180 { 181 return retCode_ = code; 182 } Computer(int32_t action,UScriptValuePtr rightValue)183 UScriptValuePtr Computer(int32_t action, UScriptValuePtr rightValue) override 184 { 185 return nullptr; 186 } 187 188 std::string ToString() override; 189 190 private: 191 int32_t retCode_ = 0; 192 }; 193 194 /** 195 * 脚本指令上下文,用来在执行脚本指令时,传递输入、输出参数 196 */ 197 class UScriptInstructionContext : public UScriptContext { 198 public: UScriptInstructionContext()199 UScriptInstructionContext() {} 200 ~UScriptInstructionContext()201 virtual ~UScriptInstructionContext() {} 202 203 virtual int32_t PushParam(int32_t value) override; 204 virtual int32_t PushParam(float value) override; 205 virtual int32_t PushParam(const std::string &value) override; 206 virtual int32_t GetParamCount() override; 207 virtual ParamType GetParamType(int32_t index) override; 208 virtual int32_t GetParam(int32_t index, int32_t &value) override; 209 virtual int32_t GetParam(int32_t index, float &value) override; 210 virtual int32_t GetParam(int32_t index, std::string &value) override; 211 212 int32_t AddInputParam(UScriptValuePtr value); 213 GetOutVar()214 std::vector<UScriptValuePtr> GetOutVar() const 215 { 216 return outParam_; 217 } 218 219 private: 220 template<class T, class TWapper> int32_t GetOutputValue(int32_t index, T &value); 221 template<class T, class TWapper> int32_t GetParam(int32_t index, T &value); 222 223 std::vector<UScriptValuePtr> innerParam_ {}; 224 std::vector<UScriptValuePtr> outParam_ {}; 225 }; 226 227 /** 228 * 脚本解析中的上下文,保存每一层的变量 229 */ 230 class UScriptInterpretContext { 231 public: 232 explicit UScriptInterpretContext(bool top = false); 233 ~UScriptInterpretContext()234 virtual ~UScriptInterpretContext() 235 { 236 localVariables_.clear(); 237 } 238 239 UScriptValuePtr FindVariable(const ScriptInterpreter &inter, std::string id); 240 void UpdateVariable(const ScriptInterpreter &inter, std::string id, UScriptValuePtr value); 241 void UpdateVariables(const ScriptInterpreter &inter, 242 UScriptValuePtr value, 243 std::vector<std::string> ids, 244 size_t& startIndex); 245 GetContextId()246 uint32_t GetContextId() const 247 { 248 return contextId_; 249 } 250 IsTop()251 bool IsTop() const 252 { 253 return top_; 254 } 255 256 private: 257 uint32_t contextId_ = 0; 258 bool top_ = false; 259 std::map<std::string, UScriptValuePtr> localVariables_ {}; 260 }; 261 } // namespace uscript 262 #endif // USCRIPT_CONTEXT_H 263