16#include <unordered_map>
37 using ScriptTable = std::unordered_map<std::string, ScriptVar>;
149 return _indexVarSpace;
165 _indexVarSpace = index;
177 return a._type == b._type
178 && a._indexVarSpace == b._indexVarSpace
179 && a._value == b._value;
196 _str{ std::string{str} }
239 for (
size_t i = 0; i < expr.
_allToken.size() - 1; ++i)
263 ret._indexVarSpace = _index;
264 ret._value = _vecString.size();
265 _vecString.push_back(std::string{ v });
272 ret._indexVarSpace = _index;
273 ret._value = _vecFunction.size();
274 _vecFunction.push_back(v);
281 ret._indexVarSpace = _index;
282 ret._value = _vecVector.size();
283 _vecVector.push_back({});
297 return _vecString[i];
301 return _vecFunction[i];
305 return _vecVector[i];
310 std::vector<ScriptString> _vecString;
311 std::vector<ScriptTable> _vecClass;
312 std::vector<ScriptVector> _vecVector;
313 std::vector<ScriptTable> _vecTable;
314 std::vector<ScriptFunction> _vecFunction;
315 std::vector<ScriptExpr> _vecExpr;
350 std::string
GetSource(
bool line_number =
true,
bool header =
true,
bool footer =
true)
const;
407 std::unordered_map<std::string, ScriptVar> _allVar;
411 std::vector<ScriptVarSpace*> _allVarSpace;
419 std::vector<ScriptIndex> _stackVar;
436 void _stack_pop(
size_t i);
466 void SetVariableString(ScriptVar var,
ScriptString str);
467 void SetVariableVector(ScriptVar var,
const ScriptVector& vec);
478 std::vector<ScriptExprToken>
ConvertMid(
const std::vector<ScriptExprToken>& vec);
511 ScriptVar var = _varSpaceGlobal.AddFunction(func);
512 _allVar[std::string{ name }] = var;
516 vm._allVar = _allVar;
517 vm._varSpaceGlobal = _varSpaceGlobal;
532 std::unordered_map<std::string_view, int> _allKeyword;
534 std::unordered_map<std::string_view, int> _allOperator;
536 std::list<ScriptVarSpace*> _listVarSpaceFree;
538 std::unordered_map<std::string, ScriptVar> _allVar;
bool IsVariable(std::string_view str)
是否变量名
std::string Preprocess(std::string_view src)
预处理代码(行号不变)
ScriptBlock Compile(std::string_view src)
int GetOperatorPriority(std::string_view str)
返回操作符优先级,越大越优先
bool IsOperator(std::string_view str)
是否操作符
bool IsKeyword(std::string_view str)
是否关键字
bool CheckToken(ScriptExprTokenType type)
bool IsGlobalVariable(std::string_view str)
是否全局变量名
void PreprocessLineNumber(ScriptBlock &block, std::string_view src)
void RegisterFunction(std::string_view name, ScriptFunction func)
注册函数
void CopyVariableToVm(ScriptVM &vm)
ScriptVar OpArithmetic(ScriptVM &vm, ScriptOperator op, const ScriptVar &v0, const ScriptVar &v1)
ScriptVar MakeLiteral(ScriptBlock &block, const ScriptToken &token)
生成字面量
void OpAssign(ScriptVM &vm, ScriptVar &v0, const ScriptVar &v1)
ScriptExprToken MakeExprToken(ScriptBlock &block, const ScriptToken &token)
生成表达式token(字面量是编译器信息,需要生成到block)
std::vector< ScriptExprToken > ConvertMid(const std::vector< ScriptExprToken > &vec)
bool IsMaybeOperator(char ch)
是否可能为操作符内容(变量名不可能出现)
ScriptExprTokenType GetTokenType(std::string_view str)
返回token类型
ScriptOperator String2Operator(std::string_view str)
字符串转操作符变量
std::string Variable2String(const ScriptVar &var)
bool Variable2Bool(const ScriptVar &var)
void Execute(const ScriptBlock &block)
friend class ScriptSystem
ScriptVector & GetVetorRef(size_t i)
void SetString(size_t i, const ScriptString &str)
const ScriptString & GetString(size_t i) const
void SetVector(size_t i, const ScriptVector &vec)
ScriptVar AddFunction(ScriptFunction v)
const ScriptFunction & GetFunction(size_t i) const
ScriptVar AddString(std::string_view v)
ScriptIndexVS GetIndex() const
ScriptVarSpace(ScriptIndexVS index, size_t level)
std::unordered_map< std::string, ScriptVar > ScriptTable
constexpr ScriptIndexVS SCRIPT_INDEX_VS_0
std::function< int(ScriptVM &, const ScriptParam &)> ScriptFunction
constexpr ScriptIndexVS SCRIPT_INDEX_VS_ITERAL
ScriptExprTokenType
表达式token类型
constexpr ScriptIndexVS SCRIPT_INDEX_VS_ERROR
std::string to_string(T v)
to_string包装
std::vector< ScriptVar > ScriptVector
bool IsBaseType(ScriptVarType type)
是基础类型
constexpr ScriptIndex SCRIPT_INDEX_RETURN
constexpr ScriptIndexVS SCRIPT_INDEX_VS_TEMP
constexpr bool operator==(const Array< T, N > &a, const Array< T, N > &b)
std::vector< std::string > _vecSource
ScriptVarSpace _varSpaceIteral
std::vector< ScriptSegment > _allSeg
std::string GetSource(bool line_number=true, bool header=true, bool footer=true) const
std::array< ScriptExpr, 3 > _cond
std::vector< ScriptExprToken > _allToken
ScriptExprTokenType _type
std::string GetTypeString() const
std::vector< ScriptExpr > _allExpr
ScriptToken(Type type, std::string_view str)
void _set_space_index(ScriptIndexVS index)
void SetType(ScriptVarType type)
std::string_view GetTypeString() const
ScriptVarType GetType() const
ScriptFloat ToFloat() const
void FromInt(ScriptInt v)
void FromFloat(ScriptFloat v)
ScriptOperator ToOperator() const
ScriptIndexVS GetSpaceIndex() const
uint64_t GetValue() const
friend bool operator==(const ScriptVar &a, const ScriptVar &b)
uint64_t GetIndex() const
void FromOperator(ScriptOperator v)
void SetValue(uint64_t v)
friend class ScriptVarSpace