16#include <unordered_map>
36 using ScriptTable = std::unordered_map<std::string, ScriptVar>;
148 return _indexVarSpace;
164 _indexVarSpace = index;
176 return a._type == b._type
177 && a._indexVarSpace == b._indexVarSpace
178 && a._value == b._value;
195 _str{ std::string{str} }
238 for (
size_t i = 0; i < expr.
_allToken.size() - 1; ++i)
262 ret._indexVarSpace = _index;
263 ret._value = _vecString.size();
264 _vecString.push_back(std::string{ v });
271 ret._indexVarSpace = _index;
272 ret._value = _vecFunction.size();
273 _vecFunction.push_back(v);
280 ret._indexVarSpace = _index;
281 ret._value = _vecVector.size();
282 _vecVector.push_back({});
296 return _vecString[i];
300 return _vecFunction[i];
304 return _vecVector[i];
309 std::vector<ScriptString> _vecString;
310 std::vector<ScriptTable> _vecClass;
311 std::vector<ScriptVector> _vecVector;
312 std::vector<ScriptTable> _vecTable;
313 std::vector<ScriptFunction> _vecFunction;
314 std::vector<ScriptExpr> _vecExpr;
349 std::string
GetSource(
bool line_number =
true,
bool header =
true,
bool footer =
true)
const;
406 std::unordered_map<std::string, ScriptVar> _allVar;
410 std::vector<ScriptVarSpace*> _allVarSpace;
418 std::vector<ScriptIndex> _stackVar;
435 void _stack_pop(
size_t i);
465 void SetVariableString(ScriptVar var,
ScriptString str);
466 void SetVariableVector(ScriptVar var,
const ScriptVector& vec);
477 std::vector<ScriptExprToken>
ConvertMid(
const std::vector<ScriptExprToken>& vec);
510 ScriptVar var = _varSpaceGlobal.AddFunction(func);
511 _allVar[std::string{ name }] = var;
515 vm._allVar = _allVar;
516 vm._varSpaceGlobal = _varSpaceGlobal;
531 std::unordered_map<std::string_view, int> _allKeyword;
533 std::unordered_map<std::string_view, int> _allOperator;
535 std::list<ScriptVarSpace*> _listVarSpaceFree;
537 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