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());
40 result->m_normalized = int_name;
113 if (term1 ==
nullptr && term2 ==
nullptr) {
116 if (!!term1 != !!term2) {
122 if (term1->m_text.compare(term2->m_text) != 0) {
125 if (term1->isCall() != term2->isCall()) {
128 if (!!term1->m_dims != !!term2->m_dims) {
131 if (term1->m_dims && term2->m_dims && term1->m_dims->size() != term2->m_dims->size()) {
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)) {
139 if (term1->size() != term2->size()) {
142 for (
int i = 0; i < term1->size(); i++) {
143 if (term1->at(i).first.compare(term2->at(i).first) != 0) {
146 if (!
CheckTermEq(term1->at(i).second, term2->at(i).second,
false, rt)) {
150 return CheckTermEq(term1->m_type, term2->m_type,
true, rt);
165m_glob(glob), m_modules(modules), m_block_num(1) {
170 std::deque< ScopeVars >::clear();
186 if (ns->m_text.rfind(
"::") != ns->m_text.size() - 2) {
201 std::vector<std::string> list;
204 bool is_clear =
false;
206 list.push_back(next->m_text);
207 if (next->m_text.compare(
"_") == 0) {
211 if (list.back().size() < 2 || !(list.back()[list.back().size() - 1] ==
':' && list.back()[list.back().size() - 2] ==
':')) {
215 next = next->m_right;
217 if (is_clear && list.size() > 1) {
220 rbegin()->ns_lookup = list;
224 size_t pos = name.find(
"@::");
225 if (pos != std::string::npos) {
228 pos = name.find(
"$::");
229 if (pos != std::string::npos) {
235 std::string ns(name);
237 if (!(ns.size() > 1 && ns[ns.size() - 1] ==
':' && ns[ns.size() - 2] ==
':')) {
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();
247 LOG_RUNTIME(
"Named block '%s' not found!", name.begin());
252 auto iter = rbegin();
257 while (iter != rend()) {
258 if (
result.find(
"::") == 0) {
261 if (skip < 0 && count == -skip) {
264 if (!is_global && iter == rbegin() && isdigit(iter->scope_name->m_text[0])) {
266 result.insert(0, iter->scope_name->m_text);
267 }
else if (!isdigit(iter->scope_name->m_text[0])) {
269 result.insert(0, iter->scope_name->m_text);
278 auto iter = rbegin();
279 while (iter != rend()) {
280 if (iter->function_name) {
282 return iter->scope_name->m_text;
291 auto iter = rbegin();
292 while (iter != rend()) {
293 if (
result.find(
"::") == 0) {
300 if (!isdigit(iter->scope_name->m_text[0])) {
302 result.insert(0, iter->scope_name->m_text);
311 std::string name(term->m_text);
312 if (term->m_namespace) {
313 name.insert(0, term->m_namespace->m_text);
392 size_t pos =
result.find(
"@::");
393 if (pos != std::string::npos) {
395 }
else if ((pos =
result.find(
"$::")) != std::string::npos) {
400 if (pos != std::string::npos) {
402 std::rotate(std::begin(
result) + pos, std::begin(
result) + pos + 1, std::end(
result));
408 }
else if (
result[0] ==
':') {
430 std::string_view name;
434 name = var->m_normalized;
437 LOG_RUNTIME(
"Internal name of '%s' not exist!", var->toString().c_str());
444 name.begin(), found->second->toString().c_str());
452 var->m_level = size();
457 std::map<std::string, TermPtr> * map_level = &back().vars;
462 if (map_level->find(name.begin()) != map_level->end()) {
467 map_level->insert({name.begin(), var});
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;
487 return found->second;
491 return glob ? glob->
term :
nullptr;
501 std::string name_search;
502 name_search = name.begin();
508 name_search = name.begin();
516 return found2->second;
533 std::string name_search(ns.begin());
553 for (
size_t skip = 0; skip < size(); skip++) {
563 for (
auto &elem : at(size() - skip - 1).ns_lookup) {
635 temp.insert(0,
"::");
649 if (ns->m_text.empty()) {
654 if (ns->m_text.compare(
"::") == 0) {
658 auto iter = rbegin();
659 while (iter != rend()) {
661 if (iter->scope_name->m_text.compare(ns->m_text) == 0) {
674 std::string
result =
" Possible block identifiers: '";
676 std::string list_block;
677 for (
auto &elem : *
this) {
678 if (elem.scope_name) {
679 if (!list_block.empty()) {
682 list_block += elem.scope_name->m_text;
695 while (iter != end()) {
697 if (iter->scope_name) {
698 result += iter->scope_name->m_text;
703 auto iter_list = iter->vars.begin();
704 while (iter_list != iter->vars.end()) {
710 list += iter_list->first;
737 name = term->m_normalized;
742 if (find(name) != end()) {
746 insert({name, term});
751 for (
auto &elem : *
this) {
753 elem.second = elem.second->Clone();
758 ASSERT(index_arg->size() == 1);
virtual int64_t index(const std::string_view field_name)
virtual const std::string & name(const int64_t index) const
bool RegisterObject(bool only_new, const std::string_view name, TermPtr term, Variable var)
VariablePair * FindObject(const std::string_view name)
StorageTerm::ModuleMapType & m_modules
Use as a pre-declaration of (an "external") object.
NameLookupStack(GlobalObjects &glob, StorageTerm::ModuleMapType &modules)
TermPtr LookupNameNamespace(const std::string_view ns, const std::string_view name)
void ExpandNamespace(std::string &name)
GlobalObjects & m_glob
Buildin in Runtime.
std::string MakeNamespace(int skip, bool is_global)
size_t m_block_num
Нумератор безымянных блоков кода
bool LookupBlock_(TermPtr &term)
bool CheckInterrupt(std::string_view name)
TermPtr FindInternalName(std::string_view int_name)
TermPtr LookupNameVars(const std::string_view name)
std::string MakeInternalName(const TermPtr &term, bool is_static)
void SetLookupNamespace(TermPtr ns)
TermPtr LookupName(std::string name)
std::string GetOfferBlock()
std::string GetFuntionName()
std::string GetNamespace()
bool AddName(const TermPtr var, const char *alt_name=nullptr)
void PushScope(TermPtr ns, bool is_function=false)
static ObjPtr GetIndex(ObjPtr obj, TermPtr index_arg)
bool RegisterName(TermPtr term, const std::string_view syn="")
std::map< std::string, StorageTerm > ModuleMapType
static constexpr std::string MODULE_MAIN
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)
static TermPtr CreateNil()
void SetType(TermPtr type)
static TermPtr CreateIntName(const std::string_view name, const std::string_view int_name, TermID id=TermID::NAME)
static bool CheckTermEq(const TermPtr &term, const TermPtr &proto, bool type=false, RuntimePtr rt=nullptr)
TermID m_id
Term id (name, block, operator, string etc.)
TermPtr m_type
Term type if specified.
std::string m_text
Text of the term.
static TermPtr CreateName(std::string name, TermID id=TermID::NAME)
static TermPtr CreateDict()
static TermPtr CreateNone()
#define LOG_RUNTIME(format,...)
#define ASSERT(condition)
bool isStaticName(const std::string_view name)
const TermPtr getDefaultType(const std::string_view text)
bool isTrivialName(const std::string_view name)
newlang::ObjPtr clone(newlang::Context *ctx, newlang::Obj &in)
std::shared_ptr< Term > TermPtr
size_t IndexArg(TermPtr term)
int64_t parseInteger(const char *str)
std::shared_ptr< Obj > ObjPtr
std::shared_ptr< RunTime > RuntimePtr
bool isGlobalScope(const std::string_view name)
double parseDouble(const char *str)
bool isInternalName(const std::string_view name)
ObjType typeFromString(TermPtr &term, RunTime *rt, bool *has_error)
ObjType typeFromLimit(int64_t value, ObjType type_default=ObjType::Int64)
std::string NormalizeName(const std::string_view name)
const char * toString(TermID type)
bool canCastLimit(const ObjType from, const ObjType to)
TermPtr scope_name
Имя блока кода
bool function_name
Имя блока кода, если это функция
#define NL_PARSER(term, format,...)
#define NL_MESSAGE(level, term, format,...)