NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
context.h
Go to the documentation of this file.
1#pragma once
2#ifndef INCLUDED_NEWLANG_CONTEXT_
3#define INCLUDED_NEWLANG_CONTEXT_
4
5#include "term.h"
6
7namespace newlang {
8
48 std::string ns;
49 std::map<std::string, VariablePair> vars;
50 };
51
52 class LatterType : public std::variant<VariablePair, VariablePair *> {
53 public:
54
55 LatterType(VariablePair *pair = nullptr) : std::variant<VariablePair, VariablePair *>(pair) {
56 }
57
58 explicit LatterType(const VariablePair pair) : std::variant<VariablePair, VariablePair *>(pair) {
59 }
60
61 explicit LatterType(VariablePair &pair) : std::variant<VariablePair, VariablePair *>(&pair) {
62 }
63
64 template <typename D>
65 static LatterType Create(TermPtr term, D d) {
66 return LatterType(VariablePair(term, d));
67 }
68
69 inline VariablePair & GetVariablePair(bool editable = false) {
70 if (std::holds_alternative<VariablePair>(*this)) {
71 return std::get<VariablePair>(*this);
72 } else if (std::get<VariablePair *>(*this)) {
73 return *std::get<VariablePair *>(*this);
74 }
75 if (editable) {
76 LOG_RUNTIME("GetVariablePair!!!!");
77 }
78 return const_cast<VariablePair &> (getNonePair());
79 }
80
81 inline operator bool() {
82 return std::holds_alternative<VariablePair>(*this) || std::get<VariablePair *>(*this);
83 }
84
85// inline LatterType & operator=(const LatterType &var) = default;
86// inline LatterType & operator=(const LatterType &var)
87// inline LatterType & operator=(const LatterType &var) {
88// static_cast<std::variant<VariablePair, VariablePair *>>(*this) = const_cast<LatterType>(var).GetVariablePair();
89// return *this;
90// }
91
92 inline LatterType & operator=(const VariablePair var) {
93 static_cast<std::variant<VariablePair, VariablePair *>>(*this) = static_cast<VariablePair>(var);
94 return *this;
95 }
96
97// inline LatterType & operator=(LatterType && var) {
98// static_cast<std::variant<VariablePair, VariablePair *>>(*this) = var;
99// return *this;
100// }
101
102// inline ObjPtr asObject(bool edit) {
103// return Variable::Object(const_cast<Variable *> (&this->GetVariablePair(edit).var));
104// }
105
106 };
107
108
109 typedef std::vector< LatterType > VariablePairList;
110
111 class Context : public std::vector<VariableScope>, public std::enable_shared_from_this<Context> {
112 friend class CtxPush;
113
114 public:
117
118 // VariableType m_latter;
119 // std::map<std::string, GlobalName *> m_cache;
120 // В нем также содержится кеш имен для используемых статических объектов (функции и статические переменные),
121 // чтобы не блокировать RunTime для чтения при каждом поиске глобального объекта.
122
123 // Module &m_static;
124
125 Context(RunTime *rt);
126
127 virtual ~Context() {
128 }
129
130 static LatterType Execute(Module &module, TermPtr ast, Context * runner);
131 static LatterType EvalTerm(TermPtr term, Context *runner, bool rvalue = true);
132 static LatterType Eval(TermPtr ast, Context * runner);
133
134 static std::unique_ptr<Sync> CreateSync(const TermPtr &term);
135
137 if (!isInternalName(term->m_normalized)) {
138 LOG_RUNTIME("'%s' is not an internal name!", term->m_text.c_str());
139 }
140 return FindLocalVar(term->m_normalized);
141 }
142 VariablePair * FindLocalVar(const std::string_view name);
143
144 VariablePair * FindObject(const std::string_view int_name);
145 // TermPtr FindInternalName(const std::string_view int_name);
146
147
148 static std::string StringFormat(std::string_view format, Obj & args);
149 static std::string StringPrintf(std::string_view format, Obj & args);
150
158 static ObjPtr Call(Context *runner, Obj &obj, TermPtr & term);
166 static ObjPtr Call(Context *runner, Obj &obj, Obj & args);
167
168 std::string Dump(size_t num = 0);
169
170 protected:
171
172 void PushScope(const TermID id, const std::string_view &name) {
173 std::string ns;
174 if (!name.empty()) {
175 ns = name;
176 if (ns.rfind("::") != ns.size() - 2) {
177 ns += "::";
178 }
179 }
180 push_back({id, ns,
181 {}});
182 }
183
184 void PopScope() {
185 ASSERT(size());
186 pop_back();
187 }
188
189 bool CheckTargetScope(const std::string_view &name) {
190 auto iter = rbegin();
191 while (iter != rend()) {
192 if (iter->ns.compare(name.begin()) == 0) {
193 return iter == rbegin(); // Выход из цикла только если блок текущий (поиск начат с него)
194 }
195 iter++;
196 }
197 LOG_RUNTIME("Named block '%s' not found!", name.begin());
198 }
199
200 static bool HasReThrow(TermPtr &block, Context &stack, Obj &obj);
201
202 std::string MakeNamespace(int skip, bool is_global) {
203 std::string result;
204 auto iter = rbegin();
205 if (skip > 0) {
206 iter += skip;
207 }
208 int count = 0;
209 while (iter != rend()) {
210 if (result.find("::") == 0) {
211 break;
212 }
213 if (skip < 0 && count == -skip) {
214 break;
215 }
216 if (!iter->ns.empty() && (!is_global || !isdigit(iter->ns[0]))) {
217 // The namespace is always padded with ::
218 result.insert(0, iter->ns);
219 }
220 iter++;
221 count++;
222 }
223 return result;
224 }
225
226 static RunTime * GetRT_(Context * runner) {
227 return runner ? runner->m_runtime : nullptr;
228 }
229
230 ObjPtr CreateNative_(TermPtr &proto, const char *module, bool lazzy, const char *mangle_name);
231 static ObjPtr CallNative_(Context *runner, Obj & obj, Obj *args = nullptr);
232
233
234 static ObjPtr CreateArgs_(TermPtr &term, Context * runner);
235 static ObjPtr CreateDict(TermPtr &term, Context * runner);
236 static ObjPtr CreateRange(TermPtr &term, Context * runner);
237 static ObjPtr CreateTensor(TermPtr &term, Context * runner);
238
239 static ObjPtr SetIndexValue(TermPtr &term, ObjPtr value, Context * runner);
240 static ObjPtr SetFieldValue(TermPtr &term, ObjPtr value, Context * runner);
241 static ObjPtr GetIndexValue(TermPtr &term, ObjPtr &value, Context * runner);
242 static ObjPtr GetFieldValue(TermPtr &term, ObjPtr &value, Context * runner);
243
244
245 /*
246 * a, b, c := value
247 * a() := { } func
248 *
249 * a, b, c := ... dict
250 * a, b := b, a swap
251 *
252 * a() := { } func
253 * && a() := { } async func val := *a(); **( val := *a()){ },[...] { }; -> val := await a() ??????????????????????
254 * a() := %() { } coro co_yeld, co_return, co_wait ????????????????
255 */
257
262
263 void EvalLeftVars_(VariablePairList &vars, const TermPtrConst &op);
264 // ObjPtr AssignVars_(ArrayTermType &vars, const TermPtr &r_term, bool is_pure);
265
266
267
270
272
273 static ObjPtr EvalOpMath_(TermPtr &op, Context * runner);
274 static ObjPtr EvalOpLogical_(TermPtr &op, Context * runner);
275 static ObjPtr EvalOpCompare_(TermPtr &op, Context * runner);
276 static ObjPtr EvalOpBitwise_(TermPtr &op, Context * runner);
277 static ObjPtr EvalRange_(TermPtr &op, Context * runner);
278
282
283 static ObjPtr EvalFollow_(TermPtr & op, Context * runner);
284
285
288
289 };
290
291 class CtxPush {
292 public:
294
295 CtxPush(Context &ctx, const TermID id, const TermPtr & ns) : m_ctx(ctx) {
296 m_ctx.PushScope(id, ns ? ns->m_text : "");
297 }
298
300 m_ctx.PopScope();
301 }
302 };
303
304}
305#endif //INCLUDED_NEWLANG_CONTEXT_
void EvalLeftVars_(VariablePairList &vars, const TermPtrConst &op)
Definition context.cpp:2346
static ObjPtr EvalOpMath_(TermPtr &op, Context *runner)
Definition context.cpp:2745
virtual ~Context()
Definition context.h:127
static ObjPtr SetFieldValue(TermPtr &term, ObjPtr value, Context *runner)
Definition context.cpp:2725
static ObjPtr EvalOpCompare_(TermPtr &op, Context *runner)
Definition context.cpp:2778
static std::unique_ptr< Sync > CreateSync(const TermPtr &term)
LatterType m_latter
Definition context.h:116
static LatterType Execute(Module &module, TermPtr ast, Context *runner)
Definition context.cpp:697
ObjPtr EvalEval_(TermPtr &op)
Definition context.cpp:2953
bool CheckTargetScope(const std::string_view &name)
Definition context.h:189
static LatterType EvalTerm(TermPtr term, Context *runner, bool rvalue=true)
Definition context.cpp:1670
std::string MakeNamespace(int skip, bool is_global)
Definition context.h:202
LatterType EvalDoWhile_(TermPtr &op)
Definition context.cpp:2870
ObjPtr EvalInterrupt_(TermPtr &term)
Definition context.cpp:3147
static ObjPtr CallNative_(Context *runner, Obj &obj, Obj *args=nullptr)
Definition context.cpp:1202
static ObjPtr EvalFollow_(TermPtr &op, Context *runner)
Definition context.cpp:2924
static std::string StringPrintf(std::string_view format, Obj &args)
Definition context.cpp:1634
LatterType EvalTryBlock_(TermPtr &block)
Definition context.cpp:759
static ObjPtr EvalRange_(TermPtr &op, Context *runner)
static ObjPtr CreateArgs_(TermPtr &term, Context *runner)
Definition context.cpp:1518
LatterType EvalWhile_(TermPtr &op)
Definition context.cpp:2809
VariablePair * FindObject(const std::string_view int_name)
Definition context.cpp:1920
static ObjPtr CreateRange(TermPtr &term, Context *runner)
Definition context.cpp:1543
static bool HasReThrow(TermPtr &block, Context &stack, Obj &obj)
Definition context.cpp:730
static ObjPtr CreateTensor(TermPtr &term, Context *runner)
Definition context.cpp:1563
void PushScope(const TermID id, const std::string_view &name)
Definition context.h:172
static std::string StringFormat(std::string_view format, Obj &args)
Definition context.cpp:1595
static RunTime * GetRT_(Context *runner)
Definition context.h:226
RunTime * m_runtime
Definition context.h:115
std::string Dump(size_t num=0)
Definition context.cpp:28
LatterType EvalCreateAsValue_(TermPtr &op)
Definition context.cpp:2223
ObjPtr EvalTake_(TermPtr &op)
Definition context.cpp:1896
static ObjPtr EvalOpLogical_(TermPtr &op, Context *runner)
Definition context.cpp:2736
VariablePair * FindLocalVar(const TermPtr &term)
Definition context.h:136
ObjPtr EvalOp_(TermPtr &op)
LatterType EvalCreateAsEllipsis_(TermPtr &op)
Definition context.cpp:2147
static ObjPtr Call(Context *runner, Obj &obj, TermPtr &term)
Definition context.cpp:860
LatterType EvalCreateAsFunc_(TermPtr &op)
Definition context.cpp:2112
static ObjPtr CreateDict(TermPtr &term, Context *runner)
Definition context.cpp:1532
void PopScope()
Definition context.h:184
static ObjPtr SetIndexValue(TermPtr &term, ObjPtr value, Context *runner)
Definition context.cpp:2626
ObjPtr EvalIterator_(TermPtr &term)
Definition context.cpp:3019
static ObjPtr GetFieldValue(TermPtr &term, ObjPtr &value, Context *runner)
Definition context.cpp:2720
static ObjPtr EvalOpBitwise_(TermPtr &op, Context *runner)
Definition context.cpp:3115
ObjPtr CreateNative_(TermPtr &proto, const char *module, bool lazzy, const char *mangle_name)
Definition context.cpp:1913
LatterType EvalCreate_(TermPtr &op)
Definition context.cpp:2025
LatterType EvalCreateAsFilling_(TermPtr &op)
Definition context.cpp:2217
static ObjPtr GetIndexValue(TermPtr &term, ObjPtr &value, Context *runner)
Definition context.cpp:2682
Context & m_ctx
Definition context.h:293
CtxPush(Context &ctx, const TermID id, const TermPtr &ns)
Definition context.h:295
LatterType(VariablePair &pair)
Definition context.h:61
VariablePair & GetVariablePair(bool editable=false)
Definition context.h:69
LatterType(VariablePair *pair=nullptr)
Definition context.h:55
static LatterType Create(TermPtr term, D d)
Definition context.h:65
LatterType(const VariablePair pair)
Definition context.h:58
LatterType & operator=(const VariablePair var)
Definition context.h:92
int result
Definition lexer.l:367
#define LOG_RUNTIME(format,...)
Definition logger.h:26
#define ASSERT(condition)
Definition logger.h:60
Definition nlc.h:59
TermID
Definition term.h:119
const VariablePair & getNonePair()
Definition parser.cpp:1056
std::vector< LatterType > VariablePairList
Definition context.h:109
std::shared_ptr< Term > TermPtr
Definition variable.h:33
std::shared_ptr< Obj > ObjPtr
Definition variable.h:28
std::shared_ptr< const Term > TermPtrConst
Definition variable.h:34
bool isInternalName(const std::string_view name)
Definition types.h:1049
std::map< std::string, VariablePair > vars
Definition context.h:49