15 char *source_date_epoch = std::getenv(
"SOURCE_DATE_EPOCH");
16 if (source_date_epoch) {
17 std::istringstream iss(source_date_epoch);
19 if (iss.fail() || !iss.eof()) {
20 LOG_RUNTIME(
"Error: Cannot parse SOURCE_DATE_EPOCH (%s) as integer", source_date_epoch);
50 Scanner scanner(&
m_stream, &std::cout, std::make_shared<std::string>(input));
56 if (parser.parse() != 0) {
68 llvm::SmallVector<char> path;
69 if (!llvm::sys::fs::real_path(filename, path)) {
70 m_filename = llvm::StringRef(path.data(), path.size());
75 llvm::sys::fs::file_status fs;
76 std::error_code ec = llvm::sys::fs::status(filename, fs);
78 time_t temp = llvm::sys::toTimeT(fs.getLastModificationTime());
80 timeinfo = localtime(&temp);
85 auto md5 = llvm::sys::fs::md5_contents(filename);
87 llvm::SmallString<32> hash;
88 llvm::MD5::stringifyResult(*md5, hash);
92 int fd = open(filename.begin(), O_RDONLY);
94 LOG_RUNTIME(
"Error open file '%s'", filename.begin());
101 data.resize(sb.st_size);
103 read(fd,
const_cast<char*
> (data.data()), sb.st_size);
111 std::cerr << l <<
": " << m << std::endl;
115 std::cerr << m << std::endl;
118void newlang::parser::error(
const parser::location_type& l,
const std::string& msg) {
120 std::string buffer(*(driver.lexer->source_string));
121 std::cout << driver.lexer->source_string->c_str() <<
"\n\n";
139 m_ast->m_block.push_back(temp);
142 m_ast->m_block.insert(
m_ast->m_block.end(), term->m_block.begin(), term->m_block.end());
144 m_ast->m_block.push_back(term);
177 if (term && term->m_text.size() > 5
178 && term->m_text.find(
"@__") == 0
179 && term->m_text.rfind(
"__") == term->m_text.size() - 2) {
224 static const char * __PRAGMA_DIAG__ =
"@__PRAGMA_DIAG__";
225 static const char * __PRAGMA_TYPE_DEFINE__ =
"@__PRAGMA_TYPE_DEFINE__";
226 static const char * __PRAGMA_IGNORE__ =
"@__PRAGMA_IGNORE__";
227 static const char * __PRAGMA_MACRO__ =
"@__PRAGMA_MACRO__";
228 static const char * __PRAGMA_MACRO_COND__ =
"@__PRAGMA_MACRO_COND__";
230 static const char * __PRAGMA_MESSAGE__ =
"@__PRAGMA_MESSAGE__";
231 static const char * __PRAGMA_WARNING__ =
"@__PRAGMA_WARNING__";
232 static const char * __PRAGMA_ERROR__ =
"@__PRAGMA_ERROR__";
234 static const char * __PRAGMA_EXPECTED__ =
"@__PRAGMA_EXPECTED__";
235 static const char * __PRAGMA_UNEXPECTED__ =
"@__PRAGMA_UNEXPECTED__";
236 static const char * __PRAGMA_FINALIZE__ =
"@__PRAGMA_FINALIZE__";
238 static const char * __PRAGMA_NO_MACRO__ =
"@__PRAGMA_NO_MACRO__";
240 static const char * __PRAGMA_LOCATION__ =
"@__PRAGMA_LOCATION__";
242 static const char * __ANNOTATION_SET__ =
"@__ANNOTATION_SET__";
243 static const char * __ANNOTATION_CHECK__ =
"@__ANNOTATION_CHECK__";
244 static const char * __ANNOTATION_IIF__ =
"@__ANNOTATION_IIF__";
246 static const char * __PRAGMA_STATIC_ASSERT__ =
"@__PRAGMA_STATIC_ASSERT__";
249 if (term->m_text.compare(__PRAGMA_DIAG__) == 0) {
250 if (term->size() == 0) {
251 NL_PARSER(term,
"Expected argument in pragma '%s'", term->toString().c_str());
256 if (term->at(0).second->m_text.compare(
"push") == 0) {
261 }
else if (term->at(0).second->m_text.compare(
"pop") == 0) {
273 NL_PARSER(term,
"Pragma '%s' not recognized!", term->toString().c_str());
276 for (
int i = 1; i < term->size(); i++) {
277 m_diag->Apply(term->at(i).second->m_text.c_str(), state, term);
279 }
else if (term->m_text.compare(__PRAGMA_TYPE_DEFINE__) == 0) {
281 if (term->size() != 1 || !term->at(1).first.empty()) {
282 NL_PARSER(term,
"Expected argument in pragma macro '%s'", term->toString().c_str());
285 if (term->at(1).first.empty() && term->at(1).second->getTermID() ==
TermID::INTEGER &&
m_rt) {
290 }
else if (term->m_text.compare(__PRAGMA_MESSAGE__) == 0
291 || term->m_text.compare(__PRAGMA_WARNING__) == 0
292 || term->m_text.compare(__PRAGMA_ERROR__) == 0) {
295 for (
int i = 0; i < term->size(); i++) {
296 message += term->at(i).second->m_text;
301 if (term->m_text.compare(__PRAGMA_MESSAGE__) == 0) {
302 LOG_INFO(
"note: %s", message.c_str());
303 }
else if (term->m_text.compare(__PRAGMA_WARNING__) == 0) {
306 ASSERT(term->m_text.compare(__PRAGMA_ERROR__) == 0);
311 }
else if (term->m_text.compare(__PRAGMA_IGNORE__) == 0) {
313 LOG_RUNTIME(
"Pragma @__PRAGMA_IGNORE__ not implemented!");
315 static const char * ignore_space =
"space";
316 static const char * ignore_indent =
"indent";
317 static const char * ignore_comment =
"comment";
318 static const char * ignore_crlf =
"crlf";
320 }
else if (term->m_text.compare(__PRAGMA_MACRO__) == 0) {
322 if (term->size() == 0) {
323 NL_PARSER(term,
"Expected argument in pragma macro '%s'", term->toString().c_str());
327 if (term->at(0).second->m_text.compare(
"push") == 0) {
333 }
else if (term->at(0).second->m_text.compare(
"pop") == 0) {
346 NL_PARSER(term,
"Pragma macro '%s' not recognized!", term->toString().c_str());
352 }
else if (term->m_text.compare(__PRAGMA_MACRO_COND__) == 0) {
354 if (term->size() == 0) {
355 NL_PARSER(term,
"Expected argument in pragma macro '%s'", term->toString().c_str());
358 LOG_RUNTIME(
"Pragma @__PRAGMA_MACRO_COND__ not implemented!");
361 }
else if (term->m_text.compare(__PRAGMA_EXPECTED__) == 0) {
365 }
else if (term->m_text.compare(__PRAGMA_UNEXPECTED__) == 0) {
369 }
else if (term->m_text.compare(__PRAGMA_FINALIZE__) == 0) {
372 LOG_RUNTIME(
"Nested definitions of pragma @__PRAGMA_FINALIZE__ not implemented!");
378 }
else if (term->m_text.compare(__PRAGMA_NO_MACRO__) == 0) {
380 ASSERT(term->size() == 0);
384 }
else if (term->m_text.compare(__PRAGMA_LOCATION__) == 0) {
390 if (term->size() == 1 && term->at(0).first.empty() && term->at(0).second->m_text.compare(
"pop") == 0) {
393 NL_PARSER(term,
"Empty stack location!");
400 }
else if (term->size() >= 1 && term->at(0).first.empty() && term->at(0).second->m_text.compare(
"push") == 0) {
402 if (term->size() == 1) {
405 }
else if (term->size() >= 2 && term->at(1).first.empty() && term->at(1).second->isString()) {
410 if (term->size() == 2) {
412 }
else if (term->size() == 3 && term->at(2).first.empty() && term->at(2).second->getTermID() ==
TermID::INTEGER) {
413 m_location.begin.line = std::stoi(term->at(0).second->getText().c_str());
419 }
else if (term->size() >= 1 && term->at(0).first.empty() && term->at(0).second->getTermID() ==
TermID::INTEGER) {
421 m_location.begin.line = std::stoi(term->at(0).second->getText().c_str());
423 if (term->size() == 1) {
425 }
else if (term->size() == 2 && term->at(1).first.empty() && term->at(1).second->isString()) {
432 NL_PARSER(term,
"See @__PRAGMA_LOCATION__ for usage and syntax help.");
435 }
else if (term->m_text.compare(__ANNOTATION_SET__) == 0) {
437 if (term->size() == 1) {
439 std::string name = term->at(0).second->m_text;
442 auto iter =
m_annotation->find(term->at(0).second->m_text);
451 }
else if (term->size() == 2) {
453 m_annotation->push_back(term->at(1).second, term->at(0).second->m_text);
455 NL_PARSER(term,
"Annotation args in '%s' not recognized!", term->toString().c_str());
460 }
else if (term->m_text.compare(__ANNOTATION_CHECK__) == 0) {
464 LOG_RUNTIME(
"Pragma __ANNOTATION_CHECK__ not implemented!");
479 }
else if (term->m_text.compare(__ANNOTATION_IIF__) == 0) {
483 if (term->size() != 3) {
484 NL_PARSER(term,
"Annotation IIF must have three arguments!");
489 auto iter =
m_annotation->find(term->at(0).second->m_text);
490 if (iter ==
m_annotation->end() || iter->second->m_text.empty() || iter->second->m_text.compare(
"0") == 0) {
491 buffer.insert(buffer.begin(), term->at(2).second);
493 buffer.insert(buffer.begin(), term->at(1).second);
496 }
else if (term->m_text.compare(__PRAGMA_STATIC_ASSERT__) == 0) {
501 NL_PARSER(term,
"Uknown pragma '%s'", term->toString().c_str());
508 if (term->size() < 1 || !term->at(0).first.empty()) {
509 NL_PARSER(term,
"Agruments '%s' not recognized! See @__PRAGMA_STATIC_ASSERT__ for usage and syntax help.", term->toString().c_str());
520 NL_PARSER(term,
"StaticAssert '%s' failed!", term->at(0).second->toString().c_str());
527 char va_buffer[1024];
530 va_start(args, format);
531 vsnprintf(va_buffer,
sizeof (va_buffer), format, args);
534 std::string message(va_buffer);
537 message +=
" at line ";
538 message += std::to_string(row);
540 message += std::to_string(col - 1);
546 if (buffer.find(
"\n") != std::string::npos) {
548 while (count < row) {
549 pos = buffer.find(
"\n", pos + 1);
554 std::string tmp = buffer.substr((pos ? pos + 1 : pos), buffer.find(
"\n", pos + 1));
555 tmp = tmp.substr(0, tmp.find(
"\n", col));
561 std::wstring_convert < std::codecvt_utf8<wchar_t>,
wchar_t> converter;
562 std::wstring wstr = converter.from_bytes(tmp.substr(0, col));
567 std::string placeholder(col - 2 - (tmp.substr(0, col).size() - wstr.size()),
' ');
569 message += placeholder;
585 LOG_ERROR(
"Predef macro '%s' redefined!", name);
598 VERIFY(
RegisterPredefMacro(
"@__NLC_SOURCE_BUILD__",
"Git source code identifier and date build of the current compiler version."));
641 std::string_view text = term->m_text;
642 if (text.find(
"@") == 0) {
643 text.remove_prefix(1);
650 std::string buf(
"Jul 27 2012");
651 strftime(buf.data(), buf.size(),
"%b %e %Y", localtime(&ts));
656 std::string buf(
"07:07:09");
657 strftime(buf.data(), buf.size(),
"%T", localtime(&ts));
662 std::string
result = asctime(localtime(&ts));
668 std::string buf(
"2011-10-08T07:07:09Z");
669 strftime(buf.data(), buf.size(),
"%FT%TZ", localtime(&ts));
681 return term->m_lexer_type;
684 std::string_view text = term->m_text;
691 return term->m_lexer_type;
696 const parser::token_type str_token = parser::token_type::STRWIDE;
698 if (text.compare(
"@__COUNTER__") == 0) {
701 term->m_text = std::to_string(
m_counter);
703 term->m_lexer_type = parser::token_type::INTEGER;
704 return term->m_lexer_type;
706 }
else if (text.compare(
"@__NLC_VER__") == 0) {
709 term->m_text = std::to_string(
VERSION);
710 term->m_lexer_type = parser::token_type::INTEGER;
711 return term->m_lexer_type;
713 }
else if (text.compare(
"@__NLC_SOURCE_GIT__") == 0) {
715 term->m_id = str_type;
716 term->m_lexer_type = str_token;
717 return term->m_lexer_type;
719 }
else if (text.compare(
"@__NLC_DATE_BUILD__") == 0) {
721 term->m_id = str_type;
722 term->m_lexer_type = str_token;
723 return term->m_lexer_type;
725 }
else if (text.compare(
"@__NLC_SOURCE_BUILD__") == 0) {
727 term->m_id = str_type;
728 term->m_lexer_type = str_token;
729 return term->m_lexer_type;
731 }
else if (text.compare(
"@__LINE__") == 0 || text.compare(
"@__FILE_LINE__") == 0) {
734 term->m_text = std::to_string(
m_location.begin.line);
735 term->m_lexer_type = parser::token_type::INTEGER;
736 return term->m_lexer_type;
738 }
else if (text.compare(
"@__FILE__") == 0 || text.compare(
"@__FILE_NAME__") == 0) {
740 term->m_id = str_type;
744 term->m_text =
"File name undefined!!!";
746 term->m_lexer_type = str_token;
747 return term->m_lexer_type;
749 }
else if (text.compare(
"@__FILE_TIMESTAMP__") == 0) {
751 term->m_id = str_type;
755 term->m_text =
"??? ??? ?? ??:??:?? ????";
757 term->m_lexer_type = str_token;
758 return term->m_lexer_type;
760 }
else if (text.compare(
"@__FILE_MD5__") == 0) {
762 term->m_id = str_type;
766 term->m_text =
"?????????????????????????????????";
768 term->m_lexer_type = str_token;
769 return term->m_lexer_type;
772 }
else if (text.compare(
"@__DATE__") == 0) {
775 term->m_id = str_type;
776 term->m_lexer_type = str_token;
777 return term->m_lexer_type;
779 }
else if (text.compare(
"@__TIME__") == 0) {
782 term->m_id = str_type;
783 term->m_lexer_type = str_token;
784 return term->m_lexer_type;
786 }
else if (text.compare(
"@__TIMESTAMP__") == 0) {
789 term->m_text = term->m_text.substr(0, 24);
790 term->m_id = str_type;
791 term->m_lexer_type = str_token;
792 return term->m_lexer_type;
794 }
else if (text.compare(
"@__TIMESTAMP_ISO__") == 0) {
797 term->m_id = str_type;
798 term->m_lexer_type = str_token;
799 return term->m_lexer_type;
801 }
else if (text.compare(
"@__CLASS__") == 0 || text.compare(
"@__NAMESPACE__") == 0 ||
802 text.compare(
"@__FUNCTION__") == 0 || text.compare(
"@__FUNCDNAME__") == 0 || text.compare(
"@__FUNCSIG__") == 0) {
805 term->m_lexer_type = parser::token_type::NAMESPACE;
806 return term->m_lexer_type;
808 }
else if (text.compare(
"@::") == 0) {
811 term->m_lexer_type = parser::token_type::NAMESPACE;
812 return term->m_lexer_type;
816 }
else if (text.compare(
"@$$") == 0) {
819 term->m_lexer_type = parser::token_type::NAMESPACE;
820 return term->m_lexer_type;
825 }
else if (text.compare(
"@\\\\") == 0) {
831 term->m_lexer_type = parser::token_type::NAME;
832 return term->m_lexer_type;
834 }
else if (text.compare(
"$\\\\") == 0) {
838 term->m_lexer_type = parser::token_type::MODULE;
839 return term->m_lexer_type;
842 NL_PARSER(term,
"Predef macro '%s' not implemented!", term->toString().c_str());
848 Parser p(macro,
nullptr,
nullptr, pragma_enable);
849 return p.
Parse(proto);
850 }
catch (std::exception &) {
851 std::string func(proto);
854 Parser p(macro,
nullptr,
nullptr, pragma_enable);
855 return p.
Parse(func)->m_left;
856 }
catch (std::exception &e) {
857 LOG_RUNTIME(
"Fail parsing prototype '%s' as '%s'!", func.c_str(), e.what());
864 if (offset >= buffer.size()) {
869 if (buffer[offset]->m_text.compare(
"(") == 0) {
873 }
else if (buffer[offset]->m_text.compare(
"[") == 0) {
881 while (offset + shift < buffer.size()) {
882 if (buffer[offset]->m_text.compare(buffer[offset + shift]->m_text) == 0) {
884 }
else if (br_end.compare(buffer[offset + shift]->m_text) == 0) {
892 NL_PARSER(buffer[offset],
"Closed bracket '%s' not found!", br_end.c_str());
897 if (offset >= buffer.size()) {
898 LOG_RUNTIME(
"Fail skip count %d or buffer size %d!", (
int) offset, (
int) buffer.size());
912 std::string source = buffer[offset]->toString();
921 for (
size_t i = 0; i < skip; i++) {
922 if (buffer[offset + i]) {
923 source += buffer[offset + i]->toString();
929 if (offset + 1 < buffer.size() && buffer[offset + 1]->m_text.compare(
":") == 0) {
931 source += buffer[offset]->toString();
938 if (offset + 1 >= buffer.size()) {
939 NL_PARSER(buffer[offset + 1],
"Typename missing!");
943 source += buffer[offset]->toString();
952 for (
size_t i = 0; i < skip; i++) {
953 source += buffer[offset + i]->toString();
956 offset += (skip + 1);
969 NL_PARSER(term,
"Module name - backslash, underscore, lowercase English letters or number!");
981#define MAKE_TYPE(type_name) {type_name, Term::Create(TermID::TYPE, type_name)}
1063 return def && (term.get() == def.get());
1073 if (!text.empty()) {
1076 return iter->second;
1088 if (!from->m_type) {
1092 return canCast(test_type, to);
1096 if (!from || !to || !from->m_type || !to->m_type) {
1104 std::string type(type_arg);
1106 if (type.find(
"~") != std::string::npos) {
1107 type.erase(std::remove(type.begin(), type.end(),
'~'), type.end());
1112 }
else if (type.compare(
"_") == 0) {
1116#define DEFINE_CASE(name, _) \
1117 else if (type.compare(":"#name) == 0) { \
1118 return ObjType:: name; \
1128 LOG_RUNTIME(
"Undefined type name '%s'!", type.c_str());
1133 parser::token_type
result;
1149 parser::token_type type;
1150 bool lexer_complete;
1158 bool is_escape =
false;
1162 lexer_complete =
false;
1172 ASSERT(type == term->m_lexer_type);
1176 if (type == parser::token_type::END) {
1177 NL_PARSER(term,
"Unexpected end of file '%s'", term->toString().c_str());
1181 term->m_lexer_type = parser::token_type::ESCAPE;
1182 type = parser::token_type::ESCAPE;
1184 }
else if (type == parser::token_type::ESCAPE) {
1187 goto next_escape_token;
1241 if (type == parser::token_type::END) {
1246 lexer->yypop_buffer_state();
1274 ASSERT(type == parser::token_type::MACRO_SEQ);
1277 NL_PARSER(term,
"Invalid token '%s' at given position!", term->m_text.c_str());
1287 ASSERT(type == parser::token_type::MACRO_SEQ);
1297 if (
lexer->
m_macro_del && !(type == parser::token_type::NAME || type == parser::token_type::LOCAL)) {
1298 NL_PARSER(term,
"Invalid token '%s' at given position!", term->m_text.c_str());
1306 ASSERT(type == parser::token_type::MACRO_DEL);
1309 NL_PARSER(term,
"Invalid token '%s' at given position!", term->m_text.c_str());
1318 ASSERT(type == parser::token_type::MACRO_DEL);
1324 NL_PARSER(term,
"Empty sequence not allowed!");
1336 if (term->m_text.compare(
";") == 0) {
1337 lexer_complete =
true;
1350 if (!bag_position) {
1354 if (term->m_lexer_loc.begin.filename) {
1355 NL_PARSER(bag_position,
"Incomplete syntax near '%s' in file %s!", bag_position->m_text.c_str(), term->m_lexer_loc.begin.filename->c_str());
1357 NL_PARSER(bag_position,
"Incomplete syntax near '%s'!", bag_position->m_text.c_str());
1399 for (
int i = 0; i <
m_expected->size(); i++) {
1407 for (
int i = 0; i <
m_expected->size(); i++) {
1438 goto go_parse_string;
1590 m_postlex->push_back((*yylval)->m_text);
1594 for (
int i = 0; i < (*yylval)->m_macro_seq.size(); i++) {
1595 m_postlex->push_back((*yylval)->m_macro_seq[i]->m_text);
1597 m_postlex->push_back((*yylval)->m_text);
1609 return parser::token_type::END;
static LatterType EvalTerm(TermPtr term, Context *runner, bool rvalue=true)
static const char * toString(State state)
VariablePair & GetVariablePair(bool editable=false)
LogLevelType GetLogLevel()
LogLevelType SetLogLevel(const LogLevelType level)
static Logger * Instance()
static ObjPtr CreateNone(Sync *sync=nullptr)
static ObjPtr CreateType(ObjType type, ObjType fixed=ObjType::None, bool is_init=false, Sync *sync=nullptr)
void error(const class location &l, const std::string &m)
TermPtr Parse(const std::string str, bool expand_module=false)
static size_t SkipBrackets(const BlockType &buffer, size_t offset)
std::istringstream m_stream
bool RegisterPredefMacro(const char *name, const char *desc)
Parser(MacroPtr macro=nullptr, PostLexerType *postlex=nullptr, DiagPtr diag=nullptr, bool pragma_enable=true, RunTime *rt=nullptr)
bool PragmaCheck(const TermPtr &term)
static size_t ParseTerm(TermPtr &term, const BlockType &buffer, const size_t skip=0, bool pragma_enable=true)
std::map< std::string, std::string > m_predef_macro
void AstAddTerm(TermPtr &term)
static std::string GetCurrentTimeStampISO(time_t ts=std::time(NULL))
std::string m_name_module
std::vector< ParserLocation > m_loc_stack
bool PragmaEval(const TermPtr &term, BlockType &buffer, BlockType &seq)
static std::string GetCurrentDate(time_t ts=std::time(NULL))
static std::string GetCurrentTime(time_t ts=std::time(NULL))
PostLexerType * m_postlex
parser::token_type GetNextToken(TermPtr *yylval, parser::location_type *yylloc)
parser::token_type ExpandPredefMacro(TermPtr &term)
static std::string GetCurrentTimeStamp(time_t ts=std::time(NULL))
bool CheckPredefMacro(const TermPtr &term)
TermPtr CheckModuleTerm(const TermPtr &term)
std::string m_filename
stream name (file or input stream) used for error messages.
bool PragmaStaticAssert(const TermPtr &term)
TermPtr ParseFile(const std::string_view filename)
parser::location_type m_location
BlockType m_macro_analisys_buff
Последовательность лексем для анализа на наличие макросов
void ApplyDiags(DiagPtr diag=nullptr)
std::istringstream * m_macro_iss
parser::location_type m_macro_loc
parser::location_type * m_loc
virtual parser::token_type lex(TermPtr *yylval, parser::location_type *yylloc)
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)
bool GetValueAsBoolean() const
#define DEFINE_CASE(name)
__attribute__((weak)) std
#define LOG_RUNTIME(format,...)
#define ASSERT(condition)
const VariablePtr getEllipsysVar()
const TermPtr getDefaultType(const std::string_view text)
const TermPtr getRequiredTerm()
std::vector< std::string > PostLexerType
std::string ParserMessage(std::string &buffer, int row, int col, const char *format,...)
bool CheckCharModuleName(const std::string_view name)
const VariablePair & getNonePair()
bool isModuleName(const std::string_view name)
std::shared_ptr< Variable > VariablePtr
std::shared_ptr< Term > TermPtr
std::shared_ptr< Obj > ObjPtr
ExpandMacroResult ExpandTermMacro(Parser &parser)
void ParserException(const char *msg, std::string &buffer, int row, int col)
const ObjPtr getNoneObj()
const Variable & getNoneVar()
std::shared_ptr< Macro > MacroPtr
std::vector< TermPtr > BlockType
ObjType GetBaseTypeFromString(const std::string_view type_arg, bool *has_error=nullptr)
std::shared_ptr< Diag > DiagPtr
const char * toString(TermID type)
const TermPtr getNoneTerm()
bool isDefaultType(const TermPtr &term)
TermPtr ProcessMacro(Parser &parser, TermPtr &term)
const ObjPtr getEllipsysObj()
const TermPtr getEllipsysTerm()
bool canCast(const ObjType from, const ObjType to)
static const Variable var_none
static const ObjPtr obj_ellipsys
static const ObjPtr obj_none
static const TermPtr term_ellipsys
static const TermPtr type_default_none
static const VariablePair var_none_pair
static const TermPtr type_default_any
#define MAKE_TYPE(type_name)
static const TermPtr term_none
static const std::map< const std::string, const TermPtr > default_types
static const VariablePtr var_ellipsys
static const TermPtr term_required
#define NL_PARSER(term, format,...)
const char * DATE_BUILD_STR
const char * SOURCE_FULL_ID