1fb299fa2Sopenharmony_ci/* 2fb299fa2Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at 6fb299fa2Sopenharmony_ci * 7fb299fa2Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb299fa2Sopenharmony_ci * 9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and 13fb299fa2Sopenharmony_ci * limitations under the License. 14fb299fa2Sopenharmony_ci */ 15fb299fa2Sopenharmony_ci#ifndef USCRIPT_EXPRESSION_H 16fb299fa2Sopenharmony_ci#define USCRIPT_EXPRESSION_H 17fb299fa2Sopenharmony_ci 18fb299fa2Sopenharmony_ci#include <memory> 19fb299fa2Sopenharmony_ci#include "script_context.h" 20fb299fa2Sopenharmony_ci 21fb299fa2Sopenharmony_cinamespace Uscript { 22fb299fa2Sopenharmony_ciclass UScriptExpression; 23fb299fa2Sopenharmony_ciusing UScriptExpressionPtr = std::shared_ptr<UScriptExpression>; 24fb299fa2Sopenharmony_ci 25fb299fa2Sopenharmony_ciclass ScriptParams; 26fb299fa2Sopenharmony_ciclass ScriptFunction; 27fb299fa2Sopenharmony_ci 28fb299fa2Sopenharmony_ciclass UScriptExpression { 29fb299fa2Sopenharmony_cipublic: 30fb299fa2Sopenharmony_ci enum ExpressionType { 31fb299fa2Sopenharmony_ci EXPRESSION_TYPE_INTERGER, 32fb299fa2Sopenharmony_ci EXPRESSION_TYPE_FLOAT, 33fb299fa2Sopenharmony_ci EXPRESSION_TYPE_STRING, 34fb299fa2Sopenharmony_ci EXPRESSION_TYPE_IDENTIFIER, 35fb299fa2Sopenharmony_ci EXPRESSION_TYPE_BINARY, 36fb299fa2Sopenharmony_ci EXPRESSION_TYPE_ASSIGN, 37fb299fa2Sopenharmony_ci EXPRESSION_TYPE_INV, 38fb299fa2Sopenharmony_ci EXPRESSION_TYPE_FUNC, 39fb299fa2Sopenharmony_ci EXPRESSION_TYPE_INVALID, 40fb299fa2Sopenharmony_ci }; 41fb299fa2Sopenharmony_ci enum ExpressionAction { 42fb299fa2Sopenharmony_ci ADD_OPERATOR = 1, 43fb299fa2Sopenharmony_ci SUB_OPERATOR, 44fb299fa2Sopenharmony_ci MUL_OPERATOR, 45fb299fa2Sopenharmony_ci DIV_OPERATOR, 46fb299fa2Sopenharmony_ci GT_OPERATOR, 47fb299fa2Sopenharmony_ci GE_OPERATOR, 48fb299fa2Sopenharmony_ci LT_OPERATOR, 49fb299fa2Sopenharmony_ci LE_OPERATOR, 50fb299fa2Sopenharmony_ci EQ_OPERATOR, 51fb299fa2Sopenharmony_ci NE_OPERATOR, 52fb299fa2Sopenharmony_ci AND_OPERATOR, 53fb299fa2Sopenharmony_ci OR_OPERATOR 54fb299fa2Sopenharmony_ci }; 55fb299fa2Sopenharmony_ci 56fb299fa2Sopenharmony_cipublic: 57fb299fa2Sopenharmony_ci explicit UScriptExpression(ExpressionType expressType); 58fb299fa2Sopenharmony_ci virtual ~UScriptExpression(); 59fb299fa2Sopenharmony_ci 60fb299fa2Sopenharmony_ci virtual UScriptValuePtr Execute(ScriptInterpreter &inter, UScriptContextPtr local); 61fb299fa2Sopenharmony_ci static UScriptExpression* CreateExpression(ExpressionType expressType) 62fb299fa2Sopenharmony_ci { 63fb299fa2Sopenharmony_ci return new UScriptExpression(expressType); 64fb299fa2Sopenharmony_ci } 65fb299fa2Sopenharmony_ci ExpressionType GetExpressType() 66fb299fa2Sopenharmony_ci { 67fb299fa2Sopenharmony_ci return expressType_; 68fb299fa2Sopenharmony_ci } 69fb299fa2Sopenharmony_ci 70fb299fa2Sopenharmony_ciprivate: 71fb299fa2Sopenharmony_ci ExpressionType expressType_; 72fb299fa2Sopenharmony_ci}; 73fb299fa2Sopenharmony_ci 74fb299fa2Sopenharmony_ciclass IntegerExpression : public UScriptExpression { 75fb299fa2Sopenharmony_cipublic: 76fb299fa2Sopenharmony_ci explicit IntegerExpression(int v) : UScriptExpression(UScriptExpression::EXPRESSION_TYPE_INTERGER) 77fb299fa2Sopenharmony_ci { 78fb299fa2Sopenharmony_ci value_ = v; 79fb299fa2Sopenharmony_ci } 80fb299fa2Sopenharmony_ci 81fb299fa2Sopenharmony_ci ~IntegerExpression() override {} 82fb299fa2Sopenharmony_ci 83fb299fa2Sopenharmony_ci UScriptValuePtr Execute(ScriptInterpreter &inter, UScriptContextPtr local) override; 84fb299fa2Sopenharmony_ci 85fb299fa2Sopenharmony_ci static UScriptExpression* CreateExpression(int value) 86fb299fa2Sopenharmony_ci { 87fb299fa2Sopenharmony_ci return new IntegerExpression(value); 88fb299fa2Sopenharmony_ci } 89fb299fa2Sopenharmony_ciprivate: 90fb299fa2Sopenharmony_ci int value_; 91fb299fa2Sopenharmony_ci}; 92fb299fa2Sopenharmony_ci 93fb299fa2Sopenharmony_ciclass FloatExpression : public UScriptExpression { 94fb299fa2Sopenharmony_cipublic: 95fb299fa2Sopenharmony_ci explicit FloatExpression(float v) : UScriptExpression(UScriptExpression::EXPRESSION_TYPE_FLOAT) 96fb299fa2Sopenharmony_ci { 97fb299fa2Sopenharmony_ci value_ = v; 98fb299fa2Sopenharmony_ci } 99fb299fa2Sopenharmony_ci 100fb299fa2Sopenharmony_ci ~FloatExpression() override {} 101fb299fa2Sopenharmony_ci 102fb299fa2Sopenharmony_ci UScriptValuePtr Execute(ScriptInterpreter &inter, UScriptContextPtr local) override; 103fb299fa2Sopenharmony_ci 104fb299fa2Sopenharmony_ci static UScriptExpression* CreateExpression(float value) 105fb299fa2Sopenharmony_ci { 106fb299fa2Sopenharmony_ci return new FloatExpression(value); 107fb299fa2Sopenharmony_ci } 108fb299fa2Sopenharmony_ci 109fb299fa2Sopenharmony_ciprivate: 110fb299fa2Sopenharmony_ci float value_; 111fb299fa2Sopenharmony_ci}; 112fb299fa2Sopenharmony_ci 113fb299fa2Sopenharmony_ciclass StringExpression : public UScriptExpression { 114fb299fa2Sopenharmony_cipublic: 115fb299fa2Sopenharmony_ci explicit StringExpression(const std::string str) : UScriptExpression(UScriptExpression::EXPRESSION_TYPE_STRING), 116fb299fa2Sopenharmony_ci value_(str) {} 117fb299fa2Sopenharmony_ci 118fb299fa2Sopenharmony_ci ~StringExpression() override {} 119fb299fa2Sopenharmony_ci 120fb299fa2Sopenharmony_ci UScriptValuePtr Execute(ScriptInterpreter &inter, UScriptContextPtr local) override; 121fb299fa2Sopenharmony_ci 122fb299fa2Sopenharmony_ci static UScriptExpression* CreateExpression(const std::string value) 123fb299fa2Sopenharmony_ci { 124fb299fa2Sopenharmony_ci return new StringExpression(value); 125fb299fa2Sopenharmony_ci } 126fb299fa2Sopenharmony_ciprivate: 127fb299fa2Sopenharmony_ci std::string value_; 128fb299fa2Sopenharmony_ci}; 129fb299fa2Sopenharmony_ci 130fb299fa2Sopenharmony_ciclass IdentifierExpression : public UScriptExpression { 131fb299fa2Sopenharmony_cipublic: 132fb299fa2Sopenharmony_ci explicit IdentifierExpression(const std::string str) 133fb299fa2Sopenharmony_ci : UScriptExpression(UScriptExpression::EXPRESSION_TYPE_IDENTIFIER), identifier_(str) {} 134fb299fa2Sopenharmony_ci 135fb299fa2Sopenharmony_ci ~IdentifierExpression() override {} 136fb299fa2Sopenharmony_ci 137fb299fa2Sopenharmony_ci UScriptValuePtr Execute(ScriptInterpreter &inter, UScriptContextPtr local) override; 138fb299fa2Sopenharmony_ci 139fb299fa2Sopenharmony_ci static UScriptExpression* CreateExpression(const std::string value) 140fb299fa2Sopenharmony_ci { 141fb299fa2Sopenharmony_ci return new IdentifierExpression(value); 142fb299fa2Sopenharmony_ci } 143fb299fa2Sopenharmony_ci 144fb299fa2Sopenharmony_ci const std::string GetIdentifier() 145fb299fa2Sopenharmony_ci { 146fb299fa2Sopenharmony_ci return identifier_; 147fb299fa2Sopenharmony_ci } 148fb299fa2Sopenharmony_ci 149fb299fa2Sopenharmony_ci static int32_t GetIdentifierName(UScriptExpression *expression, std::string &name); 150fb299fa2Sopenharmony_ciprivate: 151fb299fa2Sopenharmony_ci std::string identifier_; 152fb299fa2Sopenharmony_ci}; 153fb299fa2Sopenharmony_ci 154fb299fa2Sopenharmony_ciclass BinaryExpression : public UScriptExpression { 155fb299fa2Sopenharmony_cipublic: 156fb299fa2Sopenharmony_ci BinaryExpression(ExpressionAction action, UScriptExpression *left, UScriptExpression *right) 157fb299fa2Sopenharmony_ci : UScriptExpression(UScriptExpression::EXPRESSION_TYPE_BINARY), action_(action), left_(left), right_(right) {} 158fb299fa2Sopenharmony_ci 159fb299fa2Sopenharmony_ci ~BinaryExpression() override; 160fb299fa2Sopenharmony_ci 161fb299fa2Sopenharmony_ci UScriptValuePtr Execute(ScriptInterpreter &inter, UScriptContextPtr local) override; 162fb299fa2Sopenharmony_ci 163fb299fa2Sopenharmony_ci static UScriptExpression* CreateExpression(ExpressionAction action, UScriptExpression *left, 164fb299fa2Sopenharmony_ci UScriptExpression *right); 165fb299fa2Sopenharmony_ciprivate: 166fb299fa2Sopenharmony_ci UScriptExpression::ExpressionAction action_; 167fb299fa2Sopenharmony_ci UScriptExpression* left_ = nullptr; 168fb299fa2Sopenharmony_ci UScriptExpression* right_ = nullptr; 169fb299fa2Sopenharmony_ci}; 170fb299fa2Sopenharmony_ci 171fb299fa2Sopenharmony_ciclass AssignExpression : public UScriptExpression { 172fb299fa2Sopenharmony_cipublic: 173fb299fa2Sopenharmony_ci AssignExpression(const std::string identifier, UScriptExpression *expression) 174fb299fa2Sopenharmony_ci : UScriptExpression(UScriptExpression::EXPRESSION_TYPE_ASSIGN), identifier_(identifier), 175fb299fa2Sopenharmony_ci expression_(expression) {} 176fb299fa2Sopenharmony_ci 177fb299fa2Sopenharmony_ci ~AssignExpression() override; 178fb299fa2Sopenharmony_ci 179fb299fa2Sopenharmony_ci UScriptValuePtr Execute(ScriptInterpreter &inter, UScriptContextPtr local) override; 180fb299fa2Sopenharmony_ci 181fb299fa2Sopenharmony_ci void AddIdentifier(const std::string &identifier); 182fb299fa2Sopenharmony_ci 183fb299fa2Sopenharmony_ci static UScriptExpression* CreateExpression(const std::string identifier, UScriptExpression *expression); 184fb299fa2Sopenharmony_ci static UScriptExpression* AddIdentifier(UScriptExpression *expression, const std::string identifier); 185fb299fa2Sopenharmony_ciprivate: 186fb299fa2Sopenharmony_ci std::string identifier_; 187fb299fa2Sopenharmony_ci std::vector<std::string> multipleIdentifiers_; // 最大支持4个参数a,b,v = 1 188fb299fa2Sopenharmony_ci UScriptExpression* expression_ = nullptr; 189fb299fa2Sopenharmony_ci}; 190fb299fa2Sopenharmony_ci 191fb299fa2Sopenharmony_ciclass FunctionCallExpression : public UScriptExpression { 192fb299fa2Sopenharmony_cipublic: 193fb299fa2Sopenharmony_ci FunctionCallExpression(const std::string identifier, ScriptParams *params) 194fb299fa2Sopenharmony_ci : UScriptExpression(UScriptExpression::EXPRESSION_TYPE_FUNC), functionName_(identifier), params_(params) {} 195fb299fa2Sopenharmony_ci 196fb299fa2Sopenharmony_ci ~FunctionCallExpression() override; 197fb299fa2Sopenharmony_ci 198fb299fa2Sopenharmony_ci UScriptValuePtr Execute(ScriptInterpreter &inter, UScriptContextPtr local) override; 199fb299fa2Sopenharmony_ci 200fb299fa2Sopenharmony_ci static UScriptExpression* CreateExpression(const std::string identifier, ScriptParams *params); 201fb299fa2Sopenharmony_ciprivate: 202fb299fa2Sopenharmony_ci std::string functionName_; 203fb299fa2Sopenharmony_ci ScriptParams* params_ = nullptr; 204fb299fa2Sopenharmony_ci}; 205fb299fa2Sopenharmony_ci} // namespace Uscript 206fb299fa2Sopenharmony_ci#endif // _HS_EXPRESSION_H 207