2#ifndef INCLUDED_NEWLANG_TERM_
3#define INCLUDED_NEWLANG_TERM_
17#define NL_TERMS(_) \ …
121#define DEFINE_ENUM(name) name,
131#define DEFINE_CASE(name) \
138 LOG_ERROR(
"UNKNOWN TERM TYPE %d",
static_cast<int> (type));
139 return "UNKNOWN TYPE ";
144 std::string
ParserMessage(std::string &buffer,
int row,
int col,
const char *format, ...);
185 auto iter = this->begin();
186 while (iter != this->end()) {
250 for (
auto &elem : names) {
251 if (!fails.empty()) {
332 class Term :
public Dict<Term>,
public std::enable_shared_from_this<Term> {
335 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) {
336 return std::make_shared<Term>(
id, text, lex_type, (len == std::string::npos ? strlen(text) : len), loc, source);
335 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) {
…}
340 return Create(
TermID::SYMBOL, std::string(1, sym).c_str(),
static_cast<parser::token_type
> (sym));
356 Term(
TermID id,
const char *text, parser::token_type lex_type,
size_t len, location *loc, std::shared_ptr<std::string> source =
nullptr) {
360 m_text.assign(text, std::min(strlen(text), len));
364 m_col = loc->end.column;
356 Term(
TermID id,
const char *text, parser::token_type lex_type,
size_t len, location *loc, std::shared_ptr<std::string> source =
nullptr) {
…}
386 LOG_DUMP(
"DeleteVar %d \"%s\" (%p)",
static_cast<int> (
m_id),
m_text.c_str(), (
void *)
this);
566 return term->m_is_call || !
isLocalName(term->m_text);
586 return size() &&
at(size() - 1).second &&
at(size() - 1).second->getTermID() ==
TermID::ELLIPSIS;
591 for (
auto elem : *
this) {
597 if (!elem.second->m_name_or_class.empty()) {
598 str.append(elem.second->m_name_or_class);
600 if (elem.second->GetType() && !
isDefaultType(elem.second->GetType())) {
601 str += elem.second->GetType()->asTypeString();
607 str.append(elem.second->toString(
true));
623 std::string str_text;
694 temp = shared_from_this();
696 result = temp->m_left->toString();
698 while (!nested && temp->m_right) {
699 if (
this == temp->m_right.get()) {
700 ASSERT(
this != temp->m_right.get());
702 if (temp->m_right->m_left) {
703 if (
this == temp->m_right->m_left.get()) {
706 ASSERT(
this != temp->m_right->m_left.get());
708 result += temp->m_right->toString(
true);
709 temp = temp->m_right;
826 ASSERT(size() == 2 || size() == 3);
847 for (
int i = 0; i <
m_right->size(); i++) {
895 for (
int i = 0; i <
m_dims->size(); i++) {
950 for (
size_t i = 0; i <
m_block.size(); i++) {
1021 for (
size_t i = 0; i <
m_block.size(); i++) {
1123 TermPtr next = shared_from_this();
1130 result += next->GetFullName();
1132 next->dump_items_(
result);
1134 next = next->m_right;
1139 for (
size_t i = 0; i <
m_block.size(); i++) {
1156 inline std::ostream &
Print(std::ostream &out = std::cout,
const char *delimiter =
nullptr) {
1156 inline std::ostream &
Print(std::ostream &out = std::cout,
const char *delimiter =
nullptr) {
…}
1166 return shared_from_this();
1173 return shared_from_this();
1207 if (!item->m_source) {
1210 TermPtr next = shared_from_this();
1211 while (next->m_left) {
1212 ASSERT(next != next->m_left);
1213 next = next->m_left;
1216 next->m_left = item;
1220 if (!item->m_source) {
1223 TermPtr next = shared_from_this();
1227 while (next->m_right) {
1228 ASSERT(next != next->m_right);
1229 next = next->m_right;
1231 next->m_right = item;
1239 m_text.append(txt->getText());
1243 TermPtr next = shared_from_this();
1249 vect.push_back(next);
1252 next = next->m_right;
1254 prev->m_right.reset();
1261 for (
auto &elem : args->m_block) {
1266 m_sys_prop->push_back(elem, elem->getName());
1269 NL_PARSER(elem,
"Cannot pass arguments after any system attributes!");
1274 args->m_block.clear();
1282 return shared_from_this();
1290 result = shared_from_this();
1291 if (item->isBlock()) {
1292 if (
this != item.get()) {
1293 result->m_block.insert(
result->m_block.end(), item->m_block.begin(), item->m_block.end());
1299 result->m_block.push_back(item);
1304 result->m_block.push_back(shared_from_this());
1305 if (
this != item.get()) {
1306 result->m_block.push_back(item);
1354 return shared_from_this();
1361 return shared_from_this();
1384 for (
size_t i = 0; i <
m_dims->size(); i++) {
332 class Term :
public Dict<Term>,
public std::enable_shared_from_this<Term> {
…};
PairType & push_back(const PairType &p)
virtual const std::string & name(const int64_t index) const
virtual PairType & at(const int64_t index)
StorageTerm::ModuleMapType & m_modules
Use as a pre-declaration of (an "external") object.
virtual ~NameLookupStack()
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()
static std::string EnumerateString(const StringArray &names)
std::string GetFuntionName()
std::string GetNamespace()
bool AddName(const TermPtr var, const char *alt_name=nullptr)
void PushScope(TermPtr ns, bool is_function=false)
ScopePush(NameLookupStack &scope, TermPtr ns, bool is_function=false)
NameLookupStack & m_scope
bool RegisterName(TermPtr term, const std::string_view syn="")
static constexpr std::string MODULE_ROOT
std::map< std::string, StorageTerm > ModuleMapType
static constexpr std::string MODULE_MAIN
std::ostream & Print(std::ostream &out=std::cout, const char *delimiter=nullptr)
static bool isExportName(const TermPtr &term)
size_t m_level
Dict nesting level (if applicable)
bool m_is_take
Object data capture flag.
void RightToBlock(std::vector< TermPtr > &vect, bool remove=true)
BlockType m_block
A list of terms separated by semicolons with in a block.
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)
int m_bracket_depth
Internal data of the depth of brackets when processed in the lexer.
static TermPtr CreateNil()
TermPtr m_ref
Type of reference before the variable (valid references or its creation operator)
TermPtr AppendBlock(TermPtr &item, TermID id, bool force=false)
void SetType(TermPtr type)
void SetSource(std::shared_ptr< std::string > source)
void AppendText(TermPtr txt)
static TermPtr CreateIntName(const std::string_view name, const std::string_view int_name, TermID id=TermID::NAME)
const std::string GetFullName() const
const std::string & getText() const
static bool CheckTermEq(const TermPtr &term, const TermPtr &proto, bool type=false, RuntimePtr rt=nullptr)
parser::location_type m_lexer_loc
Internal data for macroprocessor.
TermPtr m_namespace
The current namespace in the source file when this term is used.
TermID m_id
Term id (name, block, operator, string etc.)
bool m_is_owner
The flag of the object's owner (if applicable)
TermPtr m_type
Term type if specified.
std::string m_name_or_class
The name or class of the term, if the term has a name or class.
void dump_items_(std::string &str) const
BlockType m_macro_id
Internal data for macroprocessor.
std::string toString(bool nested=false)
int m_line
Line num this term in the source code.
int m_col
Col num this term in the source code.
const std::string & getName() const
InternalName m_normalized
Internal name of the object. Must be filled in after AST parsing.
void AppendLeft(TermPtr item)
Term(TermID id, const char *text, parser::token_type lex_type, size_t len, location *loc, std::shared_ptr< std::string > source=nullptr)
TermPtr m_sys_prop
System parameters are not included in the argument list when called and are stored separately.
TermPtr m_dims
Dimension of a tensor.
std::string m_text
Text of the term.
void SetArgs(TermPtr args)
BlockType m_docs
Inline documentation for a term or block.
bool m_is_const
Immutability (non changeability) feature.
static TermPtr CreateName(std::string name, TermID id=TermID::NAME)
static TermPtr CreateSymbol(char sym)
TermPtr m_left
Left node of a linked list.
SourceType m_source
Shared ptr source code.
void AppendText(const std::string &s)
static TermPtr CreateDict()
std::string asTypeString() const
bool isCalculated() const
parser::token_type m_lexer_type
Internal data for macroprocessor.
static TermPtr CreateNone()
void Clear(bool clear_iterator_name)
BlockType m_macro_seq
Internal data for macroprocessor.
void SetName(std::string &name)
void MakeRef(TermPtr ref)
BlockType m_attr
List of term attributes.
TermPtr m_right
Right node of a linked list.
bool m_is_call
Call as function flag (brackets used )
void AppendRight(TermPtr item)
#define DEFINE_CASE(name)
#define LOG_RUNTIME(format,...)
#define ASSERT(condition)
bool isConstName(const std::string_view name)
std::ostream & operator<<(std::ostream &out, newlang::TermPtr &var)
std::string ParserMessage(std::string &buffer, int row, int col, const char *format,...)
std::shared_ptr< std::string > SourceType
bool isLocalName(const std::string_view name)
newlang::ObjPtr clone(newlang::Context *ctx, newlang::Obj &in)
std::shared_ptr< Term > TermPtr
size_t IndexArg(TermPtr term)
bool isSystemName(const std::string_view name)
std::shared_ptr< RunTime > RuntimePtr
std::vector< std::string > StringArray
static bool IsAnyCreate(TermID id)
bool isReservedName(const std::string_view name)
std::vector< TermPtr > BlockType
const char * toString(TermID type)
bool isDefaultType(const TermPtr &term)
StorageTerm vars
Список имен переменных определеных для текущего уровня вложенности (блока кода)
std::vector< std::string > ns_lookup
Список namespace для поиска простых имен
TermPtr scope_name
Имя блока кода
bool function_name
Имя блока кода, если это функция
#define NL_PARSER(term, format,...)