• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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