NewLang Project
Yet another programm language
Loading...
Searching...
No Matches
term.cpp
Go to the documentation of this file.
1#include "term.h"
2#include "runtime.h"
3
4using namespace newlang;
5
7 ASSERT(term);
8 ASSERT(term->m_id == TermID::ARGUMENT);
9 ASSERT(!term->m_text.empty());
10 char * pEnd = nullptr;
11 size_t index = std::strtoul(term->getText().data() + 1, &pEnd, 10);
12 if (term->m_text.data() + term->getText().size() != pEnd) {
13 LOG_RUNTIME("Float error '%s' or out of range!", term->getText().c_str());
14 }
15 return index;
16}
17
18/*
19 *
20 *
21 */
22
27
32
37
38TermPtr Term::CreateIntName(const std::string_view name, std::string_view int_name, TermID id) {
39 TermPtr result = Term::Create(id, name.begin(), parser::token_type::NAME);
40 result->m_normalized = int_name;
41 return result;
42}
43
44TermPtr Term::CreateName(std::string name, TermID id) {
45 TermPtr result = Term::Create(id, name.c_str(), parser::token_type::NAME);
46 return result;
47}
48
50 if (type) {
51
52 // if (type->m_list) {
53 // m_id = TermID::BLOCK;
54 // ListToVector(type, m_block);
55 // }
56 //
57 // ASSERT(!type->m_list);
58 // ASSERT(type->m_type_allowed.empty());
59 // ASSERT(m_type_allowed.empty());
60 // m_type_allowed.push_back(type);
61 m_type = type;
62 // m_type_name = m_type->asTypeString();
63 // Check type
64 if (m_id == TermID::INTEGER) {
66 if (!canCastLimit(type_val, typeFromString(m_type, nullptr))) {
67 NL_PARSER(type, "Error cast '%s' to integer type '%s'", m_text.c_str(), m_type->m_text.c_str());
68 }
69 } else if (m_id == TermID::NUMBER) {
71 if (!canCastLimit(type_val, typeFromString(m_type, nullptr))) {
72 NL_PARSER(type, "Error cast '%s' to numeric type '%s'", m_text.c_str(), m_type->m_text.c_str());
73 }
74 } else if (m_id == TermID::COMPLEX) {
75 // ObjType type_val = typeFromLimit(parseComplex(m_text.c_str()), ObjType::Complex64);
76 // if (!canCastLimit(type_val, typeFromString(m_type, nullptr))) {
77 NL_PARSER(type, "Error cast '%s' to complex type '%s'", m_text.c_str(), m_type->m_text.c_str());
78 // }
79 }
80 } else if (!m_type) {
81
82 // Default type
83 if (m_id == TermID::INTEGER) {
85 } else if (m_id == TermID::NUMBER) {
87 } else if (m_id == TermID::COMPLEX) {
88 NL_PARSER(type, "Error cast '%s' to complex type '%s'", m_text.c_str(), m_type->m_text.c_str());
89 // m_type = getDefaultType(typeFromLimit(parseComplex(m_text.c_str()), ObjType::Complex64));
90 } else if (m_id == TermID::STRCHAR) {
92 } else if (m_id == TermID::STRWIDE) {
94 } else if (m_id == TermID::DICT) {
96 } else if (m_id == TermID::RATIONAL) {
98 } else if (m_id == TermID::RANGE) {
100 } else if (m_id == TermID::ITERATOR) {
102 // } else if (m_id == TermID::INT_MINUS || m_id == TermID::INT_PLUS || m_id == TermID::INT_REPEAT) {
103 // m_type = getDefaultType(ObjType::Interruption);
104 }
105 }
106}
107
108/*
109 *
110 *
111 */
112bool Term::CheckTermEq(const TermPtr &term1, const TermPtr &term2, bool type, RuntimePtr rt) {
113 if (term1 == nullptr && term2 == nullptr) {
114 return true;
115 }
116 if (!!term1 != !!term2) {
117 if (type) {
118 return true;
119 }
120 return false;
121 }
122 if (term1->m_text.compare(term2->m_text) != 0) {
123 return false;
124 }
125 if (term1->isCall() != term2->isCall()) {
126 return false;
127 }
128 if (!!term1->m_dims != !!term2->m_dims) {
129 return false;
130 }
131 if (term1->m_dims && term2->m_dims && term1->m_dims->size() != term2->m_dims->size()) {
132 return false;
133 }
134 for (int i = 0; term1->m_dims && i < term1->m_dims->size(); i++) {
135 if (!CheckTermEq(term1->m_dims->at(i).second, term2->m_dims->at(i).second, false, rt)) {
136 return false;
137 }
138 }
139 if (term1->size() != term2->size()) {
140 return false;
141 }
142 for (int i = 0; i < term1->size(); i++) {
143 if (term1->at(i).first.compare(term2->at(i).first) != 0) {
144 return false;
145 }
146 if (!CheckTermEq(term1->at(i).second, term2->at(i).second, false, rt)) {
147 return false;
148 }
149 }
150 return CheckTermEq(term1->m_type, term2->m_type, true, rt);
151}
152
153/*
154 *
155 *
156 *
157 *
158 *
159 *
160 *
161 *
162 */
163
165m_glob(glob), m_modules(modules), m_block_num(1) {
166 clear();
167}
168
170 std::deque< ScopeVars >::clear();
171 // First level for local_thread objects
172 // reserve(200);
173 push_back({Term::Create(TermID::NAME, ""),
174 {}, false,
175 {}}
176 );
177 m_modules.clear();
178 m_modules["\\\\"] = {};
179}
180
181void NameLookupStack::PushScope(TermPtr ns, bool is_function) {
182
183 ScopeVars block;
184 if (ns) {
185 block.scope_name = ns;
186 if (ns->m_text.rfind("::") != ns->m_text.size() - 2) {
187 ns->m_text += "::";
188 }
189 } else {
190 // An unnamed block has a unique numeric identifier (whereas in code the identifier cannot begin with a number)
191 block.scope_name = Term::CreateName(std::to_string(m_block_num));
192 block.scope_name->m_text += "::";
193 m_block_num++;
194 }
195
196 block.function_name = is_function;
197 push_back(block);
198}
199
201 std::vector<std::string> list;
202
203 TermPtr next = ns;
204 bool is_clear = false;
205 while (next) {
206 list.push_back(next->m_text);
207 if (next->m_text.compare("_") == 0) {
208 is_clear = true;
209 list.clear();
210 } else {
211 if (list.back().size() < 2 || !(list.back()[list.back().size() - 1] == ':' && list.back()[list.back().size() - 2] == ':')) {
212 list.back() += "::";
213 }
214 }
215 next = next->m_right;
216 }
217 if (is_clear && list.size() > 1) {
218 NL_MESSAGE(LOG_LEVEL_INFO, ns, "Using the clear search symbol with a mamespace list!");
219 }
220 rbegin()->ns_lookup = list;
221}
222
223void NameLookupStack::ExpandNamespace(std::string & name) {
224 size_t pos = name.find("@::");
225 if (pos != std::string::npos) {
226 name = name.replace(pos, 3, GetNamespace());
227 }
228 pos = name.find("$::");
229 if (pos != std::string::npos) {
230 name = name.replace(pos, 3, GetFuntionName());
231 }
232}
233
234bool NameLookupStack::CheckInterrupt(std::string_view name) {
235 std::string ns(name);
236
237 if (!(ns.size() > 1 && ns[ns.size() - 1] == ':' && ns[ns.size() - 2] == ':')) {
238 ns += "::";
239 }
240 auto iter = rbegin();
241 while (iter != rend()) {
242 if (iter->scope_name && iter->scope_name->m_namespace && iter->scope_name->m_namespace->m_text.compare(ns.c_str()) == 0) {
243 return iter == rbegin();
244 }
245 iter++;
246 }
247 LOG_RUNTIME("Named block '%s' not found!", name.begin());
248}
249
250std::string NameLookupStack::MakeNamespace(int skip, bool is_global) {
251 std::string result;
252 auto iter = rbegin();
253 if (skip > 0) {
254 iter += skip;
255 }
256 int count = 0;
257 while (iter != rend()) {
258 if (result.find("::") == 0) {
259 break;
260 }
261 if (skip < 0 && count == -skip) {
262 break;
263 }
264 if (!is_global && iter == rbegin() && isdigit(iter->scope_name->m_text[0])) {
265 // последний не именованный (цифровой) блок включается в имя только для локльных имен
266 result.insert(0, iter->scope_name->m_text); // The namespace is always padded with ::
267 } else if (!isdigit(iter->scope_name->m_text[0])) {
268 // для глобальных имен не именованный (цифровой) блок в имя не включается
269 result.insert(0, iter->scope_name->m_text); // The namespace is always padded with ::
270 }
271 iter++;
272 count++;
273 }
274 return result;
275}
276
278 auto iter = rbegin();
279 while (iter != rend()) {
280 if (iter->function_name) {
281 ASSERT(iter->scope_name);
282 return iter->scope_name->m_text;
283 }
284 iter++;
285 }
286 LOG_RUNTIME("Function name not found!");
287}
288
290 std::string result;
291 auto iter = rbegin();
292 while (iter != rend()) {
293 if (result.find("::") == 0) {
294 break;
295 }
296 ASSERT(iter->scope_name);
297 // An unnamed block of code has a numeric name,
298 // and identifiers with a number at the beginning
299 // of the name are prohibited by the language syntax.
300 if (!isdigit(iter->scope_name->m_text[0])) {
301 // The namespace is always padded with ::
302 result.insert(0, iter->scope_name->m_text);
303 }
304 iter++;
305 }
306 return result;
307}
308
309std::string NameLookupStack::MakeInternalName(const TermPtr & term, bool is_static) {
310 ASSERT(term);
311 std::string name(term->m_text);
312 if (term->m_namespace) {
313 name.insert(0, term->m_namespace->m_text);
314 }
315 return MakeInternalName(name, is_static);
316}
317
318std::string NameLookupStack::MakeInternalName(const std::string_view name, bool is_static) {
319
320 /*
321 * ::var ::= 0; # ::var:: static global
322 * var ::= 0; # var:: static module (соханяется в stack[0])
323 * $var := 0; # var$ thread_local (соханяется в stack[0] <автоматически>)
324 *
325 * @::var ::= 0; # var::
326 * :: :type := :Type; # ::type::: type (static) global
327 * :: :cls := Class(){}; # ::cls::: class (static) global
328 *
329 * :type := :Type; # type::: type (static) module
330 * :cls := Class(){}; # cls::: class (static) module
331 * @:: :type := :Type; # type:::
332 * @:: :cls := Class(){}; # cls:::
333 *
334 * ns {
335 * $var := 0; # var$ local
336 * var := 0; # var$ local
337 * ::var := 0; # ::var:: static (global) (соханяется в stack[0])
338 * @::var ::= 0; # ns::var:: static (module) (соханяется в stack[0])
339 *
340 * :type := :Type; # ns::type::: (соханяется в stack[0])
341 * :cls := Class(){}; # ns::cls::: (соханяется в stack[0])
342 *
343 * @::func1() ::= {}; # ns::func1:: (соханяется в stack[0])
344 * func2() ::= {}; # ns::func2:: type (static) module (соханяется в stack[0])
345 * $func3() ::= {}; # ns::func3$ вместо ns::func3:: (соханяется в stack[0])
346 *
347 *
348 * Деление объектов по времени жизни:
349 * Постоянные (статические) vs Локальные (временные/на стеке/контролируемые)
350 * Постоянные - значение объекта сохраняется между вызовами и один объект разделяется для всех всех потоков сразу.
351 * Локальные - значение объекта уничтожается при завершении области видимости и в каждом потоке создается свой экзепляр.
352 * Функции не могут быть локальными объектами и не могут быть переопределены, но могут быть перекрыты другой функцией.
353 *
354 * Области видимости объектов по мере расширения:
355 * локальная (текущий блок кода), область имен (объект класса), текущий модуль, пакет (несколько модулей), глобальная.
356 *
357 * Если при создании объекта квалификатор (сигил) объекта не указан, т.е. при создании объекта указано простое имя,
358 * то время жизни объекта определяется типом создаваемого объекта.
359 * При создании функции создается статический объект, т.е. func() ::= ... равнозначно определению @::func() ::= ...
360 * Перемененная создается локальной, т.е. var равнозначно определению $var, если признак статического объекта не указан явно.
361 *
362 *
363 *
364 * Фиксированный vs Динамический (размер по запросу)
365 *
366 * Отличие от статических переменных С++
367 * Момент выделения памяти зависит от реализации и может быть как во время компиляции (как в С++),
368 * так по запросу (при первом обращении при загрузке модуля).
369 * Инициалиазция начальным значением, только в момент выполнения кода иницаилиазции (при загрузке модуля),
370 * а не при старте приложения как в С++.
371 */
372
373 /*
374 * Независимо от типа объекта, должна быть возможность создавать уникальные идентификаторы * как для глобальных, так и для локальных имен.
375 * Алгоритм генерации уникального имени заключается в создании
376 */
377
378 ASSERT(!name.empty());
379
380 std::string result(name);
381 if (isTrivialName(name)) {
382 if (is_static) {
383 // Function or top scope - static for module/package
384 result += "::";
385 result.insert(0, GetNamespace());
386 } else {
387 // local name
388 result += "$";
389 }
390 } else {
391
392 size_t pos = result.find("@::");
393 if (pos != std::string::npos) {
394 result = result.replace(pos, 3, GetNamespace());
395 } else if ((pos = result.find("$::")) != std::string::npos) {
396 result = result.replace(pos, 3, GetFuntionName());
397 }
398
399 pos = result.find(":::");
400 if (pos != std::string::npos) {
401 // Global type
402 std::rotate(std::begin(result) + pos, std::begin(result) + pos + 1, std::end(result));
403 }
404
405 if (isStaticName(result)) {
406 // Full name
407 result += "::";
408 } else if (result[0] == ':') {
409 // type or class
410 std::rotate(std::begin(result), std::begin(result) + 1, std::end(result));
411 result += "::";
412 result.insert(0, GetNamespace());
413 } else {
414 if (result[0] != '$') {
415 ASSERT(result[0] == '$'); // Local name
416 }
417 std::rotate(std::begin(result), std::begin(result) + 1, std::end(result));
418 if (is_static) {
419 result.insert(0, GetNamespace());
420 }
421 }
422 }
423 return result;
424}
425
426bool NameLookupStack::AddName(const TermPtr var, const char * alt_name) {
427
428 ASSERT(var);
429
430 std::string_view name;
431 if (alt_name) {
432 name = alt_name;
433 } else {
434 name = var->m_normalized;
435 }
436 if (name.empty()) {
437 LOG_RUNTIME("Internal name of '%s' not exist!", var->toString().c_str());
438 }
439
440 auto found = m_modules[StorageTerm::MODULE_MAIN].find(name.begin());
441 if (found != m_modules[StorageTerm::MODULE_MAIN].end()) {
442 if (!Term::CheckTermEq(found->second, var)) {
443 NL_MESSAGE(LOG_LEVEL_INFO, var, "Object '%s' does not match its pre-declaration as '%s'!",
444 name.begin(), found->second->toString().c_str());
445 }
446 return false;
447 }
448
449 if (isGlobalScope(name)) {
450 var->m_level = 0;
451 } else {
452 var->m_level = size();
453 }
454
455 ASSERT(!empty());
456
457 std::map<std::string, TermPtr> * map_level = &back().vars;
458 if (isStaticName(name)) {
460 }
461
462 if (map_level->find(name.begin()) != map_level->end()) {
463 NL_MESSAGE(LOG_LEVEL_INFO, var, "Var '%s' already exist!", name.begin());
464 return false;
465 }
466
467 map_level->insert({name.begin(), var});
468
469 if (isGlobalScope(name)) {
470 m_glob.RegisterObject(false, name, var, std::monostate{}); //VarData<std::monostate{}, const TermPtr > (std::monostate(), nullptr)
471 }
472 return true;
473}
474
475TermPtr NameLookupStack::FindInternalName(std::string_view int_name) {
476
477 auto iter = rbegin();
478 while (iter != rend()) {
479 if (iter->vars.find(int_name.begin()) != iter->vars.end()) {
480 return iter->vars.find(int_name.begin())->second;
481 }
482 iter++;
483 }
484
485 auto found = m_modules[StorageTerm::MODULE_MAIN].find(int_name.begin());
486 if (found != m_modules[StorageTerm::MODULE_MAIN].end()) {
487 return found->second;
488 }
489
490 VariablePair * glob = m_glob.FindObject(int_name);
491 return glob ? glob->term : nullptr;
492}
493
494TermPtr NameLookupStack::LookupNameVars(const std::string_view name) {
495 TermPtr found;
496
497 if ((found = FindInternalName(name.begin()))) {
498 return found;
499 }
500
501 std::string name_search;
502 name_search = name.begin();
503 name_search += "$";
504 if ((found = FindInternalName(name_search))) {
505 return found;
506 }
507
508 name_search = name.begin();
509 name_search += "::";
510 if ((found = FindInternalName(name_search))) {
511 return found;
512 }
513
514 auto found2 = m_modules[StorageTerm::MODULE_MAIN].find(name_search);
515 if (found2 != m_modules[StorageTerm::MODULE_MAIN].end()) {
516 return found2->second;
517 }
518
519 name_search += ":";
520 if ((found = FindInternalName(name_search))) {
521 return found;
522 }
523 return nullptr;
524}
525
526TermPtr NameLookupStack::LookupNameNamespace(const std::string_view ns, const std::string_view name) {
527 TermPtr found;
528
529 if ((found = LookupNameVars(name))) {
530 return found;
531 }
532
533 std::string name_search(ns.begin());
534 name_search += name;
535 if ((found = LookupNameVars(name_search))) {
536 return found;
537 }
538 return nullptr;
539}
540
542
543 if (isInternalName(name)) {
544 return FindInternalName(name);
545 }
546
547 TermPtr found;
548 bool full_search = isTrivialName(name);
549 if (!full_search) {
550 name = NormalizeName(name);
551 }
552 std::string temp;
553 for (size_t skip = 0; skip < size(); skip++) {
554
555 if ((found = LookupNameVars(name))) {
556 return found;
557 }
558
559 if ((found = LookupNameNamespace(MakeNamespace(skip, false), name))) {
560 return found;
561 }
562
563 for (auto &elem : at(size() - skip - 1).ns_lookup) {
564 if ((found = LookupNameNamespace(elem, name))) {
565 return found;
566 }
567 }
568
569 //
570 // // Check local name
571 // temp = name;
572 // if (full_search) {
573 // temp += "$";
574 // }
575 // temp.insert(0, MakeNamespace(skip, false));
576 // if ((found = FindInternalName(temp))) {
577 // return found;
578 // }
579 // if (full_search) {
580 //
581 // // Check static name local object
582 // temp = name;
583 // temp += "::";
584 // temp.insert(0, MakeNamespace(skip, false));
585 // if ((found = FindInternalName(temp))) {
586 // return found;
587 // }
588 // }
589 //
590 // // Check static name
591 // temp = name;
592 // if (full_search) {
593 // temp += "::";
594 // }
595 // temp.insert(0, MakeNamespace(skip, true));
596 // if ((found = FindInternalName(temp))) {
597 // return found;
598 // }
599 //
600 //
601 // if (full_search) {
602 // // Check type name
603 // temp = name;
604 // temp += ":";
605 // temp.insert(0, MakeNamespace(skip, true));
606 // if ((found = FindInternalName(temp))) {
607 // return found;
608 // }
609 // }
610 //
611 // // if (isGlobalScope(temp)) {
612 // // break;
613 // // }
614 }
615
616 temp = name;
617 if (full_search) {
618 temp += "$";
619 if ((found = FindInternalName(temp))) {
620 return found;
621 }
622 temp = name;
623 temp += "::";
624 if ((found = FindInternalName(temp))) {
625 return found;
626 }
627 temp = name;
628 temp += ":";
629 if ((found = FindInternalName(temp))) {
630 return found;
631 }
632
633 temp = name;
634 temp += "::";
635 temp.insert(0, "::");
636 if ((found = FindInternalName(temp))) {
637 return found;
638 }
639 temp += ":";
640 if ((found = FindInternalName(temp))) {
641 return found;
642 }
643 }
644 return FindInternalName(temp);
645}
646
648 // ASSERT(term->isInterrupt());
649 if (ns->m_text.empty()) {
650 NL_MESSAGE(LOG_LEVEL_INFO, ns, "Lookup block empty!");
651 return false;
652 }
653 ExpandNamespace(ns->m_text);
654 if (ns->m_text.compare("::") == 0) {
655 return true;
656 }
657
658 auto iter = rbegin();
659 while (iter != rend()) {
660 ASSERT(iter->scope_name);
661 if (iter->scope_name->m_text.compare(ns->m_text) == 0) {
662 return true;
663 }
664 iter++;
665 }
666 NL_MESSAGE(LOG_LEVEL_INFO, ns, "Lookup block '%s' fail!%s", ns->m_text.c_str(), Dump().c_str());
667 return false;
668}
669
671 if (empty()) {
672 return "";
673 }
674 std::string result = " Possible block identifiers: '";
675
676 std::string list_block;
677 for (auto &elem : * this) {
678 if (elem.scope_name) {
679 if (!list_block.empty()) {
680 list_block += ", ";
681 }
682 list_block += elem.scope_name->m_text;
683 }
684 }
685 result += list_block;
686 result += "'";
687
688 return result;
689}
690
692 std::string result;
693#ifdef BUILD_UNITTEST
694 auto iter = begin();
695 while (iter != end()) {
696 result += "Stack [";
697 if (iter->scope_name) {
698 result += iter->scope_name->m_text;
699 }
700 result += "]: ";
701
702 std::string list;
703 auto iter_list = iter->vars.begin();
704 while (iter_list != iter->vars.end()) {
705
706 if (!list.empty()) {
707 list += ", ";
708 }
709
710 list += iter_list->first;
711 iter_list++;
712 }
713
714 // result += "(";
715 result += list;
716 result += "\n";
717 iter++;
718 }
719#endif
720 return result;
721}
722
723/*
724 *
725 *
726 *
727 *
728 *
729 *
730 *
731 *
732 */
733
734bool StorageTerm::RegisterName(TermPtr term, const std::string_view syn) {
735 InternalName name;
736 if (syn.empty()) {
737 name = term->m_normalized;
738 } else {
739 name = syn.begin();
740 }
741 ASSERT(!name.empty());
742 if (find(name) != end()) {
743
744 return false;
745 }
746 insert({name, term});
747 return true;
748}
749
750StorageTerm::StorageTerm(const StorageTerm & clone) : std::map<std::string, TermPtr>(clone) {
751 for (auto &elem : * this) {
752
753 elem.second = elem.second->Clone();
754 }
755}
756
758 ASSERT(index_arg->size() == 1);
759 TermPtr index = index_arg->at(0).second;
760 ASSERT(index);
761 if (index->getTermID() != TermID::INTEGER) {
762 LOG_RUNTIME("Fail index type %s '%s'", newlang::toString(index->getTermID()), index->toString().c_str());
763 }
764 return GetIndex(obj, std::stoi(index->m_text.c_str()));
765}
virtual int64_t index(const std::string_view field_name)
Definition dict.h:149
virtual const std::string & name(const int64_t index) const
Definition dict.h:145
bool RegisterObject(bool only_new, const std::string_view name, TermPtr term, Variable var)
Definition types.cpp:239
VariablePair * FindObject(const std::string_view name)
Definition types.cpp:287
StorageTerm::ModuleMapType & m_modules
Use as a pre-declaration of (an "external") object.
Definition term.h:237
NameLookupStack(GlobalObjects &glob, StorageTerm::ModuleMapType &modules)
Definition term.cpp:164
TermPtr LookupNameNamespace(const std::string_view ns, const std::string_view name)
Definition term.cpp:526
std::string Dump()
Definition term.cpp:691
void ExpandNamespace(std::string &name)
Definition term.cpp:223
GlobalObjects & m_glob
Buildin in Runtime.
Definition term.h:236
std::string MakeNamespace(int skip, bool is_global)
Definition term.cpp:250
size_t m_block_num
Нумератор безымянных блоков кода
Definition term.h:238
bool LookupBlock_(TermPtr &term)
Definition term.cpp:647
bool CheckInterrupt(std::string_view name)
Definition term.cpp:234
TermPtr FindInternalName(std::string_view int_name)
Definition term.cpp:475
TermPtr LookupNameVars(const std::string_view name)
Definition term.cpp:494
std::string MakeInternalName(const TermPtr &term, bool is_static)
Definition term.cpp:309
void SetLookupNamespace(TermPtr ns)
Definition term.cpp:200
TermPtr LookupName(std::string name)
Definition term.cpp:541
std::string GetOfferBlock()
Definition term.cpp:670
std::string GetFuntionName()
Definition term.cpp:277
std::string GetNamespace()
Definition term.cpp:289
bool AddName(const TermPtr var, const char *alt_name=nullptr)
Definition term.cpp:426
void PushScope(TermPtr ns, bool is_function=false)
Definition term.cpp:181
static ObjPtr GetIndex(ObjPtr obj, TermPtr index_arg)
Definition term.cpp:757
bool RegisterName(TermPtr term, const std::string_view syn="")
Definition term.cpp:734
std::map< std::string, StorageTerm > ModuleMapType
Definition term.h:172
static constexpr std::string MODULE_MAIN
Definition term.h:170
static TermPtr Create(TermID id, const char *text, parser::token_type lex_type=parser::token_type::END, size_t len=std::string::npos, location *loc=nullptr, std::shared_ptr< std::string > source=nullptr)
Definition term.h:335
static TermPtr CreateNil()
Definition term.cpp:28
void SetType(TermPtr type)
Definition term.cpp:49
static TermPtr CreateIntName(const std::string_view name, const std::string_view int_name, TermID id=TermID::NAME)
Definition term.cpp:38
static bool CheckTermEq(const TermPtr &term, const TermPtr &proto, bool type=false, RuntimePtr rt=nullptr)
Definition term.cpp:112
TermID m_id
Term id (name, block, operator, string etc.)
Definition term.h:1419
TermPtr m_type
Term type if specified.
Definition term.h:1428
std::string m_text
Text of the term.
Definition term.h:1430
static TermPtr CreateName(std::string name, TermID id=TermID::NAME)
Definition term.cpp:44
static TermPtr CreateDict()
Definition term.cpp:33
static TermPtr CreateNone()
Definition term.cpp:23
int result
Definition lexer.l:367
#define LOG_RUNTIME(format,...)
Definition logger.h:26
#define LOG_LEVEL_INFO
Definition logger.h:87
#define ASSERT(condition)
Definition logger.h:60
Definition nlc.h:59
bool isStaticName(const std::string_view name)
Definition types.h:1061
TermID
Definition term.h:119
const TermPtr getDefaultType(const std::string_view text)
Definition parser.cpp:1072
bool isTrivialName(const std::string_view name)
Definition types.h:1070
newlang::ObjPtr clone(newlang::Context *ctx, newlang::Obj &in)
Definition builtin.cpp:39
std::shared_ptr< Term > TermPtr
Definition variable.h:33
size_t IndexArg(TermPtr term)
Definition term.cpp:6
int64_t parseInteger(const char *str)
Definition types.h:998
std::shared_ptr< Obj > ObjPtr
Definition variable.h:28
std::shared_ptr< RunTime > RuntimePtr
Definition types.h:242
bool isGlobalScope(const std::string_view name)
Definition types.h:1078
double parseDouble(const char *str)
Definition types.h:1012
bool isInternalName(const std::string_view name)
Definition types.h:1049
ObjType typeFromString(TermPtr &term, RunTime *rt, bool *has_error)
Definition runtime.cpp:2243
ObjType
Definition types.h:524
ObjType typeFromLimit(int64_t value, ObjType type_default=ObjType::Int64)
Definition object.cpp:3788
std::string NormalizeName(const std::string_view name)
Definition types.h:1152
const char * toString(TermID type)
Definition term.h:126
bool canCastLimit(const ObjType from, const ObjType to)
Definition types.h:933
TermPtr scope_name
Имя блока кода
Definition term.h:205
bool function_name
Имя блока кода, если это функция
Definition term.h:207
#define NL_PARSER(term, format,...)
Definition types.h:310
#define NL_MESSAGE(level, term, format,...)
Definition types.h:318