diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e52e9c4..df06ce95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13.0) # --[ Alif version ] --------------------------------------------------------------- -project(AlifProject VERSION 3.0.40 DESCRIPTION "Alif Programming Language - Compiler.") +project(AlifProject VERSION 3.0.33 DESCRIPTION "Alif Programming Language - Compiler.") message("-- [ Alif version ${CMAKE_PROJECT_VERSION} ]") # --[ Uninstall ] ------------------------------------------------------------------ diff --git a/src/alif.cpp b/src/alif.cpp index fa3cf8b7..b28714d2 100644 --- a/src/alif.cpp +++ b/src/alif.cpp @@ -21,7 +21,7 @@ . */ -#define ALIF_VERSION "3.0.40 (Beta)" +#define ALIF_VERSION "3.0.34 (Beta)" // Stack ******************************************************** @@ -53,8 +53,10 @@ #endif // C++ Include ************************************************** + #include // #include // mblen, mbtowc, wchar_t(C) + #include // Standard replace() #include // Wait.. #include // warning C4244: 'argument': conversion from 'wchar_t' to 'const _Elem', possible loss of data @@ -71,6 +73,7 @@ #include // UTF8, Vectors // Thirdparty *************************************************** + // Boost #include #include @@ -84,1199 +87,7595 @@ #include #include #include + // UTF-8 #include "utf8.h" -// Core ********************************************************* -#include "alif_core.hpp" +// Alif v2 ****************************************************** -// Parser ******************************************************* -//#include "alif_bool.hpp" -#include "alif_class.hpp" -#include "alif_end.hpp" -#include "alif_function.hpp" -#include "alif_function_call.hpp" -#include "alif_function_class.hpp" -#include "alif_if.hpp" -#include "alif_if_else.hpp" -//#include "alif_int.hpp" -#include "alif_loop.hpp" -#include "alif_macro.hpp" -#include "alif_namespace.hpp" -#include "alif_next_break.hpp" -#include "alif_obj.hpp" -#include "alif_obj_new.hpp" -#include "alif_operator.hpp" -#include "alif_return.hpp" -//#include "alif_string.hpp" -#include "alif_var.hpp" -#include "alif_var_g.hpp" -#include "alif_var_g_class.hpp" +using namespace std; +bool DEBUG = false; +bool SyntaxOnly = false; +static const std::string VERSION = ALIF_VERSION; -void ALIF_PARSER(CLASS_TOKEN *o_tokens) { - if (!o_tokens->TOKENS_PREDEFINED) { - // Check for tokens not predifined +// Global ******************************************************* - if (ALREADY_PARSED_FILE_TOKENS_NOT_PREDEFINED[o_tokens - ->PATH_FULL_SOURCE]) { - if (DEBUG) - DEBUG_MESSAGE("\n Already Parsed(Not-Predifined) [" + - o_tokens->PATH_FULL_SOURCE + "] \n", - o_tokens); - return; - } else - ALREADY_PARSED_FILE_TOKENS_NOT_PREDEFINED[o_tokens - ->PATH_FULL_SOURCE] = - true; - } else { - // Check for tokens already predifined +// Alif v3 - if (ALREADY_PARSED_FILE_TOKENS_PREDEFINED[o_tokens->PATH_FULL_SOURCE]) { - if (DEBUG) - DEBUG_MESSAGE("\n Already Parsed(Predifined) [" + - o_tokens->PATH_FULL_SOURCE + "] \n", - o_tokens); - return; - } else - ALREADY_PARSED_FILE_TOKENS_PREDEFINED[o_tokens->PATH_FULL_SOURCE] = - true; - } +unsigned char *_base64_encode(const unsigned char *src, size_t len, + size_t *out_len); +unsigned char *_base64_decode(const unsigned char *src, size_t len, + size_t *out_len); +std::string base64_encode(std::string data); +std::string base64_decode(std::string data); - // For every line - for (o_tokens->Line = 1; o_tokens->Line <= o_tokens->TOTAL_LINES; - o_tokens->Line++) { - // Check total tokens on this current line - if (o_tokens->TOTAL[o_tokens->Line] < 1 || - o_tokens->TOTAL[o_tokens->Line] > 1024) { - // Empty line, or the index is memory-non-allocated - continue; - } +struct _settings { + struct _os { +#ifdef _WIN32 + std::string exe_ext = ".exe"; + std::string path_sep = "\\"; +#elif __APPLE__ + std::string exe_ext = ".app"; + std::string path_sep = "/"; +#else + std::string exe_ext = ""; + std::string path_sep = "/"; +#endif + } os; - std::string Token[2048]; +} settings; - // Clear TempToken[1024] on every line - // this is for fixing TempToken[p + 1] -> last token from last line! - for (int clear_p = 0; clear_p <= 1023; clear_p++) - TempToken[clear_p] = ""; +struct _argument { + struct _input { + std::string path = ""; + std::string filename = ""; + std::string extension = ""; + std::string fullpath = ""; + std::vector includes; + } input; - for (o_tokens->NUMBER = 1; - o_tokens->NUMBER <= o_tokens->TOTAL[o_tokens->Line]; - o_tokens->NUMBER++) { - // ----------------------------------------------------------------- - // Line Number : o_tokens->Line - // Token Number : o_tokens->NUMBER - // Token : - // o_tokens->TOKEN[std::make_pair(o_tokens->Line, o_tokens->NUMBER)] - // ----------------------------------------------------------------- - if (o_tokens - ->TOKEN[std::make_pair(o_tokens->Line, o_tokens->NUMBER)] != - "") - Token[o_tokens->NUMBER] = o_tokens->TOKEN[std::make_pair( - o_tokens->Line, o_tokens->NUMBER)]; - } + struct _output { + std::string path = ""; + std::string filename = ""; + std::string extension = ""; + std::string fullpath = ""; + } output; - if (Token[1] == "") continue; + struct _log { + std::string path = ""; + std::string filename = ""; + std::string extension = ""; + std::string fullpath = ""; + } log; - if (DEBUG) - DEBUG_MESSAGE(IntToString(o_tokens->Line) + ": ", - o_tokens); // DEBUG +} argument; - // ------------------------------------------------------------------------ +struct _script { + struct _main { + bool is_set = false; + std::string set_at_line = "0"; + } main; - if (Token[1] == "#") { - // Macros - parser_macro_ui(Token, o_tokens); - } +} script; - // --------------------------------------------------------------------------------- - // General Erros - // --------------------------------------------------------------------------------- +// Old - else if (!ALIF_FLAG_FILE[o_tokens->PATH_FULL_SOURCE]) - ErrorCode( - "يجب الإعلان عن علم ألف اولا، المرجو اضافة ' #ألف ' في الأعلى", - o_tokens); +// ----------------------------------------------------------- +// Reserved Words +// ----------------------------------------------------------- - else if (Token[1] == "خاص" && !IsInsideClass) // ERROR - ErrorCode("يجب استعمال ' خاص ' داخل صنف", o_tokens); - else if (Token[1] == "خاص" && Token[2] == "") - ErrorCode("يجب تحديد نوع المتغير بعد ' خاص ' ", o_tokens); - else if (Token[1] == "خاص" && - (Token[2] != "عدد" && Token[2] != "نص" && Token[2] != "منطق" && - Token[2] != "دالة")) // ERROR - ErrorCode( - "أمر غير معروف : ' " + Token[2] + - " ' ، على العموم أمر ' خاص ' يمكن استعماله فقط مع متغيرات " - "من نوع حرف، عدد، منطق، أو دالة", - o_tokens); +// ألف أضف مكتبة رئيسية _س_ واجهة خاص +// نهاية كلما مجال دالة عدد نص كائن إذا و أو سطر إرجاع صنف أداة نقر زر نص +// ملصق إظهار إخفاء تدمير عنوان نص تجميد عرض محتوى ارتفاع أفصول أرتوب - // --------------------------------------------------------------------------------- - // _س_ ... C++ ... _س_ - // --------------------------------------------------------------------------------- +static const std::string ALIF_RESERVED[] = { - else if (Token[1] == "_س_") { - if (!o_tokens->TOKENS_PREDEFINED) continue; + "ألف", "أضف", "مكتبة", "_س_", "مجال", "إرجاع", "نهاية", + "صنف", "خاص", "عدد", "نص", "كائن", "دالة", "هدم", + "بناء", "كلما", "إذا", "أو", "و", "وإلا", "سطر", + "صحيح", "خطأ", "كسر", "متغير", "ثابت", "منطق", "رئيسية"}; - if (!LIB_INSIDE_CPP_CODE) { - if (DEBUG) DEBUG_MESSAGE("{_س_ START} ", o_tokens); // DEBUG +static const int ALIF_RESERVED_TOTAL = 33; - LIB_INSIDE_CPP_CODE = true; - LIB_PARSER_CG_BUFER = ""; +static const std::vector DataType_v{"منطق", "نص", "عدد"}; - for (int p = 2; p <= o_tokens->TOTAL[o_tokens->Line]; - p++) // _س_ ...C++...@ Alif @...C++... _س_ - { - if (Token[p] == "_س_") // End C++ Code - { - if (DEBUG) - DEBUG_MESSAGE("{_س_ END} ", o_tokens); // DEBUG - LIB_INSIDE_CPP_CODE = false; +// ----------------------------------------------------------- +// Lexic Tokens Class +// Create Obj for every Alif Source files +// ----------------------------------------------------------- - // *** Generate Code *** - if (IsInsideClass) { - // Class Area - CPP_CLASS.append(" " + LIB_PARSER_CG_BUFER + " "); - // code_add(CODE, LIB_PARSER_CG_BUFER); - } else if (!IsInsideNamespace && !IsInsideFunction) { - // Global Area - CPP_GLOBAL.append(" " + LIB_PARSER_CG_BUFER + " "); - // code_add(CODE, LIB_PARSER_CG_BUFER); - } else if (!IsInsideNamespace && IsInsideFunction) { - // Global Function - CPP_GLOBAL_FUN.append(" " + LIB_PARSER_CG_BUFER + - " "); - // code_add(CODE, LIB_PARSER_CG_BUFER); - } else if (IsInsideNamespace && IsInsideFunction) { - // Local Function - cpp_AddScript(TheFunction, - " " + LIB_PARSER_CG_BUFER + " "); - // code_add(CODE, LIB_PARSER_CG_BUFER); - } else { - ErrorCode("علة: لم تنجح عملية ايجاد مكان شفرة سي++", - o_tokens); - } - // *** *** *** *** *** *** - } else if (Token[p] == "@") // @ Start ... - { - // ...C++...@ Alif @...C++... +std::string TempToken[1024]; +int TempTokenCount = 1; - if (DEBUG) DEBUG_MESSAGE("{@} ", o_tokens); // DEBUG +class CLASS_TOKEN { + public: + // ---------------------------------- + // Script Type + // ---------------------------------- - TempTokenCount = 1; // CheckForSyntax() Need this. - TempToken[0] = "="; // CheckForSyntax() Need this. + // to block setting Alif-Namespace inside library's + std::string ALIF_SCRIPT_TYPE; - bool AT_FOUND = false; + // ---------------------------------- + // File Path + // ---------------------------------- - for (int c = p + 1; c < o_tokens->TOTAL[o_tokens->Line]; - c++) { - if (Token[c] == "@") { - p = c; - AT_FOUND = true; - break; - } + // usr/username/Desktop/myproject/src/mysource.alif + // Used only by Lexer() + std::string PATH_FULL_SOURCE; - TempToken[TempTokenCount] = Token[c]; - TempTokenCount++; - } + // ---------------------------------- + // Tokens + // ---------------------------------- - if (!AT_FOUND) - ErrorCode("نهايه شفرة سي++ غير موجوده ' @ '", - o_tokens); + std::string + REAL_LINE[2048]; // The real Alif script line, without toknonisation ! + std::map, int> + REAL_TOKEN_POSITION; // The real Alif script token position in real + // line ! [Line Number, Token Number] = "real char + // number" - std::string CLASS_OR_WIN; - if (IsInsideClass) - CLASS_OR_WIN = TheClass; - else - CLASS_OR_WIN = TheNamespace; + bool TOKENS_PREDEFINED = false; - ScriptSyntaxBuffer = CheckForSyntax( - "C++", // OBJECTIF_TYPE - true, // Accept Using Reference to - // namespace:Controls - true, // Accept Using Reference to - // namespace:Function - true, // Accept Using Reference to Global Functions - true, // Accept Using Reference to Local Functions - true, // Accept Using Reference to Global VAR - true, // Accept Using Reference to Local VAR - true, // Accept Convertion from String To Int - true, // Accept Convertion from Int To String - TempToken, // SYNTAX[] std::string - (TempTokenCount - 1), // SYNTAX_LONG int - CLASS_OR_WIN, // TMP_WINDOW_NAME - TheFunction, // TMP_FUNCTION_NAME - o_tokens); + std::map, std::string> + TOKEN; // TOKEN [Line Number, Token Number] = "token" - if (DEBUG) DEBUG_MESSAGE("{@} ", o_tokens); // DEBUG + int TOTAL[2048]; + int TOTAL_LINES; + int NUMBER; + int Line; - // *** C++ *** - LIB_PARSER_CG_BUFER.append(" " + ScriptSyntaxBuffer + - " "); - // *** *** *** *** *** *** + // ---------------------------------- + // Constructor + // ---------------------------------- - // @ End. - } else if (Token[p] != "") { - // Add C++ Code to the buffer - LIB_PARSER_CG_BUFER.append(Token[p]); - if (DEBUG) - DEBUG_MESSAGE("{" + Token[p] + "} ", - o_tokens); // DEBUG - } - } - } else { - if (DEBUG) DEBUG_MESSAGE("{_س_ END} ", o_tokens); // DEBUG - LIB_INSIDE_CPP_CODE = false; - } - } + CLASS_TOKEN() { + TOTAL_LINES = 1; + NUMBER = 1; + Line = 1; + ALIF_SCRIPT_TYPE = ""; + PATH_FULL_SOURCE = ""; + } +}; + +// ---------------------------------- +// Alif Global Language Variables +// ---------------------------------- + +static std::string APP_TYPE = "PC_CONSOLE"; + +// ---------------------------------- +// Flag +// ---------------------------------- + +static std::map + ALIF_FLAG_FILE; // alif_flag[full_file_path] = true or false +static std::map + ALIF_FLAG_AT_LINE_FILE; // alif_flag[full_file_path] = at_line + +// ---------------------------------- +// صنف +// ---------------------------------- + +static std::map + CLASS_CONSTRICTOR_FUN_IS_SET; // abc[class] = main_func true or false +static std::map + CLASS_CONSTRICTOR_FUN_AT_LINE; // abc[class] = main_func_at_line +static std::map + CLASS_CONSTRICTOR_FUN_ARG_TOTAL; // abc[class] = total args +static std::map, std::string> + CLASS_CONSTRICTOR_FUN_ARG_TYPE; // abc[class][arg number] = arg type + +static bool IsInsideClass = false; +static std::string TheClass; +static std::map + CLASS_IS_SET; // abc['class name'] = already set ? +static std::map + CLASS_AT_LINE; // abc['class name'] = class at line + +static std::map, bool> + CLASS_FUN_IS_SET; // abc[class][fun] = class fun already set ? +static std::map, std::string> + CLASS_FUN_AT_LINE; // abc[class][fun] = class fun line number +static std::map, std::string> + CLASS_FUN_TYPE; // abc[class][fun] = class fun type +static std::map, bool> + CLASS_FUN_PRIVATE; // abc[class][fun] = class fun private ? +static std::map, int> + CLASS_FUN_ARG_TOTAL; // abc[class][fun] = global total args +static std::map, std::string> + CLASS_FUN_ARG_TYPE; // abc[class + fun][arg number] = arg type + +static std::map, bool> + CLASS_G_VAR_IS_SET; // abc[class][var] = global var already set ? +static std::map, std::string> + CLASS_G_VAR_AT_LINE; // abc[class][var] = global var line number +static std::map, std::string> + CLASS_G_VAR_TYPE; // abc[class][var] = global var type +static std::map, bool> + CLASS_G_VAR_PRIVATE; // abc[class][var] = global private ? +static std::map, bool> + CLASS_G_VAR_IS_CONST; // abc[class][var] = global var Constant +static std::map, bool> CLASS_G_VAR_IS_ARRAY; + +// ---------------------------------- +// كائن +// ---------------------------------- + +static std::map, bool> + OBJ_IS_SET; // abc[namespace + fun][obj] = already set ? +static std::map, std::string> + OBJ_AT_LINE; // abc[namespace + fun][obj] = line number +static std::map, std::string> + OBJ_CLASS; // abc[namespace + fun][obj] = base class +static std::map + OBJ_GLOBAL_DECLARATION; // abc[class] = Obj1; Obj2;... + +// ---------------------------------- +// مجال +// ---------------------------------- + +static bool IsInsideNamespace = false; +static std::string TheNamespace; + +int Namespace_Total = 0; +std::string Namespace_Total_Names[64]; + +// ---------------------------------- +// مجال رئيسية +// ---------------------------------- + +// static bool MAIN_WIN_IS_SET = false; +// static std::string MAIN_WIN_AT_LINE; + +// ---------------------------------- +// مجال +// ---------------------------------- + +static std::map + namespace_is_set; // abc['namespace_name'] = already set ? +static std::map + namespace_at_line; // abc['namespace_name'] = func_at_line +// static std::map WIN_IS_WEB; // +// abc['namespace_name'] = Web UI ? + +// ---------------------------------- +// دالة +// ---------------------------------- + +static bool IsInsideFunction = false; +static std::string TheFunction; +static std::string TheFunction_TYPE; +static std::map, std::string> + RETURN_FUN; // abc[win][fun] = return is ok ? "OK", "IF" +static bool IS_CONTROL_FUNCTION_NAME = false; + +// ---------------------------------- +// دالة رئيسية +// ---------------------------------- + +static std::map + MAIN_FUN_IS_SET; // abc['namespace_name'] = main_func true or false +static std::map + MAIN_FUN_AT_LINE; // abc['namespace_name'] = main_func_at_line + +// ---------------------------------- +// دالة +// ---------------------------------- + +static std::map + G_FUN_IS_SET; // abc[gfun] = global fun already set ? +static std::map + G_FUN_AT_LINE; // abc[gfun] = global fun line number +static std::map + G_FUN_TYPE; // abc[gfun] = global fun type +static std::map + G_FUN_ARG_TOTAL; // abc[gfun] = global total args +static std::map, std::string> + G_FUN_ARG_TYPE; // abc[gfun][arg number] = arg type +int Global_TotalFucntion = 0; +static std::map + Global_FunctionNames; // abc[global fun number] = func name + +static std::map, bool> + L_FUN_IS_SET; // abc[namespace_name][fun] = local fun already set ? +static std::map, std::string> + L_FUN_AT_LINE; // abc[namespace_name][fun] = local fun line number +static std::map, std::string> + L_FUN_TYPE; // abc[namespace_name][fun] = local fun type +static std::map, int> + L_FUN_ARG_TOTAL; // abc[namespace_name][fun] = global total args +static std::map, std::string> + L_FUN_ARG_TYPE; // abc[namespace_name + fun][arg number] = arg type + +int Win_CurrentTotalFucntion = 0; +static std::map + Win_TotalFucntion; // abc[namespace_name] = total functions +static std::map, std::string> + Win_FunctionNames; // abc[namespace_name][fun number] = func name + +static std::string NEW_FUNCTION_ARG = ""; + +// ----------------------------------------------------------- +// VARs +// ----------------------------------------------------------- + +// Local var + +static std::map, bool> + L_VAR_IS_SET; // abc[namespace_name + func][var] = local var already set ? +static std::map, std::string> + L_VAR_AT_LINE; // abc[namespace_name + func][var] = local var line number +static std::map, std::string> + L_VAR_TYPE; // abc[namespace_name + func][var] = local var type +static std::map, bool> + L_VAR_IS_CONST; // abc[namespace_name + func][var] = local var Constant +static std::map, bool> L_VAR_IS_ARRAY; + +// Global var + +static std::map + G_VAR_IS_SET; // abc[var] = global var already set ? +static std::map + G_VAR_AT_LINE; // abc[var] = global var line number +static std::map + G_VAR_TYPE; // abc[var] = global var type +static std::map + G_VAR_IS_CONST; // abc[var] = global var Constant +static std::map G_VAR_IS_ARRAY; +static int G_VAR_TOTAL = 0; // Total of global vars +static std::map G_VAR_NAMES; // abc[var] = var_name + +// ---------------------------------- +// PARENTHESIS +// ---------------------------------- + +static int ALIF_PARENTHESIS_STATUS = 0; + +// ---------------------------------- +// IF +// ---------------------------------- + +static int ALIF_IF_STATUS = 0; +static bool IS_IF_SYNTAX = false; + +// ---------------------------------- +// LOOP +// ---------------------------------- + +static int ALIF_LOOP_STATUS = 0; + +// ----------------------------------------------------------- +// DEBUG / ERROR / LOG +// ----------------------------------------------------------- + +// Debug + +bool DEBUG_PRINT_ON_SCREEN = false; +bool THIS_IS_ALIF_C_FILE = false; + +// Error + +bool ERROR_PRINT_ON_SCREEN = false; +bool ERROR_AS_JSON = false; +bool ERROR_AS_JSON64 = false; + +// Log +std::string LOG_MESSAGE_FULL = ""; + +// ----------------------------------------------------------- +// CPP BUFERs +// ----------------------------------------------------------- + +std::string CBUFER; +std::string CBUFER_ID; +std::string CBUFER_OBJ; +std::string ScriptSyntaxBuffer; +std::string ScriptBuffer; + +// ----------------------------------------------------------- +// C++ Code Inside Alif Code +// ----------------------------------------------------------- + +static bool LIB_INSIDE_CPP_CODE = false; +std::string LIB_LEXER_CG_BUFER; +std::string LIB_PARSER_CG_BUFER; + +// ----------------------------------------------------------- +// ALIF COMPILER VARs +// ----------------------------------------------------------- + +static std::map ALREADY_PARSED_FILE_TOKENS_NOT_PREDEFINED; +static std::map ALREADY_PARSED_FILE_TOKENS_PREDEFINED; + +std::string PATH_FULL_ALIF; // Desktop/myapp.alif +std::string PATH_FULL_BIN; // Desktop/mybin.bin +std::string PATH_FULL_LOG; // Desktop/myapp.log + +std::string cc_path_full; // Linux : 'gcc' | Win : c:\Alif\bin\gcc.exe +std::string PATH_FULL_CPP; // tmp/123456789.cpp +std::string PATH_FULL_OBJ; // tmp/123456789.o +std::string PATH_FULL_RC; // tmp/123456789.rc +std::string + PATH_FULL_ICO; // Mac: /usr/share/aliflang/alif.ics | Win: c:\Alif\alif.ico +#if __APPLE__ +std::string PATH_FULL_PLIST; // Mac only +std::string PATH_FULL_BIN_TMP; // Tmp/mybin.bin +#endif - else if (LIB_INSIDE_CPP_CODE) { - // Continue to adding C++ Code to the Buffer +std::string PATH_ABSOLUTE; +std::string PATH_WORKING; - for (int p = 1; p <= o_tokens->TOTAL[o_tokens->Line]; - p++) // _س_ ...C++...@ Alif @...C++... _س_ - { - if (Token[p] == "_س_") // End C++ Code - { - if (DEBUG) DEBUG_MESSAGE("{_س_ END} ", o_tokens); // DEBUG - LIB_INSIDE_CPP_CODE = false; +std::string PATH_TEMP; // /usr/tmp +std::string RANDOM; // 1234 - // if(DEBUG)DEBUG_MESSAGE("\n\n GENERATOR -------> |" + - // LIB_PARSER_CG_BUFER + "| \n\n", o_tokens); // DEBUG +std::string PATH_FULL_LIB_SETTING; // 'gcc' | c:\Alif\aliflib\aliflib.inf +// std::map LIB_FILE_NAME; - // *** Generate Code *** - if (IsInsideClass) { - // Class Area - CPP_CLASS.append(" " + LIB_PARSER_CG_BUFER + " "); - // code_add(CODE, LIB_PARSER_CG_BUFER); - } else if (!IsInsideNamespace && !IsInsideFunction) { - // Global Area - CPP_GLOBAL.append(" " + LIB_PARSER_CG_BUFER + " "); - // code_add(CODE, LIB_PARSER_CG_BUFER); - } else if (!IsInsideNamespace && IsInsideFunction) { - // Global Function - CPP_GLOBAL_FUN.append(" " + LIB_PARSER_CG_BUFER + " "); - // code_add(CODE, LIB_PARSER_CG_BUFER); - } else if (IsInsideNamespace && IsInsideFunction) { - // Local Function - cpp_AddScript(TheFunction, - " " + LIB_PARSER_CG_BUFER + " "); - // code_add(CODE, LIB_PARSER_CG_BUFER); - } else { - ErrorCode("علة: لم تنجح عملية ايجاد مكان شفرة سي++", - o_tokens); - } - // *** *** *** *** *** *** - } else if (Token[p] == "@") // @ Start ... - { - // ...C++...@ Alif @...C++... +// Complet path of Web UI window (HTML5) file +// Used by parser #window_web +// std::string PATH_FULL_WINDOW_WEB; - if (DEBUG) DEBUG_MESSAGE("{@} ", o_tokens); // DEBUG +#ifdef _WIN32 +std::string SEPARATION = "\\"; +#else +std::string SEPARATION = "/"; +#endif - TempTokenCount = 1; // CheckForSyntax() Need this. - TempToken[0] = "="; // CheckForSyntax() Need this. +// ----------------------------------------------------------- +// Compile Extra commands +// ----------------------------------------------------------- - bool AT_FOUND = false; +std::string Compile_ExtraCompile = " "; // -I/... +std::string Compile_ExtraLink = " "; // -L\"/...\" -lmylib... - for (int c = p + 1; c < o_tokens->TOTAL[o_tokens->Line]; - c++) { - if (Token[c] == "@") { - p = c; - AT_FOUND = true; - break; - } +void add_extra_arg_to_compiler(std::string cmd) { + Compile_ExtraCompile.append(cmd); + Compile_ExtraCompile.append(" "); + // std::cout << "\n\n--------------\nAdd compile: |" << cmd << + // "|\n--------------\n"; +} - TempToken[TempTokenCount] = Token[c]; - TempTokenCount++; - } +void add_extra_arg_to_linker(std::string cmd) { + Compile_ExtraLink.append(cmd); + Compile_ExtraLink.append(" "); + // std::cout << "\n\n--------------\nAdd link: |" << cmd << + // "|\n--------------\n"; +} - if (!AT_FOUND) - ErrorCode("نهايه شفرة سي++ غير موجوده ' @ '", o_tokens); +void add_extra_arg_to_compiler_beginning(std::string cmd) { + Compile_ExtraCompile.insert(0, (cmd + " ")); + // std::cout << "\n\n--------------\nAdd compile beginning: |" << cmd << + // "|\n--------------\n"; +} - std::string CLASS_OR_WIN; - if (IsInsideClass) - CLASS_OR_WIN = TheClass; - else - CLASS_OR_WIN = TheNamespace; +void add_extra_arg_to_linker_beginning(std::string cmd) { + Compile_ExtraLink.insert(0, (cmd + " ")); + // std::cout << "\n\n--------------\nAdd link beginning: |" << cmd << + // "|\n--------------\n"; +} - ScriptSyntaxBuffer = CheckForSyntax( - "C++", // OBJECTIF_TYPE - true, // Accept Using Reference to namespace:Controls - true, // Accept Using Reference to namespace:Function - true, // Accept Using Reference to Global Functions - true, // Accept Using Reference to Local Functions - true, // Accept Using Reference to Global VAR - true, // Accept Using Reference to Local VAR - true, // Accept Convertion from String To Int - true, // Accept Convertion from Int To String - TempToken, // SYNTAX[] std::string - (TempTokenCount - 1), // SYNTAX_LONG int - CLASS_OR_WIN, // TMP_WINDOW_NAME - TheFunction, // TMP_FUNCTION_NAME - o_tokens); +// ----------------------------------------------------------- +// Python +// ----------------------------------------------------------- - if (DEBUG) DEBUG_MESSAGE("{@} ", o_tokens); // DEBUG +// -I/usr/include/python3.5 +// -L\"/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu\" -lpython3.5 - // *** C++ *** - LIB_PARSER_CG_BUFER.append(" " + ScriptSyntaxBuffer + " "); - // *** *** *** *** *** *** +std::string PythonInclude_path = ""; +std::string PythonLib_path = ""; +std::string PythonLibName = ""; - // @ End. - } else if (Token[p] != "") { - // Add C++ Code to the buffer - LIB_PARSER_CG_BUFER.append(Token[p]); - if (DEBUG) - DEBUG_MESSAGE("{" + Token[p] + "} ", - o_tokens); // DEBUG - } - } - } +void PythonSetEnvirenment() { + // ------------------------------- + // Python cmd: python3 -c "import sys; print(sys.path)" + // Python includes -> /usr/include/python3.5 + // Python Libs -> + // /usr/lib/python3.5/config-3.5m-x86_64-linux-gnu python lib name -> + // python3.5 + // ------------------------------- - else if (Token[1] == "@") { - if (!LIB_INSIDE_CPP_CODE) - ErrorCode("يجب تحديد ' _س_ ' قبل ' @ '", o_tokens); + // TODO: if thos var are empty, then get python paths by cmd. - ErrorCode("لا يمكن بدء السطر بالإشارة ' @ '", o_tokens); - } + std::string buffer = " -I\"" + PythonInclude_path + "\" "; - // --------------------------------------------------------------------------------- + add_extra_arg_to_compiler(buffer); - // else if (Token[1] == "أداة"){ - // parser_Control(Token, o_tokens); - // } + buffer = " -L\"" + PythonLib_path + "\" -l" + PythonLibName + " "; - else if (Token[1] == "مجال") { - // parser_NewWindow(Token, o_tokens); - parser_new_namespace(Token, o_tokens); - } + add_extra_arg_to_linker(buffer); +} - /* - else if (Token[1] == "عدد" || - Token[1] == "نص" || - Token[1] == "منطق" || - Token[1] == "منطق" || - Token[1] == "خاص" || - Token[1] == "ثابت") - CheckForNewVar(Token, o_tokens); - */ +// Headers ****************************************************** + +// Core +std::string CHECK_CALL_FUN_ARG( + bool CALL_FUN_GLOBAL, + std::string CALL_WIN_OR_CLASS, // win1/class1 { fun1(int a) } | win2 { + // fun2{ عدد b; fun1(b) } } ==> win1 + std::string CALL_FUN, // win1 { fun1(int a) } | win2 { fun2{ عدد b; fun1(b) + // } } ==> fun1 + int CALL_IS_CLASS, // 0 = non class, 1 constructor, 2 = الدالة member, ل + // Message when new obj + std::string FROM_WIN_OR_CLASS, // win1 { fun1(int a) } | win2 { fun2{ عدد + // b; fun1(b) } } ==> win2 + std::string FROM_FUN, // win1 { fun1(int a) } | win2 { fun2{ عدد b; fun1(b) + // } } ==> fun2 + std::string SYNTAX[2048], int SYNTAX_LONG, CLASS_TOKEN *o_tokens); + +// Parser +void SetNewVar(bool IsGlobal, std::string TempNS, std::string TmpFunction, + std::string VarName, std::string VarDataType, bool IsConstant, + bool IsArray, int Line, CLASS_TOKEN *o_tokens); + +// void parser_NewWindowWeb(std::string Token[2048], CLASS_TOKEN *o_tokens); + +// Lexer +void AlifLexerParser(std::string file, std::string target, bool is_first_file, + bool is_predefined); + +// Log ********************************************************** + +void clean_str_json(std::string &s) { + boost::algorithm::replace_all(s, "\r", ""); + boost::algorithm::replace_all(s, "\n", ""); + boost::algorithm::trim(s); + + if (ERROR_AS_JSON64) { + // boost::beast::detail::base64::encode((void *)s.c_str(), (void + // *)s.c_str(), s.length()); size_t len = 0; _base64_encode((const + // unsigned char *) s.c_str(), s.length(), &len); + s = base64_encode(s); + boost::algorithm::replace_all(s, "\r", ""); // remove \r on windows + boost::algorithm::replace_all(s, "\n", ""); // remove \n + boost::algorithm::replace_all(s, "\\n", ""); // skip auto 72 char break + } else { + boost::algorithm::replace_all(s, "\\", "\\\\"); + boost::algorithm::replace_all(s, "\"", "\\\""); + } +} - else if (Token[1] == "عدد" || - (Token[1] == "خاص" && Token[2] == "عدد")) { - parser_Int(Token, o_tokens); - } +void ALIF_ERROR(std::string ERROR_DESCRIPTION) { + cout << endl << ERROR_DESCRIPTION << endl << endl; - else if (Token[1] == "نص" || (Token[1] == "خاص" && Token[2] == "نص")) { - parser_String(Token, o_tokens); - } + boost::nowide::ofstream file; - else if (Token[1] == "منطق" || - (Token[1] == "خاص" && Token[2] == "منطق")) { - parser_bool(Token, o_tokens); - } + if (ERROR_AS_JSON) { + clean_str_json(ERROR_DESCRIPTION); - else if (Token[1] == "صنف") { - parser_Class(Token, o_tokens); - } + ERROR_DESCRIPTION = "{\"file\":\"\",\"line\":\"0\",\"msg\":\"" + + ERROR_DESCRIPTION + "\"}"; + } - else if ((Token[1] == "دالة" && IsInsideClass) || - (Token[1] == "خاص" && Token[2] == "دالة" && IsInsideClass)) { - parser_FunctionClass(Token, o_tokens); - } + file.open(PATH_FULL_LOG, ios::app); + file << ERROR_DESCRIPTION; + file.close(); - else if (Token[1] == "دالة") { - parser_Function(Token, o_tokens); - } + exit(EXIT_FAILURE); +} - else if (Token[1] == "إذا" || Token[1] == "أو") { - parser_IfOr(Token, o_tokens); - } +void DEBUG_MESSAGE(std::string MESSAGE, CLASS_TOKEN *o_tokens) { + LOG_MESSAGE_FULL.append(MESSAGE); - else if (Token[1] == "وإلا") { - parser_IfElse(Token, o_tokens); - } + if (DEBUG_PRINT_ON_SCREEN) { + cout << MESSAGE; + } +} - else if (Token[1] == "كلما") { - parser_While(Token, o_tokens); - } +void LogMessage(std::string MESSAGE) { + LOG_MESSAGE_FULL.append(MESSAGE); - else if (Token[1] == "التالي" || Token[1] == "كسر") { - parser_NextBreak(Token, o_tokens); - } + if (DEBUG_PRINT_ON_SCREEN) { + cout << MESSAGE; + } +} - else if (Token[1] == "إرجاع") { - parser_Return(Token, o_tokens); - } +void PATH_FULL_LOG_SAVE() { + boost::nowide::ofstream file; - else if (Token[1] == "كائن" || CLASS_IS_SET[Token[1]]) { - parser_ObjNew(Token, o_tokens); - } + file.open(PATH_FULL_LOG); + file << LOG_MESSAGE_FULL; + file.close(); +} - else if (OBJ_IS_SET[std::make_pair( - TheNamespace + TheFunction, - Token[1])] || // Namespace -> Func. Local Obj. - OBJ_IS_SET[std::make_pair( - TheClass + TheFunction, - Token[1])] || // Class -> Func. Local Obj. - OBJ_IS_SET[std::make_pair(TheClass, - Token[1])] || // Class. - // Global Class Obj. - OBJ_IS_SET[std::make_pair( - "", - Token[1])]) { // Global Area. Global Obj. - parser_Obj(Token, o_tokens); - } +void ErrorCode(std::string error_message, CLASS_TOKEN *o_tokens) { + if (DEBUG) + DEBUG_MESSAGE("\n ----------- DEBUGING ERROR ------------- \n", + o_tokens); + if (DEBUG) DEBUG_MESSAGE("Namespace : " + TheNamespace + " \n", o_tokens); + if (DEBUG) DEBUG_MESSAGE("Class : " + TheClass + " \n", o_tokens); + if (DEBUG) DEBUG_MESSAGE("Fun : " + TheFunction + " \n\n", o_tokens); + + std::string error_file = o_tokens->PATH_FULL_SOURCE; + std::string error_line = + o_tokens->Line > 0 ? boost::lexical_cast(o_tokens->Line) + : "0"; + + std::string ERR_MSG; + + if (ERROR_AS_JSON) { + // JSON Format + clean_str_json(error_message); + clean_str_json(error_file); + + ERR_MSG = "{\"file\":\"" + error_file + "\",\"line\":\"" + error_line + + "\",\"msg\":\"" + error_message + "\"}"; + } else { + ERR_MSG = " الملف : " + error_file + "\n"; + ERR_MSG.append(" السطر : " + error_line + "\n"); + ERR_MSG.append("\n الخطأ : " + error_message); + } - else if (L_VAR_IS_SET[std::make_pair(TheNamespace + TheFunction, - Token[1])] || - L_VAR_IS_SET[std::make_pair(TheClass + TheFunction, - Token[1])]) { - parser_Var(Token, o_tokens); - } + if (ERROR_PRINT_ON_SCREEN) + cout << "---| Alif Debug |--------------" << endl + << ERR_MSG << endl + << "------------------------" << endl; - else if (CLASS_G_VAR_IS_SET[std::make_pair(TheClass, Token[1])] && - IsInsideClass) { - parser_VarGlobalClass(Token, o_tokens); - } + LOG_MESSAGE_FULL.append(ERR_MSG); - else if (substr_utf8(Token[1], 0, 1) == "_" || - G_VAR_IS_SET[(Token[1])]) { - parser_VarGlobal(Token, o_tokens); - } + PATH_FULL_LOG_SAVE(); - // Call function (Global / Local / Class-fun) + // Alif Studio v2 + // Exit code must be 'success', to let IDE read from DEBUG_MESSAGE file + // if exit_failur, so IDE read data from process output - else if (G_FUN_IS_SET[(Token[1])] || - L_FUN_IS_SET[std::make_pair(TheNamespace, Token[1])] || - CLASS_FUN_IS_SET[std::make_pair(TheClass, Token[1])]) { - parser_FunctionCall(Token, o_tokens); - } + exit(EXIT_FAILURE); +} - else if ( // CONTROL_WIN_IS_SET[Token[1]] || - namespace_is_set - [Token[1]] // || - // CONTROL_IS_SET[std::make_pair(TheNamespace, - // Token[1])] || - //(Token[1] == "رئيسية" && - // MAIN_WIN_IS_SET) - ) { - parser_TwoPointOperator(Token, o_tokens); +// Core ********************************************************* + +// New + +void str_arr_remove_elem(std::string *arr, int to_remove, int len) { + for (int i = to_remove; i < len; ++i) { + arr[i] = arr[i + 1]; + } + + arr[len] = "\0"; +} + +void err(std::string des) { + std::cout << "[!] Error" << std::endl << des << std::endl; + + // IDE must redirect output to a log file. + // no more log file like Alif v2 series. + + // boost::nowide::ofstream file; + // file.open (PATH_FULL_LOG, ios::app); + // file << des; + // file.close(); + + exit(EXIT_FAILURE); +} + +std::string get_path(std::string str) { return ""; } + +bool is_file_exists(std::string f) { + // std::cout << "is_file_exists(" << f << ");" << std::endl; + + boost::nowide::ifstream infile(f); + return infile.good(); +} + +void file_embed(std::string file_path, std::string &var, + CLASS_TOKEN *o_tokens) { + // This function can be completely be replaced in c++20 by + // This function basically read a file and update ref by the file + // content (const string). + + if (!is_file_exists(file_path)) + ErrorCode("ملف غير موجود : ' " + file_path + " ' ", o_tokens); + + boost::nowide::ifstream rBuffer(file_path); + stringstream buf; + buf << rBuffer.rdbuf(); + rBuffer.close(); + + var.clear(); + // var.append(buf.str()); + var = buf.str(); +} + +// Old + +int Generated_ID = 10000; +int ID_GENERATOR() { + // return rand() % 10 + 10000; + return Generated_ID++; +} + +bool replace(std::string &str, const std::string &from, const std::string &to) { + size_t start_pos = str.find(from); + + if (start_pos == std::string::npos) return false; + + str.replace(start_pos, from.length(), to); + + return true; +} + +bool replace_end(std::string &str, const std::string &from, + const std::string &to) { + size_t start_pos = str.rfind(from); + + if (start_pos == std::string::npos) return false; + + str.replace(start_pos, from.length(), to); + + return true; +} + +std::string substr_utf8(std::string originalString, int Position, int MaxLen) { + std::string resultString_start = originalString; + const char *aStr_start = originalString.c_str(); + + int len = 0; + int byteCount = 0; + + if (Position > 0) { + while (*aStr_start) { + if ((*aStr_start & 0xc0) != 0x80) { + len += 1; + } + + if (len > Position) { + resultString_start = resultString_start.substr(byteCount); + break; + } + + byteCount++; + + aStr_start++; } + } - else if (Token[1] == "نهاية") { - parser_End(Token, o_tokens); + if (MaxLen == 0) { + return resultString_start; + } else { + // Initialization + len = 0; + byteCount = 0; + + std::string resultString = resultString_start; + + const char *aStr = resultString_start.c_str(); + + while (*aStr) { + if ((*aStr & 0xc0) != 0x80) { + len += 1; + } + + if (len > MaxLen) { + resultString = resultString.substr(0, byteCount); + break; + } + + byteCount++; + aStr++; } - // ####################################################### + return resultString; + } +} - else { - if (!o_tokens->TOKENS_PREDEFINED) { - if (Control_ID[Token[1]] != "") { - // show error description - // when, (no-win) CTR:OPTION - // in global area. +std::string IntToString(int INT_VAL) { + // Int --> String - ErrorCode("أمر غير معروف : ' " + Token[1] + - " '، على العموم، إن كنت تقصد أداة، لا تنسى " - "أن تحدد إسم " - "النافذة قبل إسم الأداة ", - o_tokens); - } - // مجال - else if (Token[1] == "مجال" || Token[1] == "المجال" || - Token[1] == "النافذة" || Token[1] == "نافدت" || - Token[1] == "نافذت" || Token[1] == "نافذ" || - Token[1] == "نافد") { - ErrorCode("أمر غير معروف : ' " + Token[1] + - " '، هل تقصد ' مجال ' ؟ ", - o_tokens); - } - // نص - else if (Token[1] == "كلمة" || Token[1] == "حروف" || - Token[1] == "الحرف" || Token[1] == "نص" || - Token[1] == "الحروف" || Token[1] == "جملة") { - ErrorCode("أمر غير معروف : ' " + Token[1] + - " '، هل تقصد ' نص ' ؟ ", - o_tokens); - } - // إذا - else if (Token[1] == "ادا" || Token[1] == "إدا" || - Token[1] == "أدا" || Token[1] == "اذا" || - Token[1] == "أذا") { - ErrorCode("أمر غير معروف : ' " + Token[1] + - " '، هل تقصد ' إذا ' ؟ ", - o_tokens); - } - // أو - else if (Token[1] == "او" || Token[1] == "ٱو" || - Token[1] == "آو" || Token[1] == "والا" || - // Token[1] == "وإلا" || - Token[1] == "وألا") { - ErrorCode("أمر غير معروف : ' " + Token[1] + - " '، هل تقصد ' وإلا ' أو تقصد ' أو ' ؟ ", - o_tokens); - } - // أداة - else if (Token[1] == "اداة" || Token[1] == "اداه" || - Token[1] == "ادات" || Token[1] == "آداة" || - Token[1] == "آداه" || Token[1] == "آدات" || - Token[1] == "أداه" || Token[1] == "أدات" || - Token[1] == "ٱداة" || Token[1] == "ٱداه" || - Token[1] == "ٱدات") { - ErrorCode("أمر غير معروف : ' " + Token[1] + - " '، هل تقصد ' أداة ' ؟ ", - o_tokens); - } - // أضف - else if (Token[1] == "اضف" || Token[1] == "ٱضف" || - Token[1] == "آضف" || Token[1] == "أظف" || - Token[1] == "اظف" || Token[1] == "ٱظف" || - Token[1] == "آظف" || Token[1] == "إظف" || - Token[1] == "إضف") { - ErrorCode("أمر غير معروف : ' " + Token[1] + - " '، هل تقصد ' #أضف ' ؟ ", - o_tokens); - } - // خاص - else if (Token[1] == "خص" || Token[1] == "حاص" || - Token[1] == "الخاص" || Token[1] == "الحاص") { - ErrorCode("أمر غير معروف : ' " + Token[1] + - " '، هل تقصد ' خاص ' ؟ ", - o_tokens); - } - // إرجاع - else if (Token[1] == "رجوع" || Token[1] == "الرجوع" || - Token[1] == "return" || Token[1] == "أرجاع" || - Token[1] == "ارجاع") { - ErrorCode("أمر غير معروف : ' " + Token[1] + - " '، هل تقصد ' إرجاع ' ؟ ", - o_tokens); - } + stringstream STRING_STREAM_BUFFER; + STRING_STREAM_BUFFER << INT_VAL; + std::string STRING_BUFFER = STRING_STREAM_BUFFER.str(); + return STRING_BUFFER; +} - // Yes, Unknow Token.. but meybe the definition - // of this unknown token is in the next lines - // so lets Parse all Tokens first, then re-parse again - } else { - // else - ErrorCode("أمر غير معروف : ' " + Token[1] + " ' ", o_tokens); - } +std::string CONVERT_STRING_ARRAY_TO_STRING(std::string STRING_ARRAY_VAL[1024], + int LONG) { + // std::string[123] --> String + stringstream STRING_STREAM_BUFFER; + + if (LONG < 1) return ""; + + for (int p = 0; p <= LONG; p++) { + STRING_STREAM_BUFFER << STRING_ARRAY_VAL[p]; + } + + std::string STRING_BUFFER = STRING_STREAM_BUFFER.str(); + return STRING_BUFFER; +} + +std::string CONVERT_WCHAT_T_TO_STRING(wchar_t *WCHART_T_VAL) { + // wchar_t --> String + + // const wstring W_STRING_BUFFER (WCHART_T_VAL); + // const std::string STRING_BUFFER (W_STRING_BUFFER.begin(), + // W_STRING_BUFFER.end()); return STRING_BUFFER; + + using convert_typeX = std::codecvt_utf8; + std::wstring_convert converterX; + return converterX.to_bytes(WCHART_T_VAL); +} + +std::string CONVERT_CHAR_TO_STRING(char *CHART_VAL) { + // Char --> String + std::string STRING_BUFFER(CHART_VAL); + return STRING_BUFFER; +} + +std::wstring s_to_ws(const std::string &str) { + using convert_typeX = std::codecvt_utf8; + std::wstring_convert converterX; + + return converterX.from_bytes(str); +} + +std::string ws_to_s(const std::wstring &wstr) { + using convert_typeX = std::codecvt_utf8; + std::wstring_convert converterX; + + return converterX.to_bytes(wstr); +} + +// ----------------------------------------------------------- +// Bse64 +// ----------------------------------------------------------- + +// https://github.com/ReneNyffenegger/cpp-base64/blob/master/base64.cpp + +static const std::string base64_chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + +static inline bool is_base64(unsigned char c) { + return (isalnum(c) || (c == '+') || (c == '/')); +} + +// const std::string s = "..."; +// std::string encoded = base64_encode(reinterpret_cast(s.c_str()), s.length()); std::string decoded = base64_decode(encoded); + +std::string base64_encode(unsigned char const *bytes_to_encode, + unsigned int in_len) { + std::string ret; + int i = 0; + int j = 0; + unsigned char char_array_3[3]; + unsigned char char_array_4[4]; + + while (in_len--) { + char_array_3[i++] = *(bytes_to_encode++); + if (i == 3) { + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + + ((char_array_3[2] & 0xc0) >> 6); + char_array_4[3] = char_array_3[2] & 0x3f; + + for (i = 0; (i < 4); i++) ret += base64_chars[char_array_4[i]]; + i = 0; } + } - // ####################################################### + if (i) { + for (j = i; j < 3; j++) char_array_3[j] = '\0'; - if (o_tokens->TOKENS_PREDEFINED) - if (DEBUG) DEBUG_MESSAGE("\n\n", o_tokens); + char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; + char_array_4[1] = + ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); + char_array_4[2] = + ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); - } // End Line Loop + for (j = 0; (j < i + 1); j++) ret += base64_chars[char_array_4[j]]; - // ------------------------- - // Check current file - // if (o_tokens->TOKENS_PREDEFINED) - FINAL_CURRENT_FILE_CODE_CHECKING(o_tokens); - // ------------------------- + while ((i++ < 3)) ret += '='; + } + + return ret; } -// Lexer ******************************************************** +/* +std::string base64_decode(std::string const& encoded_string) { +size_t in_len = encoded_string.size(); +int i = 0; +int j = 0; +int in_ = 0; +unsigned char char_array_4[4], char_array_3[3]; +std::string ret; + +while (in_len-- && ( encoded_string[in_] != '=') && +is_base64(encoded_string[in_])) { char_array_4[i++] = encoded_string[in_]; +in_++; if (i ==4) { for (i = 0; i <4; i++) char_array_4[i] = +base64_chars.find(char_array_4[i]) & 0xff; + + char_array_3[0] = ( char_array_4[0] << 2 ) + ((char_array_4[1] & +0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + +((char_array_4[2] & 0x3c) >> 2); char_array_3[2] = ((char_array_4[2] & 0x3) << +6) + char_array_4[3]; + + for (i = 0; (i < 3); i++) + ret += char_array_3[i]; + i = 0; + } +} -void ALIF_VAR_INITIALIZATION_FOR_NEW_SOURCE_FILE(bool FIRST_FILE) { - // ---------------------------------- - // مجال - // ---------------------------------- +if (i) { + for (j = 0; j < i; j++) + char_array_4[j] = base64_chars.find(char_array_4[j]) & 0xff; - // if (FIRST_FILE) - // { - // MAIN_WIN_IS_SET = false; - // MAIN_WIN_AT_LINE = "0"; - // } + char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> +4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) +>> 2); - IsInsideNamespace = false; - TheNamespace = ""; + for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; +} - // ---------------------------------- - // دالة - // ---------------------------------- +return ret; +} +*/ - IsInsideFunction = false; - TheFunction = ""; +// ----------------------------------------------------------- +// CPP Set Variables Name +// ----------------------------------------------------------- - // ---------------------------------- - // PARENTHESIS / IF - // ---------------------------------- +static std::map ID; // abc[var] = V1000 +static std::map Global_ID; // abc[var] = G_V1000 +static std::map Control_ID; // abc[var] = C_V1000 +static std::map Obj_ID; // abc[var] = OBJ_V1000 +static std::map + GlobalObj_ID; // abc[var] = G_OBJ_V1000 - ALIF_PARENTHESIS_STATUS = 0; +void SET_OBJ_C_NAME(std::string VAR) { + if (Obj_ID[VAR] == "") Obj_ID[VAR] = "OBJ_" + IntToString(ID_GENERATOR()); +} - ALIF_IF_STATUS = 0; +void SET_GLOBAL_OBJ_C_NAME(std::string VAR) { + if (GlobalObj_ID[VAR] == "") + GlobalObj_ID[VAR] = "G_OBJ_" + IntToString(ID_GENERATOR()); +} - // ---------------------------------- - // Code - // ---------------------------------- +void SET_C_NAME(std::string VAR) { + if (ID[VAR] == "") ID[VAR] = "V_" + IntToString(ID_GENERATOR()); +} - ScriptSyntaxBuffer = ""; - ScriptBuffer = ""; +void SET_GLOBAL_C_NAME(std::string VAR) { + if (Global_ID[VAR] == "") + Global_ID[VAR] = "G_V_" + IntToString(ID_GENERATOR()); } -void ADD_TOKEN(std::string TOKEN_CHAR, bool NEW_TOKEN, bool NEW_TOKEN_AFTER, - int REAL_CHAR_NUMBER, CLASS_TOKEN *o_tokens) { - if (NEW_TOKEN) { - // New Token - if (o_tokens->TOKEN[std::make_pair( - o_tokens->TOTAL_LINES, - o_tokens->TOTAL[o_tokens->TOTAL_LINES])] != "") { - o_tokens->TOTAL[o_tokens->TOTAL_LINES]++; +void SET_CONTROL_C_NAME(std::string VAR) { + if (Control_ID[VAR] == "") + Control_ID[VAR] = "C_V_" + IntToString(ID_GENERATOR()); +} + +bool IsInArray_v(const std::string &value, + const std::vector &array) { + return std::find(array.begin(), array.end(), value) != array.end(); +} + +bool IsDataType(const std::string &value) { + return IsInArray_v(value, DataType_v); +} + +// ----------------------------------------------------------- +// Get UTF8 Total Leng +// ----------------------------------------------------------- + +int CharCount_utf8(std::string LINE8, CLASS_TOKEN *o_tokens) { + // ------------------------------------------------------ + // check ل invalid utf-8 + // ل a simple yes/no check, + // there is also utf8::is_valid function + // ------------------------------------------------------ + + std::string::iterator LINE_END_IT = + utf8::find_invalid(LINE8.begin(), LINE8.end()); + + if (LINE_END_IT != LINE8.end()) { + ALIF_ERROR("ERROR : Invalid UTF-8 encoding at line " + + IntToString(o_tokens->TOTAL_LINES)); + } + + // ------------------------------------------------------ + // تحويل line UTF8 إلى UTF32 ل fix character size + // is needed إلى count chars in line + // ------------------------------------------------------ + + // vector LINE32; + std::string LINE32; + utf8::utf8to32(LINE8.begin(), LINE_END_IT, back_inserter(LINE32)); + + // ------------------------------------------------------ + // Count chars + // ------------------------------------------------------ + + int LINE_LEN = LINE32.length(); + int LINE_UNIT = 0; + int CHAR_COUNT32 = 0; + const char *LINE_C_STR = LINE32.c_str(); + + while (LINE_UNIT < LINE_LEN) { + LINE_UNIT += mblen(&LINE_C_STR[LINE_UNIT], LINE_LEN - LINE_UNIT); + CHAR_COUNT32 += 1; + } + + return CHAR_COUNT32; +} + +// ==================================================== + +std::string GET_REAL_LINE_MID(int START, int TOKEN_POSITION, + CLASS_TOKEN *o_tokens) { + if (DEBUG) + DEBUG_MESSAGE( + "REAL_LINE : |" + o_tokens->REAL_LINE[o_tokens->Line] + "| \n", + o_tokens); + if (DEBUG) DEBUG_MESSAGE("START : " + IntToString(START) + " \n", o_tokens); + if (DEBUG) + DEBUG_MESSAGE("TOKEN_POSITION : " + IntToString(TOKEN_POSITION) + " \n", + o_tokens); + if (DEBUG) + DEBUG_MESSAGE( + "REAL_TOKEN_POSITION : " + + IntToString(o_tokens->REAL_TOKEN_POSITION[std::make_pair( + o_tokens->Line, TOKEN_POSITION)]) + + " \n", + o_tokens); + + if (START < 0 || TOKEN_POSITION < 1) // Exception ! + return o_tokens->REAL_LINE[o_tokens->Line]; + + std::string BUFFER; + + BUFFER = substr_utf8(o_tokens->REAL_LINE[o_tokens->Line], START, + o_tokens->REAL_TOKEN_POSITION[std::make_pair( + o_tokens->Line, TOKEN_POSITION)]); + + if (BUFFER.empty()) + return o_tokens->REAL_LINE[o_tokens->Line]; // Empty, So tray to return + // full real line ! + else + return BUFFER; // Return the SubStr requested. +} + +// ==================================================== + +bool IsValidStringFormat(std::string STRING, CLASS_TOKEN *o_tokens) { + if (substr_utf8(STRING, 0, 1) != "\"") return false; + + if (substr_utf8(STRING, (CharCount_utf8(STRING, o_tokens) - 1), 1) != "\"") + return false; + + return true; +} + +/* +bool IsValidStringFormatOrStringVar(std::string STRING, CLASS_TOKEN *o_tokens){ + + // TODO : We need add support for global class var, global var. + + if (L_VAR_IS_SET[std::make_pair(TheNamespace + TheFunction, STRING)] || + L_VAR_IS_SET[std::make_pair(TheClass + TheFunction, STRING)]){ + + std::string CLASS_OR_WIN; + if (IsInsideClass) + CLASS_OR_WIN = TheClass; + else + CLASS_OR_WIN = TheNamespace; + + if(L_VAR_TYPE[std::make_pair(CLASS_OR_WIN + TheFunction, +STRING)] != "نص") return false; } + else { - if (TOKEN_CHAR != "") { - if (o_tokens->TOTAL[o_tokens->TOTAL_LINES] < 1) { - o_tokens->TOTAL[o_tokens->TOTAL_LINES] = 1; + if (substr_utf8(STRING, 0, 1) != "\"") + return false; + + if (substr_utf8(STRING, (CharCount_utf8(STRING, o_tokens) - 1), +1) != "\"") return false; + } + + return true; +} +*/ + +// ==================================================== + +std::string REMOVE_DOUBLE_SPACE(std::string LINE_BUFFER, + CLASS_TOKEN *o_tokens) { + std::string Char; + std::string BUFFER; + + bool INSIDE = false; + bool VALID_CHAR = false; + bool LAST_IS_SPACE = false; + + // Remove Extra Spaces + // and Trim line end. + for (int I = 0; I < CharCount_utf8(LINE_BUFFER, o_tokens); I++) { + Char = substr_utf8(LINE_BUFFER, I, 1); + + if (Char == "\"") { + INSIDE = !INSIDE; + BUFFER.append("\""); + } else if (Char == "\xEF\xBB\xBF") // BOM Signe in first char of file + { + if (DEBUG) DEBUG_MESSAGE("[BOM]", o_tokens); // LOG + } + // else if (Char == "\u202E") // RIGHT-TO-LEFT OVERRIDE singe, إلى force + // RTL + // { + // if(DEBUG) + // DEBUG_MESSAGE("[RTL]", o_tokens); // LOG + // } + else if (Char == " " || Char == "\t") { + if (INSIDE) { + BUFFER.append(Char); + } else { + if (VALID_CHAR) { + if (!LAST_IS_SPACE) { + BUFFER.append(" "); + LAST_IS_SPACE = true; + } + } + } + } else { + VALID_CHAR = true; + LAST_IS_SPACE = false; + BUFFER.append(Char); + } + } + + // Trim line end. + for (int D = CharCount_utf8(BUFFER, o_tokens); D > 0; D--) { + Char = substr_utf8(BUFFER, (D - 1), 1); + + if (Char != " " && Char != "\t") { + BUFFER = substr_utf8(BUFFER, 0, D); + break; + } + } + + return BUFFER; +} + +// ==================================================== + +bool IsValidDigit(std::string DIGIT, bool FLOAT, CLASS_TOKEN *o_tokens) { + int I = 0; + int TOTAL_CHAR = CharCount_utf8(DIGIT, o_tokens); + std::string Char; + bool First = true; + bool DECIMAL = false; + + // 100 --> TRUE + // -100 --> TRUE + // -10.25 --> TRUE + // -10,25 --> TRUE + // -10،25 --> TRUE + + if (CharCount_utf8(DIGIT, o_tokens) > 1 && + (substr_utf8(DIGIT, 0, 1) == "-" || substr_utf8(DIGIT, 0, 1) == "+")) { + I = 1; + } + + while (I < TOTAL_CHAR) { + Char = substr_utf8(DIGIT, I, 1); + + if (Char == "." || Char == "," || Char == "،") { + if (First) { + return false; // .123 + } + + if (I == (TOTAL_CHAR - 1)) { + return false; // 123. + } + + if (!FLOAT) { + return false; // 12.3, but need integer not float. + } + + if (DECIMAL) { + return false; // 1.2.3 } - o_tokens->TOKEN[std::make_pair( - o_tokens->TOTAL_LINES, - o_tokens->TOTAL[o_tokens->TOTAL_LINES])] = TOKEN_CHAR; + DECIMAL = true; + } else if (Char != "0" && Char != "1" && Char != "2" && Char != "3" && + Char != "4" && Char != "5" && Char != "6" && Char != "7" && + Char != "8" && Char != "9") { + return false; + } + + I++; + First = false; + } + + return true; +} + +// ==================================================== + +bool CAN_ADD_OPERATION_HERE(std::string TOKEN_LAST) { + // = 1 + 2 * (3 / 4 - 5) + 6 + // IF + + /* + if (IS_IF_SYNTAX) + { + if ((TOKEN_LAST == "=") || + (TOKEN_LAST == "+") || + (TOKEN_LAST == "-") || + (TOKEN_LAST == "*") || + (TOKEN_LAST == "/") || + + (TOKEN_LAST != "<") || + (TOKEN_LAST != ">") || + (TOKEN_LAST != "و") || + (TOKEN_LAST != "أو") || + + (TOKEN_LAST == "(")) + return false; + } + else + { + */ + if ((TOKEN_LAST == "=") || (TOKEN_LAST == "+") || (TOKEN_LAST == "-") || + (TOKEN_LAST == "*") || (TOKEN_LAST == "/") || (TOKEN_LAST == "(")) + return false; + + //} + + return true; +} + +bool CAN_ADD_VAR_HERE(std::string TOKEN_LAST) { + // str / عدد = متغير + متغير * (var / متغير - var) + + /* + if (IS_IF_SYNTAX) + { + if ((TOKEN_LAST != "+") && + (TOKEN_LAST != "-") && + (TOKEN_LAST != "*") && + (TOKEN_LAST != "/") && + (TOKEN_LAST != "=") && + + (TOKEN_LAST != "<") && + (TOKEN_LAST != ">") && + (TOKEN_LAST != "و") && + (TOKEN_LAST != "أو") && + + (TOKEN_LAST != "(")) + return false; + } + else + { + */ + if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && + (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && (TOKEN_LAST != "(")) + return false; + + //} + + return true; +} + +// ==================================================== + +bool CAN_ADD_FUN_HERE(std::string TOKEN_LAST) { + // str / عدد = متغير + fun(var) * (fun(var) / fun(var, fun(var), var) - var) + + /* + if (IS_IF_SYNTAX) + { + if ((TOKEN_LAST != "+") && + (TOKEN_LAST != "-") && + (TOKEN_LAST != "*") && + (TOKEN_LAST != "/") && + (TOKEN_LAST != "=") && + (TOKEN_LAST != "،") && + (TOKEN_LAST != ",") && + + (TOKEN_LAST != "<") && + (TOKEN_LAST != ">") && + (TOKEN_LAST != "و") && + (TOKEN_LAST != "أو") && + + (TOKEN_LAST != "(")) + return false; + } + */ + + if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && + (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && (TOKEN_LAST != "،") && + (TOKEN_LAST != ",") && (TOKEN_LAST != "(")) + return false; + + return true; +} + +// ==================================================== + +bool CAN_ADD_PARENTHESIS_OPEN_HERE(std::string TOKEN_LAST) { + // = ((1)) + (2 * (3 / (4) - 5) +( 6)) + // IF = (a + s < b * h) او (z + 2) != (x - 7) و (z = x) + + if (IS_IF_SYNTAX) { + if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && + (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && + + (TOKEN_LAST != "<") && (TOKEN_LAST != ">") && (TOKEN_LAST != "و") && + (TOKEN_LAST != "أو") && + + (TOKEN_LAST != "(")) + return true; + } else { + if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && + (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && (TOKEN_LAST != "(")) + return false; + } + + return true; +} + +// ==================================================== + +std::string IsValidVar_Type = "عادم"; + +bool IsValidVar(std::string Var, CLASS_TOKEN *o_tokens) { + IsValidVar_Type = "عادم"; + + if (Var == "") { + return false; + } else if (Var == "صحيح" || Var == "خطأ") { + IsValidVar_Type = "منطق"; + return true; + } else if (IsValidStringFormat(Var, o_tokens)) { + // STRING + + IsValidVar_Type = "نص"; + return true; + } else if (IsValidDigit(Var, true, o_tokens)) { + // DIGIT + + IsValidVar_Type = "عدد"; + return true; + } else if ((substr_utf8(Var, 0, 1) == "_" && + G_VAR_IS_SET[( + substr_utf8(Var, 1, CharCount_utf8(Var, o_tokens)))])) { + // Global متغير _ + + IsValidVar_Type = + G_VAR_TYPE[substr_utf8(Var, 1, CharCount_utf8(Var, o_tokens))]; + return true; + } else if (L_VAR_IS_SET[std::make_pair(TheNamespace + TheFunction, Var)]) { + // Local Var + + IsValidVar_Type = + L_VAR_TYPE[std::make_pair(TheNamespace + TheFunction, Var)]; + return true; + } else if (L_VAR_IS_SET[std::make_pair(TheClass + TheFunction, Var)]) { + // Class Local Var + + IsValidVar_Type = + L_VAR_TYPE[std::make_pair(TheClass + TheFunction, Var)]; + return true; + } else if (G_VAR_IS_SET[(Var)]) { + // Global Var + + IsValidVar_Type = G_VAR_TYPE[Var]; + return true; + } else if (CLASS_G_VAR_IS_SET[std::make_pair(TheClass, Var)] && + IsInsideClass) { + // Class Global Var + + IsValidVar_Type = CLASS_G_VAR_TYPE[std::make_pair(TheClass, Var)]; + return true; + } else if (G_FUN_IS_SET[(Var)]) { + // Global Function + + IsValidVar_Type = G_FUN_TYPE[Var]; + return true; + } else if (L_FUN_IS_SET[std::make_pair(TheNamespace, Var)]) { + // Local Function + IsValidVar_Type = L_FUN_TYPE[std::make_pair(TheNamespace, Var)]; + + return true; + } else if (L_FUN_IS_SET[std::make_pair(TheClass, Var)]) { + // Class Local Function + + IsValidVar_Type = L_FUN_TYPE[std::make_pair(TheClass, Var)]; + return true; + } + // else if (OBJ_IS_SET[std::make_pair("", Var)]){ + // + // // Global OBJ + // + // IsValidVar_Type = "OBJ"; + // return true; + // } + + // else if (CONTROL_WIN_IS_SET[Var]){ + // // namespace: (By UI) + // IsValidVar_Type = "عادم"; + // return true; + // } + + else if (namespace_is_set[Var]) { + // namespace: (By Code) + + IsValidVar_Type = "عادم"; + return true; + } + + // else if (CONTROL_IS_SET[std::make_pair(TheNamespace, Var)]){ + // // Control: + // IsValidVar_Type = "عادم"; + // return true; + // } + + else + return false; +} + +// ==================================================== + +bool CAN_ADD_PARENTHESIS_CLOSE_HERE(std::string TOKEN_LAST) { + // = ((1)) + (2 * (3 / (4) - 5) + ( 6)) + () + + if (TOKEN_LAST == "(") // إلى avoid ... () ... + return false; + + if ((TOKEN_LAST == "=") || (TOKEN_LAST == "+") || (TOKEN_LAST == "-") || + (TOKEN_LAST == "*") || (TOKEN_LAST == "/")) + return false; + + return true; +} + +// ==================================================== + +bool CAN_ADD_DIGIT_HERE(std::string TOKEN_LAST) { + // = 1 + 2 * (3 / 4 - 5) + 6 + + /* + if (IS_IF_SYNTAX) + { + if ((TOKEN_LAST != "+") && + (TOKEN_LAST != "-") && + (TOKEN_LAST != "*") && + (TOKEN_LAST != "/") && + (TOKEN_LAST != "=") && + + (TOKEN_LAST != "<") && + (TOKEN_LAST != ">") && + (TOKEN_LAST != "و") && + (TOKEN_LAST != "أو") && + + (TOKEN_LAST != "(")) + return false; + } + else + { + */ + if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && + (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && (TOKEN_LAST != "(")) + return false; + //} + + return true; +} + +// ==================================================== + +std::string remove_quote(std::string STRING, CLASS_TOKEN *o_tokens) { + std::string MESSAGE_BUFFER; + + if (CharCount_utf8(STRING, o_tokens) < 3) // "" Emty std::string + return ""; // 3 is the minimum msg, "a" + + MESSAGE_BUFFER = substr_utf8(STRING, 1, CharCount_utf8(STRING, o_tokens)); + MESSAGE_BUFFER = substr_utf8( + MESSAGE_BUFFER, 0, (CharCount_utf8(MESSAGE_BUFFER, o_tokens) - 1)); + + return MESSAGE_BUFFER; +} + +// ==================================================== + +void CheckForSameGlobalID(std::string Name, CLASS_TOKEN *o_tokens) { + // check if same name with any already global declaration + + if (OBJ_IS_SET[std::make_pair("", Name)]) { + // same name with Global Obj + ErrorCode( + "تشابه في الاسم مع كائن عام ثم إنشائه مسبقا، المرجو تغيير الاسم : " + "' " + + Name + " ' ", + o_tokens); + } else if (CLASS_IS_SET[Name]) { + // same name with Class + ErrorCode( + "تشابه في الاسم مع صنف ثم إنشائه مسبقا، المرجو تغيير الاسم : ' " + + Name + " ' ", + o_tokens); + } else if (G_VAR_IS_SET[(Name)] && G_VAR_TYPE[(Name)] == "عدد") { + // same name with Global INT + ErrorCode( + "تشابه في الاسم مع متغير عددي ثم إنشائه مسبقا، المرجو تغيير " + "الاسم : ' " + + Name + " ' ", + o_tokens); + } else if (G_VAR_IS_SET[(Name)] && G_VAR_TYPE[(Name)] == "نص") { + // same name with Global STRING + ErrorCode( + "تشابه في الاسم مع متغير نصي ثم إنشائه مسبقا، المرجو تغيير الاسم : " + "' " + + Name + " ' ", + o_tokens); + } else if (G_VAR_IS_SET[(Name)] && G_VAR_TYPE[(Name)] == "منطق") { + // same name with Global BOOL + ErrorCode( + "تشابه في الاسم مع متغير منطقي ثم إنشائه مسبقا، المرجو تغيير " + "الاسم : ' " + + Name + " ' ", + o_tokens); + } else if (G_FUN_IS_SET[(Name)]) { + // same name with Global Function + ErrorCode( + "تشابه في الاسم مع دالة عامة ثم إنشائها مسبقا، المرجو تغيير " + "الاسم : ' " + + Name + " ' ", + o_tokens); + } + + else if (namespace_is_set[Name]) // || CONTROL_WIN_IS_SET[Name] + { + // same name with Namespace + ErrorCode( + "تشابه في الاسم مع مجال ثم إنشائها مسبقا، المرجو تغيير الاسم : ' " + + Name + " ' ", + o_tokens); + } +} + +bool IsValidName(std::string Name, CLASS_TOKEN *o_tokens) { + std::string Char; + bool First = true; + + for (int I = 0; I <= CharCount_utf8(Name, o_tokens); I++) { + Char = substr_utf8(Name, I, 1); + + if (Char == "_" || // Allow, Example : ABC_XZ1 + Char == "0" || Char == "1" || Char == "2" || Char == "3" || + Char == "4" || Char == "5" || Char == "5" || Char == "6" || + Char == "8" || Char == "9" || + + Char == "۰" || // 0, Zero In Arabic, ITS NOT A DOT! + Char == "۱" || // 1 + Char == "۲" || // 2 + Char == "۳" || // 3 + Char == "۴" || // 4 + Char == "۵" || // 5 + Char == "۶" || // 6 + Char == "۷" || // 7 + Char == "۸" || // 8 + Char == "۹") // 9 + { + if (First) { + ErrorCode( + "أول حرف في الإسم يجب أن يكون حرفا، و ليس رقم أو إشارة : " + "' " + + Char + " ' ", + o_tokens); + return false; + } + } else if (Char == "." || // Allow DOT in متغير names ABC.DEF + Char == "," || Char == "،" || // اشارة ، + Char == "{" || Char == "}" || Char == "|" || Char == "~" || + // Char == "_" || Allow AB_C + Char == "$" || Char == "#" || Char == ":" || Char == "!" || + Char == ";" || Char == "?" || Char == "'" || Char == "-" || + Char == "/" || Char == "=" || Char == "\\" || Char == "^" || + Char == "\"" || Char == "%" || Char == ")" || Char == "(" || + Char == "*" || Char == "+" || Char == "<" || Char == ">" || + Char == "@" || Char == "[" || Char == "]" || Char == "&" || + Char == " " || // Space + Char == " " || // Tab + Char == "") { + if (Char == " ") { + if (!IS_CONTROL_FUNCTION_NAME) { + ErrorCode("حرف غير مقبول : ' " + Char + " ' داخل ' " + + Name + " ' ", + o_tokens); + return false; // Exception ! + } + + IS_CONTROL_FUNCTION_NAME = false; + return true; + } + + ErrorCode("حرف غير مقبول : ' " + Char + " ' داخل ' " + Name + " ' ", + o_tokens); + return false; + } + + First = false; + } // End char loop. + + for (int i = 0; i <= ALIF_RESERVED_TOTAL; i++) { + if (ALIF_RESERVED[i] == Name) { + // if (Name == "رئيسية" && IsInsideClass) + // continue; + + ErrorCode("عفوا، هذا الاسم محجوز في لغة ألف : ' " + Name + " ' ", + o_tokens); + } + } + + IS_CONTROL_FUNCTION_NAME = false; + return true; +} + +// ==================================================== + +void ADD_FUN(bool GLOBAL, std::string NS_Name, std::string FUN_NAME, + std::string TYPE, int Line, CLASS_TOKEN *o_tokens) { + if (!IsValidName(FUN_NAME, o_tokens)) + ErrorCode("اسم غير مقبول : ' " + FUN_NAME + " ' ", o_tokens); + + // if same name as Namespace ! + if (NS_Name == FUN_NAME) + ErrorCode("تشابه في الاسم بين الدالة و المجال ' " + FUN_NAME + " ' ", + o_tokens); + + if (GLOBAL) { + // if already exist global fun + if (G_FUN_IS_SET[(FUN_NAME)]) { + ErrorCode("الدالة العامه ' " + FUN_NAME + + " ' تم انشاؤها مسبقا في السطر : " + + G_FUN_AT_LINE[(FUN_NAME)], + o_tokens); + } + + // if already any other type of global var exist + CheckForSameGlobalID(FUN_NAME, o_tokens); + + G_FUN_TYPE[(FUN_NAME)] = TYPE; + G_FUN_IS_SET[(FUN_NAME)] = true; + G_FUN_AT_LINE[(FUN_NAME)] = IntToString(Line); + + Global_FunctionNames[Global_TotalFucntion] = FUN_NAME; + Global_TotalFucntion++; + + if (TYPE == "عادم") RETURN_FUN[std::make_pair("", FUN_NAME)] = "OK"; + + // *** Generate Code *** + SET_GLOBAL_C_NAME(FUN_NAME); + // *** *** *** *** *** *** + } else { + // if already exist local fun + if (L_FUN_IS_SET[std::make_pair(NS_Name, FUN_NAME)]) { + ErrorCode("الدالة ' " + FUN_NAME + + " ' تم انشاؤها مسبقا في السطر : " + + L_FUN_AT_LINE[std::make_pair(NS_Name, FUN_NAME)], + o_tokens); + } + + L_FUN_TYPE[std::make_pair(NS_Name, FUN_NAME)] = TYPE; + L_FUN_IS_SET[std::make_pair(NS_Name, FUN_NAME)] = true; + L_FUN_AT_LINE[std::make_pair(NS_Name, FUN_NAME)] = IntToString(Line); + + if (TYPE == "عادم") + RETURN_FUN[std::make_pair(NS_Name, FUN_NAME)] = "OK"; + + // *** Generate Code *** + SET_C_NAME(FUN_NAME); + // *** *** *** *** *** *** + } +} + +void SetNewVar(bool IsGlobal, std::string TempNS, std::string TmpFunction, + std::string VarName, std::string VarDataType, bool IsConstant, + bool IsArray, int Line, CLASS_TOKEN *o_tokens) { + if (!IsValidName(VarName, o_tokens)) + ErrorCode("اسم غير مقبول : ' " + VarName + " ' ", o_tokens); + + if (TmpFunction == VarName) + ErrorCode("تشابه في الاسم بين المتغير و الدالة ' " + VarName + " ' ", + o_tokens); + + if (IsGlobal) { + if (G_VAR_IS_SET[(VarName)]) + ErrorCode( + "المتغير العام ' " + VarName + + " ' تم انشاؤه مسبقا في السطر : " + G_VAR_AT_LINE[(VarName)], + o_tokens); + + CheckForSameGlobalID(VarName, o_tokens); + + G_VAR_TYPE[(VarName)] = VarDataType; + G_VAR_IS_SET[(VarName)] = true; + G_VAR_AT_LINE[(VarName)] = IntToString(Line); + G_VAR_IS_CONST[(VarName)] = IsConstant; + G_VAR_IS_ARRAY[(VarName)] = IsArray; + G_VAR_NAMES[G_VAR_TOTAL] = VarName; + G_VAR_TOTAL++; + + // *** Generate Code *** + SET_GLOBAL_C_NAME(VarName); + // *** *** *** *** *** *** + } else { + if (L_VAR_IS_SET[std::make_pair(TempNS + TmpFunction, VarName)]) { + ErrorCode("المتغير ' " + VarName + + " ' تم انشاؤه مسبقا في السطر : " + + L_VAR_AT_LINE[std::make_pair(TempNS + TmpFunction, + VarName)], + o_tokens); + } + + L_VAR_TYPE[std::make_pair(TempNS + TmpFunction, VarName)] = VarDataType; + L_VAR_IS_SET[std::make_pair(TempNS + TmpFunction, VarName)] = true; + L_VAR_AT_LINE[std::make_pair(TempNS + TmpFunction, VarName)] = + IntToString(Line); + L_VAR_IS_CONST[std::make_pair(TempNS + TmpFunction, VarName)] = + IsConstant; + L_VAR_IS_ARRAY[std::make_pair(TempNS + TmpFunction, VarName)] = IsArray; + + // *** Generate Code *** + SET_C_NAME(VarName); + // *** *** *** *** *** *** + } +} + +void SetNewVarClass(bool IsGlobal, bool IsPrivate, std::string ClassName, + std::string FunctionName, std::string VarName, + std::string VarDataType, bool IsConstant, bool IsArray, + int Line, CLASS_TOKEN *o_tokens) { + if (!IsValidName(VarName, o_tokens)) + ErrorCode("اسم غير مقبول : ' " + VarName + " ' ", o_tokens); + + if (!IsGlobal && IsPrivate) + ErrorCode("يجب استخدام ' خاص ' خارج الدالة", o_tokens); + + if (ClassName == VarName) + ErrorCode("تشابه في الاسم بين المتغير و الصنف ' " + VarName + " ' ", + o_tokens); + + if (IsGlobal) { + if (CLASS_G_VAR_IS_SET[std::make_pair(ClassName, VarName)]) { + ErrorCode( + "المتغير العام ' " + VarName + + " ' تم انشاؤه مسبقا في السطر : " + + CLASS_G_VAR_AT_LINE[std::make_pair(ClassName, VarName)], + o_tokens); + } + + /* + if (G_VAR_IS_SET[(VarName)]) + { + ErrorCode("المتغير العام ' " + VarName + " ' تم انشاؤه مسبقا في + السطر : " + CLASS_G_VAR_AT_LINE[std::make_pair(ClassName, VarName)], + o_tokens); + } + */ + + CLASS_G_VAR_TYPE[std::make_pair(ClassName, VarName)] = VarDataType; + CLASS_G_VAR_IS_SET[std::make_pair(ClassName, VarName)] = true; + CLASS_G_VAR_AT_LINE[std::make_pair(ClassName, VarName)] = + IntToString(Line); + CLASS_G_VAR_PRIVATE[std::make_pair(ClassName, VarName)] = IsPrivate; + CLASS_G_VAR_IS_CONST[std::make_pair(ClassName, VarName)] = IsConstant; + CLASS_G_VAR_IS_ARRAY[std::make_pair(ClassName, VarName)] = IsArray; + + // *** Generate Code *** + SET_GLOBAL_C_NAME(VarName); + // *** *** *** *** *** *** + } else { + if (L_VAR_IS_SET[std::make_pair(ClassName + FunctionName, VarName)]) { + ErrorCode("المتغير ' " + VarName + + " ' تم انشاؤه مسبقا في السطر : " + + L_VAR_AT_LINE[std::make_pair(ClassName + FunctionName, + VarName)], + o_tokens); + } + + L_VAR_TYPE[std::make_pair(ClassName + FunctionName, VarName)] = + VarDataType; + L_VAR_IS_SET[std::make_pair(ClassName + FunctionName, VarName)] = true; + L_VAR_AT_LINE[std::make_pair(ClassName + FunctionName, VarName)] = + IntToString(Line); + L_VAR_IS_CONST[std::make_pair(ClassName + FunctionName, VarName)] = + IsConstant; + L_VAR_IS_ARRAY[std::make_pair(ClassName + FunctionName, VarName)] = + IsArray; + + // *** Generate Code *** + SET_C_NAME(VarName); + // *** *** *** *** *** *** + } +} + +std::string GetSyntaxDataType(std::string Token[1024], int Position, + CLASS_TOKEN *o_tokens) { + // Token[Position] -> '=' + + if (IsValidVar(Token[Position + 1], o_tokens)) return IsValidVar_Type; + + return {}; +} + +void ADD_FUN_CLASS(bool PRIVATE, std::string CLASS_NAME, std::string FUN_NAME, + std::string TYPE, int Line, CLASS_TOKEN *o_tokens) { + if (!IsValidName(FUN_NAME, o_tokens)) + ErrorCode("اسم غير مقبول : ' " + FUN_NAME + " ' ", o_tokens); + + // if already exist class fun + if (CLASS_FUN_IS_SET[std::make_pair(CLASS_NAME, FUN_NAME)]) { + ErrorCode("الصنف الدالة ' " + FUN_NAME + + " ' تم انشاؤها مسبقا في السطر : " + + CLASS_FUN_AT_LINE[std::make_pair(CLASS_NAME, FUN_NAME)], + o_tokens); + } + + // if already same Generated_ID with global class var. + if (CLASS_G_VAR_IS_SET[std::make_pair(CLASS_NAME, FUN_NAME)]) { + ErrorCode( + "تشابه في الاسم مع متغير ' " + FUN_NAME + " ' في السطر : " + + CLASS_G_VAR_AT_LINE[std::make_pair(CLASS_NAME, FUN_NAME)] + " ", + o_tokens); + } + // else + // if(DEBUG)DEBUG_MESSAGE("---C " + CLASS_NAME + " :F " + FUN_NAME + " + // E---", o_tokens); // DEBUG + + // if same name as class ! + if (CLASS_NAME == FUN_NAME) + ErrorCode( + "تشابه في الاسم بين الدالة و الصنف ' " + FUN_NAME + + " '، على العموم إن كنت تقصد دالة بناء الصنف استخدم التعريف ' " + "بناء '", + o_tokens); + + CLASS_FUN_TYPE[std::make_pair(CLASS_NAME, FUN_NAME)] = TYPE; + CLASS_FUN_IS_SET[std::make_pair(CLASS_NAME, FUN_NAME)] = true; + CLASS_FUN_AT_LINE[std::make_pair(CLASS_NAME, FUN_NAME)] = IntToString(Line); + CLASS_FUN_PRIVATE[std::make_pair(CLASS_NAME, FUN_NAME)] = PRIVATE; + + if (TYPE == "عادم") RETURN_FUN[std::make_pair(CLASS_NAME, FUN_NAME)] = "OK"; + + // *** Generate Code *** + SET_C_NAME(FUN_NAME); + // *** *** *** *** *** *** +} + +// ==================================================== + +// Here, was void ADD_VAR() / void ADD_VAR_CLASS() +// Now, we use NewVar.cpp + +// ==================================================== + +std::string C_LAST_ARG; + +std::string CHECK_NEW_FUN_SYNTAX( + bool GLOBAL, std::string SYNTAX[1024], int SYNTAX_LONG, + std::string TempNS, // fun1 { a = b + namespace:fun2(x) + z } + std::string TmpFunction, // fun1 { a = b + namespace:fun2(x) + z } + CLASS_TOKEN *o_tokens) { + // function (int a, نص b) + + // SYNTAX : عدد | SYNTAX[3] : std::string + // SYNTAX[1] : a | SYNTAX[4] : b + // SYNTAX[2] : , | SYNTAX[5] : ) + + int TYPE = 0, VAR = 1, COMMA = 2; + + std::string CPP_CODE; + NEW_FUNCTION_ARG = ""; + + for (int p = 0; p <= SYNTAX_LONG; p += 3) { + if (!o_tokens->TOKENS_PREDEFINED) { + // Tokens not predifined, so we need only to set ARGs + + if (SYNTAX[TYPE] != "عدد" && SYNTAX[TYPE] != "نص" && + SYNTAX[TYPE] != "منطق" && SYNTAX[TYPE] != "مؤشر_دالة") { + ErrorCode("نوع غير مقبول ' " + SYNTAX[TYPE] + " ' ", o_tokens); + } + + if (!IsValidName(SYNTAX[VAR], o_tokens)) + ErrorCode("اسم غير مقبول ' " + SYNTAX[VAR] + " ' ", o_tokens); + + if (L_VAR_IS_SET[std::make_pair( + TempNS + TmpFunction, + SYNTAX[VAR])]) // الدالة (int a, نص a) + ErrorCode("متغير محلي موجود مسبقا ' " + SYNTAX[VAR] + " ' ", + o_tokens); + + if (SYNTAX[COMMA] != "،" && SYNTAX[COMMA] != "," && + SYNTAX[COMMA] != ")") + ErrorCode("فاصله غير صحيحه ' " + SYNTAX[COMMA] + " ' ", + o_tokens); + + if (SYNTAX[COMMA] == ")" && COMMA < SYNTAX_LONG) + ErrorCode("غير مكتمل ' " + IntToString(SYNTAX_LONG) + " ' ", + o_tokens); + + // if(DEBUG)DEBUG_MESSAGE("[" + SYNTAX[TYPE] + "|" + SYNTAX[VAR] + + // "]", o_tokens); // DEBUG + + // add always-local (bcs this var is in arg..) VAR to fun + SetNewVar(false, TempNS, TmpFunction, SYNTAX[VAR], SYNTAX[TYPE], + false, false, o_tokens->Line, o_tokens); + + // add local ARG-VAR as ARGUMENT to fun + if (GLOBAL) { + G_FUN_ARG_TYPE[std::make_pair( + TmpFunction, G_FUN_ARG_TOTAL[TmpFunction])] = SYNTAX[TYPE]; + G_FUN_ARG_TOTAL[TmpFunction]++; + } else { + L_FUN_ARG_TYPE[std::make_pair( + TempNS + TmpFunction, + L_FUN_ARG_TOTAL[std::make_pair(TempNS, TmpFunction)])] = + SYNTAX[TYPE]; + L_FUN_ARG_TOTAL[std::make_pair(TempNS, TmpFunction)]++; + } + + TYPE += 3, VAR += 3, COMMA += 3; // For ARG non-predifined loop + } else { + // Tokens already predifined, so we need show log, and return C++ + // code + + if (SYNTAX[TYPE] == "عدد") { + if (DEBUG) + DEBUG_MESSAGE("[INT " + SYNTAX[VAR] + "]", + o_tokens); // DEBUG + + // *** Generate Code *** + // always need pointer to one elem array + CPP_CODE.append(" double " + ID[SYNTAX[VAR]] + " "); + NEW_FUNCTION_ARG.append(" double " + ID[SYNTAX[VAR]] + " "); + // *** *** *** *** *** *** + } else if (SYNTAX[TYPE] == "نص") { + if (DEBUG) + DEBUG_MESSAGE("[STRING " + SYNTAX[VAR] + "]", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" std::string " + ID[SYNTAX[VAR]] + " "); + NEW_FUNCTION_ARG.append(" std::string " + ID[SYNTAX[VAR]] + + " "); + // *** *** *** *** *** *** + } else if (SYNTAX[TYPE] == "منطق") { + if (DEBUG) + DEBUG_MESSAGE("[BOOL " + SYNTAX[VAR] + "]", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" bool " + ID[SYNTAX[VAR]] + " "); + NEW_FUNCTION_ARG.append(" bool " + ID[SYNTAX[VAR]] + " "); + // *** *** *** *** *** *** + } else if (SYNTAX[TYPE] == "مؤشر_دالة") { + if (DEBUG) + DEBUG_MESSAGE("[POINTER " + SYNTAX[VAR] + "]", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" void(* " + ID[SYNTAX[VAR]] + " )() "); + NEW_FUNCTION_ARG.append(" void(* " + ID[SYNTAX[VAR]] + " )() "); + // *** *** *** *** *** *** + } else { + // Exception ! + ErrorCode("نوع غير مقبول ' " + SYNTAX[TYPE] + " ' ", o_tokens); + } + + TYPE += 3, VAR += 3, + COMMA += 3; // For ARG predifined / C++ loop, and need by comma + + // *** Generate Code *** + if (COMMA <= SYNTAX_LONG) { + CPP_CODE.append(" , "); + NEW_FUNCTION_ARG.append(" , "); + } + // *** *** *** *** *** *** + } + } + + // if(DEBUG)DEBUG_MESSAGE("[NS: "+ TempNS +"|Fun: " + TmpFunction + + // "|Looocal: " + IntToString(L_FUN_ARG_TOTAL[std::make_pair(TempNS, + // TmpFunction)]) + + // "|Glooobal: " + IntToString(G_FUN_ARG_TOTAL[TmpFunction]) + "]", + // o_tokens); + // // DEBUG + + if (o_tokens->TOKENS_PREDEFINED) + return CPP_CODE; + else + return ""; +} + +// ==================================================== + +std::string CheckForSyntax( + std::string OBJECTIF_TYPE, // OBJECTIF_TYPE + bool + ACCEPT_REF_WIN_WIDGET, // Accept Using Reference إلى namespace:Controls + bool ACCEPT_REF_WIN_FUN, // Accept Using Reference إلى namespace:Function + bool ACCEPT_REF_GLOBAL_FUN, // Accept Using Reference إلى Global Functions + bool ACCEPT_REF_LOCAL_FUN, // Accept Using Reference إلى Local Functions + bool ACCEPT_REF_GLOBAL_VAR, // Accept Using Reference إلى Global VAR + bool ACCEPT_REF_LOCAL_VAR, // Accept Using Reference إلى Local VAR + bool ACCEPT_STR_TO_INT, // Accept Convertion من نص إلى Int + bool ACCEPT_INT_TO_STRING, // Accept Convertion من عدد إلى String + std::string SYNTAX[1024], // SYNTAX[] std::string + int SYNTAX_LONG, // SYNTAX_LONG int + std::string + TMP_NAMESPACE_OR_CLASS, // a = b + namespace:fun(2+2) + class:fun(x) + std::string TmpFunction, // a = b + win/class:fun(2+2) + CLASS_TOKEN *o_tokens) { + // Note : WX Crash if On creating using reference إلى Controls, BUT OK ل + // Functions. + + // SYNTAX = '=' + // SYNTAX[1] = ... + + // TmpFunction : = a + b + TMP_FUN_NAME(X, Y, + // Z) + // + + // ... TMP_NAMESPACE_OR_CLASS : إلى get Generated_ID of tmp + // الدالة name OBJECTIF_TYPE : INT.ToString or STRING.ToInt + + std::string CPP_CODE; + + if (SYNTAX[0] != "=") { + ErrorCode("بناء غير صحيح : علة : " + + CONVERT_STRING_ARRAY_TO_STRING(SYNTAX, SYNTAX_LONG), + o_tokens); + } + + // Clear Syntax Array, needfor C++ Code _س_ + // for (int p = 0; p <= SYNTAX_LONG; p++) + // TMP_SYNTAX[p].clear(); // SYNTAX[p] = ""; SYNTAX[p] = 0; + + for (int p = 1; p <= SYNTAX_LONG; p++) { + // ---------------------- + // _س_ + // ---------------------- + + if (SYNTAX[p] == "_س_") { + // xyz = _س_ ...C++...@ Alif @...C++... _س_ + + if (DEBUG) + DEBUG_MESSAGE(" {_س_ Syntax START} ", o_tokens); // DEBUG + + bool C_FOUND = false; + + for (int z = p + 1; z <= SYNTAX_LONG; z++) { + if (SYNTAX[z] == "_س_") // End C++ Code + { + if (DEBUG) + DEBUG_MESSAGE(" {_س_ Syntax END} ", o_tokens); // DEBUG + C_FOUND = true; + p = z; + break; + } else if (SYNTAX[z] == "@") // @ Start ... + { + // xyz = ...C++...@ Alif @...C++... + + if (DEBUG) DEBUG_MESSAGE(" {Syntax@} ", o_tokens); // DEBUG + + std::string TempToken[1024]; + TempToken[0] = "="; // CheckForSyntax() Need this. + int TempTokenCount = 1; // CheckForSyntax() Need this. + + bool AT_FOUND = false; + + for (int c = z + 1; c < SYNTAX_LONG; c++) { + if (SYNTAX[c] == "@") { + z = c; + AT_FOUND = true; + break; + } + + TempToken[TempTokenCount] = SYNTAX[c]; + TempTokenCount++; + } + + if (!AT_FOUND) + ErrorCode("نهايه شفرة غير موجود داخل البناء ' @ '", + o_tokens); + + std::string SYNTAX_BUFFER = CheckForSyntax( + "C++", // OBJECTIF_TYPE + true, // Accept Using Reference إلى namespace:Controls + true, // Accept Using Reference إلى namespace:Function + true, // Accept Using Reference إلى Global Functions + true, // Accept Using Reference إلى Local Functions + true, // Accept Using Reference إلى Global VAR + true, // Accept Using Reference إلى Local VAR + true, // Accept Convertion من نص إلى Int + true, // Accept Convertion من عدد إلى String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG int + TheNamespace, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (DEBUG) DEBUG_MESSAGE(" {Syntax@} ", o_tokens); // DEBUG + + // *** C++ *** + CPP_CODE.append(" " + SYNTAX_BUFFER + " "); + // *** *** *** *** *** *** + + // @ End. + } else if (SYNTAX[z] != "") { + CPP_CODE.append(SYNTAX[z]); + if (DEBUG) + DEBUG_MESSAGE(" {" + SYNTAX[z] + "} ", + o_tokens); // DEBUG + } + } + + if (C_FOUND) + continue; // Point إلى next بعد _س_ + else + ErrorCode("نهايه شفرة غير موجود داخل البناء ' _س_ '", o_tokens); + } + + // ---------------------- + // OPERATION + // ---------------------- + + if (SYNTAX[p] == "+" || SYNTAX[p] == "-" || SYNTAX[p] == "*" || + SYNTAX[p] == "/") { + if (p > 0) { + if (!CAN_ADD_OPERATION_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة عملية هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + } + + if (p >= SYNTAX_LONG) { + if (DEBUG) + DEBUG_MESSAGE("######################", o_tokens); // DEBUG + for (int p = 1; p <= SYNTAX_LONG; p++) + if (DEBUG) + DEBUG_MESSAGE("[" + SYNTAX[p] + "] ", + o_tokens); // DEBUG + ErrorCode("لا يمكن الإنتهاء بعملية ' " + SYNTAX[p] + " ' ", + o_tokens); + } + + if (OBJECTIF_TYPE == + "نص") // only acceptable operation in نص is '+' + { + if (SYNTAX[p] != "+") + ErrorCode( + "لا يمكن إضافة عملية داخل نص ' " + SYNTAX[p] + " ' ", + o_tokens); + } + + if (OBJECTIF_TYPE == "منطق") + ErrorCode( + "لا يمكن أجراء عملية في متغير منطقي ' " + SYNTAX[p] + " ' ", + o_tokens); + + if (substr_utf8(SYNTAX[p - 1], 0, 1) == "\"" && + substr_utf8(SYNTAX[p + 1], 0, 1) == "\"") // "test" + "hello" + ErrorCode("لا يمكن إضافة نص إلى نص ' " + SYNTAX[p - 1] + " " + + SYNTAX[p] + " " + SYNTAX[p + 1] + " ' ", + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[OPERATION " + SYNTAX[p] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + SYNTAX[p] + " "); + // *** *** *** *** *** *** + } + + // ---------------------- + // قوس OPEN + // ---------------------- + + else if (SYNTAX[p] == "(") { + if (p > 0) + if (!CAN_ADD_PARENTHESIS_OPEN_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة قوس مفتوح هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + + ALIF_PARENTHESIS_STATUS++; + + if (DEBUG) + DEBUG_MESSAGE("[PARENTHESIS Open (] ", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" ( "); + // *** *** *** *** *** *** + } + + // ---------------------- + // قوس CLOSE + // ---------------------- + + else if (SYNTAX[p] == ")") { + if (ALIF_PARENTHESIS_STATUS < 1) + ErrorCode("غلق قوس ليس مفتوحا ' " + SYNTAX[p] + " ' ", + o_tokens); + + if (p > 0) + if (!CAN_ADD_PARENTHESIS_CLOSE_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة غلق قوس هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + + ALIF_PARENTHESIS_STATUS--; + + if (DEBUG) + DEBUG_MESSAGE("[PARENTHESIS CLOSE )] ", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" ) "); + // *** *** *** *** *** *** + } + + // ---------------------- + // Local VARIABLE INT + // ---------------------- + + else if (L_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, + SYNTAX[p])] == "عدد") { + if (p > 0) + if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + + if (OBJECTIF_TYPE == "عدد") { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-INT (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "نص") { + if (ACCEPT_INT_TO_STRING) { + if (DEBUG) + DEBUG_MESSAGE( + "[LOCAL-INT (" + SYNTAX[p] + ").ToString] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" alifcore_IntToString(" + ID[SYNTAX[p]] + + ") "); + // *** *** *** *** *** *** + } else { + ErrorCode( + "لا يمكن تحويل عدد إلى نص : ' " + SYNTAX[p] + " ' ", + o_tokens); + } + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE("[C++ Local INT (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } + + // ----------------------------------- + // Local VARIABLE STRING + // ----------------------------------- + + else if (L_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, + SYNTAX[p])] == "نص") { + if (p > 0) + if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + + if (OBJECTIF_TYPE == "عدد") { + // if(DEBUG)DEBUG_MESSAGE("[LOCAL-STRING (" + SYNTAX[p] + + // ").ToInt] ", o_tokens); // DEBUG + ErrorCode("لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "نص") { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-STRING (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE("[C++ Local STRING (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } + + // ----------------------------------- + // Local VARIABLE Bool + // ----------------------------------- + + else if (L_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, + SYNTAX[p])] == "منطق") { + // if (p != 1) + //{ + // ErrorCode("أمر غير معروف ' " + SYNTAX[p] + " ' ", o_tokens); + //} + + if (SYNTAX[p + 1] != "") { + // bool A = B + wrong + ErrorCode("أمر غير معروف ' " + SYNTAX[p + 1] + + " '، على العموم لا يمكن أجراء أية عملية على " + "متغير منطقي ", + o_tokens); + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE("[C++ Local Bool (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + + continue; + } else if (OBJECTIF_TYPE != "منطق") { + ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + " ' " + + SYNTAX[p] + " ' ", + o_tokens); + } + // else + //{ + // ErrorCode("علة : استثناء في متغير منطقي ' " + SYNTAX[p] + " ' ", + // o_tokens); + //} + + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-BOOL ' " + SYNTAX[p] + " '] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } + + // ----------------------------------- + // Local Func Void Pointer + // ----------------------------------- + + else if (L_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, + SYNTAX[p])] == "مؤشر_دالة") { + if (p > 0) + if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + + if (OBJECTIF_TYPE == "عدد") { + ErrorCode( + "لا يمكن تحويل مؤشر_دالة إلى عدد ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "نص") { + ErrorCode( + "لا يمكن تحويل مؤشر_دالة إلى نص ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "مؤشر_دالة") { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-POINTER-FUNC (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE( + "[C++ Local POINTER-FUNC (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } + + // ---------------------- + // Global VARIABLE (all type) + // Global VARIABLE without _ + // ---------------------- + + else if (substr_utf8(SYNTAX[p], 0, 1) == "_" || + G_VAR_IS_SET[(SYNTAX[p])]) { + if (p > 0) + if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + + std::string G_VAR_WITHOUT_; + + if (G_VAR_IS_SET[(SYNTAX[p])]) + G_VAR_WITHOUT_ = SYNTAX[p]; + else + G_VAR_WITHOUT_ = substr_utf8( + SYNTAX[p], 1, CharCount_utf8(SYNTAX[p], o_tokens)); + + if (!G_VAR_IS_SET[(G_VAR_WITHOUT_)]) + ErrorCode("ليس متغير عام ' " + SYNTAX[p] + " ' ", o_tokens); + + if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "عدد") { + if (OBJECTIF_TYPE == "عدد") { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-INT (" + G_VAR_WITHOUT_ + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "نص") { + if (ACCEPT_INT_TO_STRING) { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-INT (" + G_VAR_WITHOUT_ + + ").ToString] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" alifcore_IntToString(" + + Global_ID[G_VAR_WITHOUT_] + ") "); + // *** *** *** *** *** *** + } else { + ErrorCode( + "لا يمكن تحويل عدد إلى نص : ' " + SYNTAX[p] + " ' ", + o_tokens); + } + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE( + "[C++ Global عدد (" + G_VAR_WITHOUT_ + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } else if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "نص") { + if (OBJECTIF_TYPE == "عدد") { + if (ACCEPT_INT_TO_STRING) // or ACCEPT_STR_TO_INT !! + { + // if(DEBUG)DEBUG_MESSAGE("[GLOBAL-STRING (" + + // G_VAR_WITHOUT_ + + // ").ToInt] ", o_tokens); // DEBUG + ErrorCode("لا يمكن تحويل نص إلى عدد ' " + + G_VAR_WITHOUT_ + " ' ", + o_tokens); + } else { + ErrorCode( + "لا يمكن تحويل عدد إلى نص : ' " + SYNTAX[p] + " ' ", + o_tokens); + } + } else if (OBJECTIF_TYPE == "نص") { + if (DEBUG) + DEBUG_MESSAGE( + "[GLOBAL-STRING (" + G_VAR_WITHOUT_ + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE( + "[C++ Global نص (" + G_VAR_WITHOUT_ + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } else if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "منطق") { + if (OBJECTIF_TYPE != "منطق" && OBJECTIF_TYPE != "C++") { + ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + + " ' " + G_VAR_WITHOUT_ + " ' ", + o_tokens); + } + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-BOOL ' " + G_VAR_WITHOUT_ + " '] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المتغير العام غير معروف ' " + + G_VAR_TYPE[(G_VAR_WITHOUT_)] + " -> " + + G_VAR_WITHOUT_ + " ' ", + o_tokens); + } + } + + // ----------------------------------- + // True / False + // ----------------------------------- + + else if (SYNTAX[p] == "صحيح") { + if (p != 1) + ErrorCode("لا يمكن وضع ( منطق ) هنا ' " + SYNTAX[p] + " ' ", + o_tokens); + + if (SYNTAX[p + 1] != "") { + // bool A = TRUE + wrong + ErrorCode("أمر غير معروف ' " + SYNTAX[p + 1] + + " '، على العموم لا يمكن أجراء أية عملية على " + "متغير منطقي ", + o_tokens); + } + + if (OBJECTIF_TYPE == "منطق") { + if (DEBUG) DEBUG_MESSAGE("[TRUE] ", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" true "); + // *** *** *** *** *** *** + } else { + ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + " ' " + + SYNTAX[p] + " ' ", + o_tokens); + } + } else if (SYNTAX[p] == "خطأ") { + if (p != 1) + ErrorCode("لا يمكن وضع ( منطق ) هنا ' " + SYNTAX[p] + " ' ", + o_tokens); + + if (SYNTAX[p + 1] != "") { + // bool A = FALSE + wrong + ErrorCode("أمر غير معروف ' " + SYNTAX[p + 1] + + " '، على العموم لا يمكن أجراء أية عملية على " + "متغير منطقي ", + o_tokens); + } + + if (OBJECTIF_TYPE == "منطق") { + if (DEBUG) DEBUG_MESSAGE("[FALSE] ", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" false "); + // *** *** *** *** *** *** + } else { + ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + " ' " + + SYNTAX[p] + " ' ", + o_tokens); + } + } + + // ----------------------------------- + // New Line سطر + // ----------------------------------- + + else if (SYNTAX[p] == "سطر") { + if (p > 0) + if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة سطر جديد هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + + if (OBJECTIF_TYPE == "عدد") { + // if(DEBUG)DEBUG_MESSAGE("[LOCAL-STRING (" + SYNTAX[p] + + // ").ToInt] ", o_tokens); // DEBUG + ErrorCode( + "لا يمكن تحويل سطر جديد إلى عدد ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "نص") { + if (DEBUG) DEBUG_MESSAGE("[NewLine] ", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" ALIFCORE_NEW_LINE "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "منطق") { + ErrorCode( + "لا يمكن تحويل سطر جديد إلى منطق ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) DEBUG_MESSAGE("[C++_NewLine] ", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" (\"\n\") "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } + + // ---------------------- + // Class Global/Local Obj + // ---------------------- + + else if (OBJ_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, + SYNTAX[p])] || + OBJ_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, + SYNTAX[p])] || + OBJ_IS_SET[std::make_pair("", SYNTAX[p])]) { + // a = obj:mem + c + // b = obj:mem_func(a, b) + c + + if (p > 0) + if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة كائن هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + + // if (SYNTAX[p + 1] != ":") + // ErrorCode("يجب إضافة ':' بعد ' " + SYNTAX[p] + " ' ", o_tokens); + // if (SYNTAX[p + 2] == "") + // ErrorCode("يجب إضافة إسم منتمي للصنف بعد ' " + SYNTAX[p] + " : ' + // ", o_tokens); + + if (SYNTAX[p + 1] != ":") + ErrorCode("يجب وضع نقطتين ':' بين الكائن و المنتمي، أي بعد ' " + + SYNTAX[p] + " ' ", + o_tokens); + if (SYNTAX[p + 2] == "بناء") + ErrorCode( + "لا يمكن استدعاء دالة ' بناء() '، هته الدالة تستدعى بشكل " + "آلي " + "عند إنشاء الكائن", + o_tokens); + if (SYNTAX[p + 2] == "هدم") + ErrorCode( + "لا يمكن استدعاء دالة ' هدم() '، هته الدالة تستدعى بشكل " + "آلي " + "عند الحاجة إلى تدمير هذا الكائن", + o_tokens); + if (SYNTAX[p + 2] == "") + ErrorCode("يجب وضع اسم المنتمي بعد ' " + SYNTAX[p] + ":' ", + o_tokens); + + // C++, allow create Obj on global, global-class, local, but using + // it only on func. + std::string OBJ_ID; + bool IS_GLOBAL_OBJ = false; + if (OBJ_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, + SYNTAX[p])]) { + // Local Obj. + // Namespace -> Func -> Obj. Or + // Class -> Func -> Obj. + OBJ_ID = TMP_NAMESPACE_OR_CLASS + TmpFunction; + } else if (OBJ_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, + SYNTAX[p])] && + TMP_NAMESPACE_OR_CLASS != "") { + // Global Class Obj. + // Class -> Obj. + OBJ_ID = TMP_NAMESPACE_OR_CLASS; + } else { + // Global Obj. + // Global-Area -> Obj. + OBJ_ID = ""; + IS_GLOBAL_OBJ = true; + } + + std::string TK_CLASS = OBJ_CLASS[std::make_pair(OBJ_ID, SYNTAX[p])]; + + if (!CLASS_G_VAR_IS_SET[std::make_pair(TK_CLASS, SYNTAX[p + 2])] && + !CLASS_FUN_IS_SET[std::make_pair(TK_CLASS, SYNTAX[p + 2])]) + ErrorCode("الصنف ' " + TK_CLASS + + " ' ليس فيه أي منتمي معرف باسم ' " + + SYNTAX[p + 2] + " ' ", + o_tokens); + + std::string MEMBER_TYPE; + + if (CLASS_G_VAR_IS_SET[std::make_pair(TK_CLASS, SYNTAX[p + 2])]) { + // متغير member + + // a = obj : mem + c + + if (CLASS_G_VAR_PRIVATE[std::make_pair(TK_CLASS, + SYNTAX[p + 2])]) + ErrorCode("لا يمكن استدعاء المتغير ' " + SYNTAX[p + 2] + + " ' المنتمي للصنف ' " + TK_CLASS + + " ' لأنه من نوع ' خاص ' ", + o_tokens); + + MEMBER_TYPE = + CLASS_G_VAR_TYPE[std::make_pair(TK_CLASS, SYNTAX[p + 2])]; + + if (MEMBER_TYPE == "عادم") + ErrorCode("لا يمكن إضافة منتمي عادم ' " + SYNTAX[p] + + " : " + SYNTAX[p + 2] + " ' ", + o_tokens); + + if (MEMBER_TYPE == "عدد") { + if (OBJECTIF_TYPE == "عدد") { + if (IS_GLOBAL_OBJ) { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(INT)] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + + "." + Global_ID[SYNTAX[p + 2]] + + " "); + // *** *** *** *** *** *** + } else { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(INT)] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + "." + + Global_ID[SYNTAX[p + 2]] + " "); + // *** *** *** *** *** *** + } + } else if (OBJECTIF_TYPE == "نص") { + if (IS_GLOBAL_OBJ) { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(INT).ToString] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" alifcore_IntToString(" + + GlobalObj_ID[SYNTAX[p]] + "." + + Global_ID[SYNTAX[p + 2]] + ") "); + // *** *** *** *** *** *** + } else { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(INT).ToString] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" alifcore_IntToString(" + + Obj_ID[SYNTAX[p]] + "." + + Global_ID[SYNTAX[p + 2]] + ") "); + // *** *** *** *** *** *** + } + } else if (OBJECTIF_TYPE == "منطق") { + ErrorCode("لا يمكن تحويل عدد إلى منطق ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + " ' ", + o_tokens); + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + + " ' ", + o_tokens); + } + } else if (MEMBER_TYPE == "نص") { + if (OBJECTIF_TYPE == "عدد") { + ErrorCode( + "لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "نص") { + if (IS_GLOBAL_OBJ) { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(STRING)] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + + "." + Global_ID[SYNTAX[p + 2]] + + " "); + // *** *** *** *** *** *** + } else { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(STRING)] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + "." + + Global_ID[SYNTAX[p + 2]] + " "); + // *** *** *** *** *** *** + } + } else if (OBJECTIF_TYPE == "منطق") { + ErrorCode("لا يمكن تحويل نص إلى منطق ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + " ' ", + o_tokens); + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + + " ' ", + o_tokens); + } + } else if (MEMBER_TYPE == "منطق") { + if (OBJECTIF_TYPE != "منطق") { + ErrorCode("لا يمكن تحويل منتمي منطق إلى " + + OBJECTIF_TYPE + " ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "منطق") { + if (IS_GLOBAL_OBJ) { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(BOOL)] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + + "." + Global_ID[SYNTAX[p + 2]] + + " "); + // *** *** *** *** *** *** + } else { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(BOOL)] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + "." + + Global_ID[SYNTAX[p + 2]] + " "); + // *** *** *** *** *** *** + } + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + + " ' ", + o_tokens); + } + } else { + ErrorCode("علة : نوع المنتمي غير معروف ' " + MEMBER_TYPE + + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + + p += 2; // point إلى next token بعد obj:mem + } else if (CLASS_FUN_IS_SET[std::make_pair(TK_CLASS, + SYNTAX[p + 2])]) { + // Function member + + // b = obj : memf (a, b) + + if (CLASS_FUN_PRIVATE[std::make_pair(TK_CLASS, SYNTAX[p + 2])]) + ErrorCode("الدالة منتمي ' " + SYNTAX[p + 2] + + " ' داخل الصنف ' " + TK_CLASS + " ' خاص ", + o_tokens); + + if (CLASS_FUN_TYPE[std::make_pair(TK_CLASS, SYNTAX[p + 2])] == + "عادم") + ErrorCode("لا يمكن إضافة منتمي عادم ' " + SYNTAX[p] + + " : " + SYNTAX[p + 2] + " ' داخل الصنف ' " + + TK_CLASS + " ' ", + o_tokens); + + if (SYNTAX[p + 3] != "(") + ErrorCode("يجب إضافة '(' بعد ' " + SYNTAX[p] + ":" + + SYNTAX[p + 2] + " ' ", + o_tokens); + + MEMBER_TYPE = + CLASS_FUN_TYPE[std::make_pair(TK_CLASS, SYNTAX[p + 2])]; + + int TMP_FUN_LONG = p + 4; // a + b + 'p'obj : memf (a, b) + c + int OPEN_PARENTIZE = 0; + + while (TMP_FUN_LONG <= SYNTAX_LONG) { + if (SYNTAX[TMP_FUN_LONG] == + "(") // مفتوح inside الدالة args : fun( a + (b)) + OPEN_PARENTIZE++; + else if (SYNTAX[TMP_FUN_LONG] == ")" && + OPEN_PARENTIZE > 0) // Close inside الدالة args + OPEN_PARENTIZE--; + else if (SYNTAX[TMP_FUN_LONG] == ")" && + OPEN_PARENTIZE < 1) // Close final الدالة call + { + if (TMP_FUN_LONG < SYNTAX_LONG) { + // a = fun( a + (b)) + 123 + // str / عدد = متغير + (fun(var)) * (fun(var) / + // fun(var, fun(var), var) - var) + + if ((SYNTAX[TMP_FUN_LONG + 1] != "+") && + (SYNTAX[TMP_FUN_LONG + 1] != "-") && + (SYNTAX[TMP_FUN_LONG + 1] != "*") && + (SYNTAX[TMP_FUN_LONG + 1] != "/") && + (SYNTAX[TMP_FUN_LONG + 1] != "،") && + (SYNTAX[TMP_FUN_LONG + 1] != ",") && + (SYNTAX[TMP_FUN_LONG + 1] != ")")) { + ErrorCode("نص غير معروف بعد نداء ' " + + SYNTAX[p] + " : " + + SYNTAX[p + 2] + "()' : ' " + + SYNTAX[TMP_FUN_LONG + 1] + " ' ", + o_tokens); + } + } else if (TMP_FUN_LONG == SYNTAX_LONG) { + // a = obj:fun( a + (b)) + if (SYNTAX[TMP_FUN_LONG] != ")" || + SYNTAX[SYNTAX_LONG] != ")") // double check! + ErrorCode("يجب إنهاء نداء الدالة ' " + + SYNTAX[p] + " : " + + SYNTAX[p + 2] + + "()' بالإشارة ')' ", + o_tokens); + } + + break; + } + + TMP_FUN_LONG++; + } + + if (SYNTAX[TMP_FUN_LONG] != ")") // Double check! + ErrorCode("يجب إنهاء نداء الدالة ' " + SYNTAX[p] + " : " + + SYNTAX[p + 2] + "()' بالإشارة ')' ", + o_tokens); + + std::string TempToken[1024]; + int TempTokenCount = 0; + for (int i = p + 4; i <= TMP_FUN_LONG; i++) { + if (SYNTAX[i] != "") { + TempToken[TempTokenCount] = SYNTAX[i]; + TempTokenCount++; + } + } + + if (MEMBER_TYPE == "عدد") { + if (OBJECTIF_TYPE == "عدد") { + if (IS_GLOBAL_OBJ) { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(Func-INT) (", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + + ".ClassFUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } else { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(Func-INT) (", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + + ".ClassFUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } + + CPP_CODE.append(CHECK_CALL_FUN_ARG( + false, TK_CLASS, SYNTAX[p + 2], + 2, // 2 = الدالة member + TheNamespace, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens)); + + if (DEBUG) DEBUG_MESSAGE(")] ", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" ) "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "نص") { + if (IS_GLOBAL_OBJ) { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(Func-INT) (", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" alifcore_IntToString(" + + GlobalObj_ID[SYNTAX[p]] + + ".ClassFUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } else { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(Func-INT) (", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append( + " alifcore_IntToString(" + Obj_ID[SYNTAX[p]] + + ".ClassFUNCTION_" + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } + + CPP_CODE.append(CHECK_CALL_FUN_ARG( + false, TK_CLASS, SYNTAX[p + 2], + 2, // 2 = الدالة member + TheNamespace, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens)); + + if (DEBUG) + DEBUG_MESSAGE(").IntFunToString] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" )) "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + + " : " + SYNTAX[p + 2] + "()' ", + o_tokens); + } + } else if (MEMBER_TYPE == "نص") { + if (OBJECTIF_TYPE == "عدد") { + ErrorCode("لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + + " : " + SYNTAX[p + 2] + "()' ", + o_tokens); + } else if (OBJECTIF_TYPE == "نص") { + if (IS_GLOBAL_OBJ) { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(Func-STRING) (", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + + ".ClassFUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } else { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(Func-STRING) (", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + + ".ClassFUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } + + CPP_CODE.append(CHECK_CALL_FUN_ARG( + false, TK_CLASS, SYNTAX[p + 2], + 2, // 2 = الدالة member + TheNamespace, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens)); + + if (DEBUG) DEBUG_MESSAGE(")] ", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" ) "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + + " : " + SYNTAX[p + 2] + "()' ", + o_tokens); + } + } else if (MEMBER_TYPE == "منطق") { + if (OBJECTIF_TYPE != "منطق") { + ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + + " ' " + SYNTAX[p] + " : " + + SYNTAX[p + 2] + "()' ", + o_tokens); + } else if (OBJECTIF_TYPE == "منطق") { + if (IS_GLOBAL_OBJ) { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(Func-BOOL) (", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + + ".ClassFUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } else { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + + " ':'" + SYNTAX[p + 2] + + " '(Func-BOOL) (", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + + ".ClassFUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } + + CPP_CODE.append(CHECK_CALL_FUN_ARG( + false, TK_CLASS, SYNTAX[p + 2], + 2, // 2 = الدالة member + TheNamespace, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens)); + + if (DEBUG) DEBUG_MESSAGE(")] ", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" ) "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + + " : " + SYNTAX[p + 2] + "()' ", + o_tokens); + } + } else { + ErrorCode("علة : نوع المنتمي غير معروف ' " + MEMBER_TYPE + + " -> " + SYNTAX[p] + " : " + SYNTAX[p + 2] + + "()' ", + o_tokens); + } + + p = TMP_FUN_LONG; // point إلى next token بعد fun(...) + } + } + + // ---------------------- + // Class Global VARIABLE + // ---------------------- + + // class + // g1 = 123 + // g2 = g1<-- + + else if (CLASS_G_VAR_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, + SYNTAX[p])] && + IsInsideClass) { + // Class Global area + + if (p > 0) + if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + + " " + SYNTAX[p] + " ' ", + o_tokens); + + if (CLASS_G_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS, + SYNTAX[p])] == "عدد") { + if (OBJECTIF_TYPE == "عدد") { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-GLOBAL-INT (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "نص") { + if (ACCEPT_INT_TO_STRING) { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-GLOBAL-INT (" + SYNTAX[p] + + ").ToString] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" alifcore_IntToString(" + + Global_ID[SYNTAX[p]] + ") "); + // *** *** *** *** *** *** + } else { + ErrorCode( + "لا يمكن تحويل عدد إلى نص : ' " + SYNTAX[p] + " ' ", + o_tokens); + } + } else if (OBJECTIF_TYPE == "منطق") { + ErrorCode( + "لا يمكن تحويل عدد إلى منطق : ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE( + "[C++ CLASS-GLOBAL-INT (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } else if (CLASS_G_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS, + SYNTAX[p])] == "نص") { + if (OBJECTIF_TYPE == "عدد") { + // if(DEBUG)DEBUG_MESSAGE("[GLOBAL-STRING (" + SYNTAX[p] + + // ").ToInt] + // ", o_tokens); // DEBUG + ErrorCode("لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "نص") { + if (DEBUG) + DEBUG_MESSAGE( + "[CLASS-GLOBAL-STRING (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "منطق") { + ErrorCode( + "لا يمكن تحويل نص إلى منطق : ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE( + "[C++ CLASS-GLOBAL-STRING (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } else if (CLASS_G_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS, + SYNTAX[p])] == "منطق") { + if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE( + "[C++ CLASS-GLOBAL-BOOL (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE != "منطق") { + ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + + " ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "منطق") { + if (DEBUG) + DEBUG_MESSAGE( + "[CLASS-GLOBAL-BOOL (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } else { + ErrorCode( + "علة : نوع المتغير العام غير معروف ' " + SYNTAX[p] + " ' ", + o_tokens); + } + } + + // ---------------------- + // Global VARIABLE without _ + // ---------------------- + + // g1 = 123 + // g2 = _g1 + 'g1' <-- + + /* + else if (G_VAR_IS_SET[(SYNTAX[p])]) + { + ... + } + */ + + // ----------------------------------- + // TXT + // ----------------------------------- + + else if (substr_utf8(SYNTAX[p], 0, 1) == "\"") { + if (p > 0) + if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة نص هنا ' " + SYNTAX[p - 1] + " " + + SYNTAX[p] + " ' ", + o_tokens); + + if (!IsValidStringFormat(SYNTAX[p], o_tokens)) + ErrorCode("ليس بنص صحيح ' " + SYNTAX[p] + " ' ", o_tokens); + + if (OBJECTIF_TYPE == "عدد") { + // if(DEBUG)DEBUG_MESSAGE("[STRING_MSG (" + SYNTAX[p] + + // ").ToInt] ", o_tokens); // DEBUG + ErrorCode("لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "نص") { + if (DEBUG) + DEBUG_MESSAGE("[STRING_MSG (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" (" + SYNTAX[p] + ") "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "منطق") { + ErrorCode("لا يمكن تحويل نص إلى منطق ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE("[C++ نص (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" (" + SYNTAX[p] + ") "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } + + // ----------------------------------- + // DIGIT + // ----------------------------------- + + else if (IsValidDigit(SYNTAX[p], true, o_tokens)) { + if (p > 0) + if (!CAN_ADD_DIGIT_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن إضافة رقم هنا ' " + SYNTAX[p - 1] + " " + + SYNTAX[p] + " ' ", + o_tokens); + + if (OBJECTIF_TYPE == "عدد") { + if (DEBUG) + DEBUG_MESSAGE("[DIGIT " + SYNTAX[p] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + SYNTAX[p] + " "); + // *** *** *** *** *** *** + } else if (OBJECTIF_TYPE == "نص") { + if (ACCEPT_INT_TO_STRING) { + if (DEBUG) + DEBUG_MESSAGE("[DIGIT (" + SYNTAX[p] + ").ToString] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" alifcore_IntToString(" + SYNTAX[p] + + ") "); + // *** *** *** *** *** *** + } else { + ErrorCode( + "لا يمكن تحويل رقم إلى نص : ' " + SYNTAX[p] + " '", + o_tokens); + } + } else if (OBJECTIF_TYPE == "منطق") { + ErrorCode("لا يمكن تحويل رقم إلى منطق ' " + SYNTAX[p] + " ' ", + o_tokens); + } else if (OBJECTIF_TYPE == "C++") { + if (DEBUG) + DEBUG_MESSAGE("[C++ رقم (" + SYNTAX[p] + ")] ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" " + SYNTAX[p] + " "); + // *** *** *** *** *** *** + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + + " -> " + SYNTAX[p] + " ' ", + o_tokens); + } + } + + // ----------------------------------- + // Function / Class-Function + // ----------------------------------- + + else if (CLASS_FUN_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, + SYNTAX[p])] || + G_FUN_IS_SET[(SYNTAX[p])] || + L_FUN_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, + SYNTAX[p])]) // call الدالة (a, b) + { + if (p > 0) + if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) + ErrorCode("لا يمكن وضع دالة هنا ' " + SYNTAX[p - 1] + " " + + SYNTAX[p] + " ' ", + o_tokens); + + if (!IsInsideFunction) + ErrorCode("يجب مناداة على الدالة من داخل دالة ' " + SYNTAX[p] + + "()' ", + o_tokens); + + if (OBJECTIF_TYPE == "مؤشر_دالة") { + // ... function_name -> to an pointer-func + + std::string FUN_TYPE; + bool IS_LOCAL_FUN = false; + IS_LOCAL_FUN = L_FUN_IS_SET[std::make_pair( + TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; + + if (IS_LOCAL_FUN) { + FUN_TYPE = L_FUN_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS, + SYNTAX[p])]; + if (DEBUG) + DEBUG_MESSAGE("[REFERENCE-OF-LOCAL-FUNCTION-" + + FUN_TYPE + " ' " + SYNTAX[p] + " ']", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" NS_" + ID[TheNamespace] + "::FUNCTION_" + + ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } else { + FUN_TYPE = G_FUN_TYPE[(SYNTAX[p])]; + if (DEBUG) + DEBUG_MESSAGE("[REFERENCE-OF-GLOBAL-FUNCTION-" + + FUN_TYPE + " ' " + SYNTAX[p] + " ']", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" FUNCTION_" + Global_ID[SYNTAX[p]] + " "); + // *** *** *** *** *** *** + } + } else { + // ... function_name(...) -> to an anythings except pointers + + if (SYNTAX[p + 1] == "") + ErrorCode("يجب اضافه '(' بعد ' " + SYNTAX[p] + " ' ", + o_tokens); + + if (SYNTAX[p + 1] != "(") + ErrorCode("أمر غير معروف ' " + SYNTAX[p + 1] + " ' ", + o_tokens); + + // bool ThisIsClassFunction = false; + // if (CLASS_FUN_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, + // SYNTAX[p])]) + // ThisIsClassFunction = true; + + // if(ThisIsClassFunction) + // ErrorCode("_TEST_TEST_TEST_' " + SYNTAX[p + 1] + " ' ", + // o_tokens); + + int TMP_FUN_LONG = p + 2; // a + b + 'p'fun ( c + (1 * 2) ) + c + int OPEN_PARENTIZE = 0; + + while (TMP_FUN_LONG <= SYNTAX_LONG) { + if (SYNTAX[TMP_FUN_LONG] == + "(") // مفتوح inside الدالة args : fun( a + (b)) + OPEN_PARENTIZE++; + else if (SYNTAX[TMP_FUN_LONG] == ")" && + OPEN_PARENTIZE > 0) // Close inside الدالة args + OPEN_PARENTIZE--; + else if (SYNTAX[TMP_FUN_LONG] == ")" && + OPEN_PARENTIZE < 1) // Close final الدالة call + { + if (TMP_FUN_LONG < SYNTAX_LONG) { + // a = fun( a + (b)) + 123 + // str / عدد = متغير + (fun(var)) * (fun(var) / + // fun(var, fun(var), var) - var) + + if ((SYNTAX[TMP_FUN_LONG + 1] != "+") && + (SYNTAX[TMP_FUN_LONG + 1] != "-") && + (SYNTAX[TMP_FUN_LONG + 1] != "*") && + (SYNTAX[TMP_FUN_LONG + 1] != "/") && + (SYNTAX[TMP_FUN_LONG + 1] != "،") && + (SYNTAX[TMP_FUN_LONG + 1] != ",") && + (SYNTAX[TMP_FUN_LONG + 1] != ")")) { + ErrorCode("نص غير معروف بعد نداء ' " + + SYNTAX[p] + "()' : ' " + + SYNTAX[TMP_FUN_LONG + 1] + " ' ", + o_tokens); + } + } else if (TMP_FUN_LONG == SYNTAX_LONG) { + // a = fun( a + (b)) + if (SYNTAX[TMP_FUN_LONG] != ")") // double check! + ErrorCode("يجب إنهاء نداء الدالة ' " + + SYNTAX[p] + "()' بالإشارة ')' ", + o_tokens); + } + + break; + } + + TMP_FUN_LONG++; + } + + if (SYNTAX[TMP_FUN_LONG] != ")") // Double check! + ErrorCode("يجب إنهاء نداء الدالة ' " + SYNTAX[p] + + "()' بالإشارة ')' ", + o_tokens); + // ErrorCode("===== |" + SYNTAX[TMP_FUN_LONG - 1] + "| =====", + // o_tokens); + + std::string TempToken[1024]; + int TempTokenCount = 0; + for (int i = p + 2; i <= TMP_FUN_LONG; i++) { + if (SYNTAX[i] != "") { + TempToken[TempTokenCount] = SYNTAX[i]; + TempTokenCount++; + } + } + + bool IS_LOCAL_FUN = false; + if (IsInsideClass) { + IS_LOCAL_FUN = CLASS_FUN_IS_SET[std::make_pair( + TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; + } else { + IS_LOCAL_FUN = L_FUN_IS_SET[std::make_pair( + TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; + } + + std::string FUN_TYPE; + + if (IS_LOCAL_FUN) { + if (IsInsideClass) { + FUN_TYPE = CLASS_FUN_TYPE[std::make_pair( + TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; + } else { + FUN_TYPE = L_FUN_TYPE[std::make_pair( + TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; + } + + if (FUN_TYPE == "عادم") + ErrorCode( + "الدالة المحلية ' " + SYNTAX[p] + + "()' من نوع عادم, لدى لا يمكن تحويلها إلى " + + OBJECTIF_TYPE, + o_tokens); + } else { + FUN_TYPE = G_FUN_TYPE[(SYNTAX[p])]; + + if (FUN_TYPE == "عادم") + ErrorCode( + "الدالة العامة ' " + SYNTAX[p] + + "()' من نوع عادم, لدى لا يمكن تحويل إلى " + + OBJECTIF_TYPE, + o_tokens); + } + + std::string CG_BUFFER; + + if (OBJECTIF_TYPE == "عدد") { + if (FUN_TYPE == "عدد") { + if (IS_LOCAL_FUN) { + // Call a local fun int + + if (DEBUG) + DEBUG_MESSAGE("[CALL-LOCAL-FUNCTION-INT ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + if (IsInsideClass) { + CG_BUFFER.append(" ClassFUNCTION_" + + ID[SYNTAX[p]] + "( "); + } else { + CG_BUFFER.append(" NS_" + ID[TheNamespace] + + "::FUNCTION_" + ID[SYNTAX[p]] + + "( "); + } + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, + TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) "); + // *** *** *** *** *** *** + } else { + // Call a Global fun int + + if (DEBUG) + DEBUG_MESSAGE("[CALL-GLOBAL-FUNCTION-INT ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" FUNCTION_" + + Global_ID[SYNTAX[p]] + "( "); + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, + TheFunction, TempToken, (TempTokenCount - 1), + o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) "); + // *** *** *** *** *** *** + } + } else if (FUN_TYPE == "نص") { + if (IS_LOCAL_FUN) + ErrorCode("لا يمكن تحويل الدالة المحلية ' " + + SYNTAX[p] + "()' من نص إلى عدد ", + o_tokens); + else + ErrorCode("لا يمكن تحويل الدالة العامة ' " + + SYNTAX[p] + "()' من نص إلى عدد ", + o_tokens); + } else if (FUN_TYPE == "منطق") { + if (IS_LOCAL_FUN) + ErrorCode("لا يمكن تحويل الدالة المحلية ' " + + SYNTAX[p] + "()' من منطق إلى عدد ", + o_tokens); + else + ErrorCode("لا يمكن تحويل الدالة العامة ' " + + SYNTAX[p] + "()' من منطق إلى عدد ", + o_tokens); + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " [" + FUN_TYPE + "] " + + " [" + TMP_NAMESPACE_OR_CLASS + "] " + + SYNTAX[p] + "()' ", + o_tokens); + } + } else if (OBJECTIF_TYPE == "نص") { + if (FUN_TYPE == "عدد") { + if (IS_LOCAL_FUN) { + // Call a local fun int.ToString + + if (DEBUG) + DEBUG_MESSAGE( + "[CALL-LOCAL-FUNCTION-INT.ToString ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CG_BUFFER.append( + " alifcore_IntToString( OBJ_CLASS_WINDOW_" + + ID[TheNamespace] + "::FUNCTION_" + + ID[SYNTAX[p]] + "( "); + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, + TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) ) "); + // *** *** *** *** *** *** + } else { + // Call a Global fun int.ToString + + if (DEBUG) + DEBUG_MESSAGE( + "[CALL-GLOBAL-FUNCTION-INT.ToString ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CG_BUFFER.append( + " alifcore_IntToString( FUNCTION_" + + Global_ID[SYNTAX[p]] + "( "); + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, + TheFunction, TempToken, (TempTokenCount - 1), + o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) ) "); + // *** *** *** *** *** *** + } + } else if (FUN_TYPE == "نص") { + if (IS_LOCAL_FUN) { + // Call a local fun std::string + + if (DEBUG) + DEBUG_MESSAGE("[CALL-LOCAL-FUNCTION-STRING ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" NS_" + ID[TheNamespace] + + "::FUNCTION_" + ID[SYNTAX[p]] + + "( "); + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, + TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) "); + // *** *** *** *** *** *** + + if (DEBUG) DEBUG_MESSAGE(") ", o_tokens); // DEBUG + } else { + // Call a Global fun int + + if (DEBUG) + DEBUG_MESSAGE( + "[CALL-GLOBAL-FUNCTION-STRING ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" FUNCTION_" + + Global_ID[SYNTAX[p]] + "( "); + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, + TheFunction, TempToken, (TempTokenCount - 1), + o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) "); + // *** *** *** *** *** *** + } + } else if (FUN_TYPE == "منطق") { + if (IS_LOCAL_FUN) + ErrorCode("لا يمكن تحويل الدالة المحلية ' " + + SYNTAX[p] + "()' من منطق إلى نص ", + o_tokens); + else + ErrorCode("لا يمكن تحويل الدالة العامة ' " + + SYNTAX[p] + "()' من منطق إلى نص ", + o_tokens); + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + + "()' ", + o_tokens); + } + } else if (OBJECTIF_TYPE == "منطق") { + if (FUN_TYPE == "عدد") { + if (IS_LOCAL_FUN) + ErrorCode("لا يمكن تحويل الدالة المحلية ' " + + SYNTAX[p] + "()' من عدد إلى منطق ", + o_tokens); + else + ErrorCode("لا يمكن تحويل الدالة العامة ' " + + SYNTAX[p] + "()' من عدد إلى منطق ", + o_tokens); + } else if (FUN_TYPE == "نص") { + if (IS_LOCAL_FUN) + ErrorCode("لا يمكن تحويل الدالة المحلية ' " + + SYNTAX[p] + "()' من نص إلى منطق ", + o_tokens); + else + ErrorCode("لا يمكن تحويل الدالة العامة ' " + + SYNTAX[p] + "()' من نص إلى منطق ", + o_tokens); + } else if (FUN_TYPE == "منطق") { + if (IS_LOCAL_FUN) { + // Call a local fun bool + + if (DEBUG) + DEBUG_MESSAGE("[CALL-LOCAL-FUNCTION-BOOL ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" NS_" + ID[TheNamespace] + + "::FUNCTION_" + ID[SYNTAX[p]] + + "( "); + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, + TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) "); + // *** *** *** *** *** *** + } else { + // Call a Global fun bool + + if (DEBUG) + DEBUG_MESSAGE("[CALL-GLOBAL-FUNCTION-BOOL ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" FUNCTION_" + + Global_ID[SYNTAX[p]] + "( "); + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, + TheFunction, TempToken, (TempTokenCount - 1), + o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) "); + // *** *** *** *** *** *** + } + } else { + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + SYNTAX[p] + + "()' ", + o_tokens); + } + } else if (OBJECTIF_TYPE == "C++") { + // xType: We igiore type of function.. this is C++ targed + // user must take care of this!. + + if (IS_LOCAL_FUN) { + // Call a local fun xType + + if (DEBUG) + DEBUG_MESSAGE("[C++ CALL-LOCAL-FUNCTION-xType ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" NS_" + ID[TheNamespace] + + "::FUNCTION_" + ID[SYNTAX[p]] + "( "); + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, + TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) "); + // *** *** *** *** *** *** + } else { + // Call a Global fun xType + + if (DEBUG) + DEBUG_MESSAGE("[C++ CALL-GLOBAL-FUNCTION-xType ' " + + SYNTAX[p] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" FUNCTION_" + Global_ID[SYNTAX[p]] + + "( "); + // *** *** *** *** *** *** + + CG_BUFFER.append(CHECK_CALL_FUN_ARG( + true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, + TheFunction, TempToken, (TempTokenCount - 1), + o_tokens)); + + // *** Generate Code *** + // Buffer + CG_BUFFER.append(" ) "); + // *** *** *** *** *** *** + } + } + + // *** Generate Code *** + CPP_CODE.append(" " + CG_BUFFER + " "); + // *** *** *** *** *** *** + + p = TMP_FUN_LONG; // point to next token after fun(...) + } + } + + // ----------------------------------- + // : (Operator between members) v3 + // ----------------------------------- + + else if (namespace_is_set[SYNTAX[p]] || SYNTAX[p + 1] == ":") { + // abc = namespace:local_func(a, b) | namespace:my_func(a, b) + // abc = namespace:local_var | namespace:my_var + + string CTR_WIN; + string CTR_CONTROL; + string CTR_OPTION; + string CTR_OPTION_TYPE; + string CTR_OPTION_CPP_END; + // int CTR_ARG; + int CTR_LAST_TOKEN_NUMBER = 0; + + if (namespace_is_set[SYNTAX[p]]) { + // abc = namespace:local_func(a, b) | namespace:my_func(a, + // b) abc = namespace:local_var | namespace:my_var + + // namespace_name : local_func ( + //... ) p +1 +2 + //+3 + + if (SYNTAX[p + 1] != ":") + ErrorCode("يجب اضافه ' : ' بعد ' " + SYNTAX[p] + " ' ", + o_tokens); + + if (SYNTAX[p + 2] == "") + ErrorCode( + "يجب اضافه عضو تابع ل ' " + SYNTAX[p] + " ' بعد ':' ", + o_tokens); + + if (SYNTAX[p + 3] == "") + ErrorCode("يجب اضافه ':' أو '()' بعد ' " + SYNTAX[p] + " " + + SYNTAX[p + 1] + " " + SYNTAX[p + 2] + " ' ", + o_tokens); + + if (SYNTAX[p + 3] != "(" && SYNTAX[p + 3] != ":") + ErrorCode("أمر غير معروف ' " + SYNTAX[p + 3] + + " ', يجب اضافه ':' أو '()' ", + o_tokens); + + if (SYNTAX[p + 3] == "(") { + if (L_FUN_IS_SET[std::make_pair(SYNTAX[p], + SYNTAX[p + 2])]) { + // --------------------------------------------------------------------------------- + // namespace : member_function () + // --------------------------------------------------------------------------------- + + // abc = namespace:local_func(a, b) | + // namespace:my_func(a, b) + + if (SYNTAX[p + 3] != "(") + ErrorCode("من اجل نداء الدالة ' " + SYNTAX[p + 2] + + " ' يجب اضافه '()' بعد ' " + + SYNTAX[p] + " " + SYNTAX[p + 1] + + " " + SYNTAX[p + 2] + " ' ", + o_tokens); + + std::string FUN_TYPE; + std::string CPP_END; + + FUN_TYPE = L_FUN_TYPE[std::make_pair( + TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; + + if (FUN_TYPE == "عادم") + ErrorCode("الدالة المحلية ' " + SYNTAX[p] + + "()' من نوع عادم, لدى لا يمكن " + "تحويلها إلى " + + OBJECTIF_TYPE, + o_tokens); + + if (OBJECTIF_TYPE == "عدد") { + if (FUN_TYPE == "عدد") { + if (DEBUG) + DEBUG_MESSAGE("[NS'" + SYNTAX[p] + + " ':LOCAL_INT_FUNC'" + + SYNTAX[p + 2] + " '( ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CPP_END = " "; + CPP_CODE.append(" NS_" + ID[SYNTAX[p]] + + "::FUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } else { + ErrorCode("لا يمكن تحويل الدالة المحلية ' " + + SYNTAX[p + 2] + "()' من " + + FUN_TYPE + " إلى عدد ", + o_tokens); + } + } else if (OBJECTIF_TYPE == "نص") { + if (FUN_TYPE == "نص") { + if (DEBUG) + DEBUG_MESSAGE("[NS'" + SYNTAX[p] + + " ':LOCAL_STRING_FUNC'" + + SYNTAX[p + 2] + " '( ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CPP_END = " "; + CPP_CODE.append(" NS_" + ID[SYNTAX[p]] + + "::FUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } else if (FUN_TYPE == "عدد") { + if (DEBUG) + DEBUG_MESSAGE("[NS'" + SYNTAX[p] + + " ':LOCAL_INT_FUNC'" + + SYNTAX[p + 2] + + " '().ToString( ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CPP_END = " ) "; + CPP_CODE.append( + " alifcore_IntToString( OBJ_CLASS_WINDOW_" + + ID[SYNTAX[p]] + "::FUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } else { + ErrorCode("لا يمكن تحويل الدالة المحلية ' " + + SYNTAX[p + 2] + "()' من " + + FUN_TYPE + " إلى نص ", + o_tokens); + } + } else if (OBJECTIF_TYPE == "منطق") { + if (FUN_TYPE == "منطق") { + if (DEBUG) + DEBUG_MESSAGE("[NS'" + SYNTAX[p] + + " ':LOCAL_BOOL_FUNC'" + + SYNTAX[p + 2] + " '( ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Buffer + CPP_END = " "; + CPP_CODE.append(" NS_" + ID[SYNTAX[p]] + + "::FUNCTION_" + + ID[SYNTAX[p + 2]] + "( "); + // *** *** *** *** *** *** + } else { + ErrorCode("لا يمكن تحويل الدالة المحلية ' " + + SYNTAX[p + 2] + "()' من " + + FUN_TYPE + " إلى منطق ", + o_tokens); + } + } else + ErrorCode("علة : نوع المستهدف غير معروف ' " + + OBJECTIF_TYPE + " -> " + + SYNTAX[p + 2] + " ' ", + o_tokens); + + // abc = (p)namespace:local_func(a, b) + x + y + + int TMP_FUN_LONG = p + 4; + int OPEN_PARENTIZE = 0; + + // Get Local Function Args + while (TMP_FUN_LONG <= SYNTAX_LONG) { + if (SYNTAX[TMP_FUN_LONG] == + "(") // مفتوح inside الدالة args : fun( a + + // (b)) + OPEN_PARENTIZE++; + else if (SYNTAX[TMP_FUN_LONG] == ")" && + OPEN_PARENTIZE > + 0) // Close inside الدالة args + OPEN_PARENTIZE--; + else if (SYNTAX[TMP_FUN_LONG] == ")" && + OPEN_PARENTIZE < + 1) // Close final الدالة call + { + if (TMP_FUN_LONG < SYNTAX_LONG) { + // abc = fun( a + (b)) + 123 + // abc = x + (fun(var)) * (fun(var) / + // fun(var, fun(var), var) + // - var) + + if ((SYNTAX[TMP_FUN_LONG + 1] != "+") && + (SYNTAX[TMP_FUN_LONG + 1] != "-") && + (SYNTAX[TMP_FUN_LONG + 1] != "*") && + (SYNTAX[TMP_FUN_LONG + 1] != "/") && + (SYNTAX[TMP_FUN_LONG + 1] != "،") && + (SYNTAX[TMP_FUN_LONG + 1] != ",") && + (SYNTAX[TMP_FUN_LONG + 1] != ")")) { + ErrorCode("نص غير معروف بعد نداء ' " + + SYNTAX[p + 2] + + "()' : ' " + + SYNTAX[TMP_FUN_LONG + 1] + + " ' ", + o_tokens); + } + } else if (TMP_FUN_LONG == SYNTAX_LONG) { + // a = fun( a + (b)) + if (SYNTAX[TMP_FUN_LONG] != ")" || + SYNTAX[SYNTAX_LONG] != + ")") // double check! + ErrorCode("يجب إنهاء نداء الدالة ' " + + SYNTAX[p + 2] + + "()' بالإشارة ')' ", + o_tokens); + } + + break; + } + + TMP_FUN_LONG++; + } + + if (SYNTAX[TMP_FUN_LONG] != ")") // Double check! + ErrorCode("يجب إنهاء نداء الدالة ' " + + SYNTAX[p + 2] + "()' بالإشارة ')' ", + o_tokens); + + std::string TempToken[1024]; + int TempTokenCount = 0; + for (int i = p + 4; i <= TMP_FUN_LONG; i++) { + if (SYNTAX[i] != "") { + TempToken[TempTokenCount] = SYNTAX[i]; + TempTokenCount++; + } + } + + // Check local fun Args : fun (a + c, 2 * (b - 1)) + CPP_CODE.append(CHECK_CALL_FUN_ARG( + false, SYNTAX[p], SYNTAX[p + 2], 0, TheNamespace, + TheFunction, TempToken, (TempTokenCount - 1), + o_tokens)); + + if (DEBUG) DEBUG_MESSAGE(")] \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CODE.append(" ) " + CPP_END + " "); + // *** *** *** *** *** *** + + // Point to last token of full func call + p = TMP_FUN_LONG; + + continue; + } + + // TODO: Add support for local var + // if (L_VAR_IS_SET[...]) <-- abc[namespace][var] = local + // var already set ? + + else + ErrorCode("النافذة ' " + SYNTAX[p] + + " ' لا تحتوي على دالة محليه بإسم ' " + + SYNTAX[p + 2] + " ' ", + o_tokens); + + // Exception! + continue; + } else { + // Exception ! + ErrorCode("يجب اضافه ':' أو '()' بعد ' " + SYNTAX[p] + " " + + SYNTAX[p + 1] + " " + SYNTAX[p + 2] + " ' ", + o_tokens); + } + } else { + // Exception ! + ErrorCode("أمر غير معروف ' " + SYNTAX[p] + + " ', كان من المتوقع أن يكون إسم مجال", + o_tokens); + } + + // Point to last token of full namespace:member. + p = CTR_LAST_TOKEN_NUMBER; + } + + // ----------------------------------- + // ERROR + // ----------------------------------- + + else { + // أو + if (SYNTAX[p] == "او" || SYNTAX[p] == "ٱو" || SYNTAX[p] == "آو" || + SYNTAX[p] == "والا" || SYNTAX[p] == "وإلا" || + SYNTAX[p] == "وألا") { + ErrorCode("بناء الجملة غير مفهوم : ' " + SYNTAX[p] + + " '، هل تقصد ' أو ' ؟ ", + o_tokens); + } else { + if (DEBUG) + DEBUG_MESSAGE("\nTMP_NAMESPACE_OR_CLASS --> '" + + TMP_NAMESPACE_OR_CLASS + "'\n ", + o_tokens); // DEBUG + if (DEBUG) + DEBUG_MESSAGE("TmpFunction --> '" + TmpFunction + "'\n ", + o_tokens); // DEBUG + if (DEBUG) + DEBUG_MESSAGE("SYNTAX[p] --> '" + SYNTAX[p] + "'\n ", + o_tokens); // DEBUG + + ErrorCode("بناء الجملة غير مفهوم : ' " + SYNTAX[p] + " ' ", + o_tokens); + } + } + } + + if (ALIF_PARENTHESIS_STATUS > 0 && !IS_IF_SYNTAX) + ErrorCode("غلق قوس مفقود ')' ", o_tokens); + + IS_IF_SYNTAX = false; + + return CPP_CODE; +} + +// ==================================================== + +std::string CHECK_CALL_FUN_ARG( + bool CALL_FUN_GLOBAL, + std::string CALL_WIN_OR_CLASS, // win1/class1 { fun1(int a) } | win2 { + // fun2{ عدد b; fun1(b) } } ==> win1 + std::string CALL_FUN, // win1 { fun1(int a) } | win2 { fun2{ عدد b; fun1(b) + // } } ==> fun1 + int CALL_IS_CLASS, // 0 = non class, 1 constructor, 2 = الدالة member, ل + // Message when new obj + std::string FROM_WIN_OR_CLASS, // win1 { fun1(int a) } | win2 { fun2{ عدد + // b; fun1(b) } } ==> win2 + std::string FROM_FUN, // win1 { fun1(int a) } | win2 { fun2{ عدد b; fun1(b) + // } } ==> fun2 + std::string SYNTAX[1024], int SYNTAX_LONG, CLASS_TOKEN *o_tokens) { + // SYNTAX[] : 1+1, b*2, ("test" + s) ) + // G_FUN_ARG_TYPE : INT, INT, STRING + + int CURRENT_ARG_NUMBER = 0; + + int p = 0; + std::string ARG[1024]; + int ARG_LONG = 1; + + ARG[0] = "="; + + int CALL_ARG_TOTAL = 0; + + std::string CPP_CODE; + + if (CALL_FUN_GLOBAL) { + // Call Global Fun + + CALL_ARG_TOTAL = G_FUN_ARG_TOTAL[CALL_FUN]; + + // check args + if (CALL_ARG_TOTAL > 0 && SYNTAX_LONG < 1) + ErrorCode("الدالة العامة ' " + CALL_FUN + "()' تأخد " + + IntToString(CALL_ARG_TOTAL) + " خاصية", + o_tokens); + + // الدالة العامة () without args + if (CALL_ARG_TOTAL == 0 && SYNTAX_LONG == 0) return ""; + } else { + // Call Local Fun + + CALL_ARG_TOTAL = + L_FUN_ARG_TOTAL[std::make_pair(CALL_WIN_OR_CLASS, CALL_FUN)]; + + // check args + if (CALL_ARG_TOTAL > 0 && SYNTAX_LONG < 1) + ErrorCode("الدالة المحلية ' " + CALL_FUN + "()' تأخد " + + IntToString(CALL_ARG_TOTAL) + " خاصية", + o_tokens); + + // الدالة المحلية () without args + if (CALL_ARG_TOTAL == 0 && SYNTAX_LONG == 0) return ""; + } + + // الدالة (int a, عدد b) with args + while (p <= SYNTAX_LONG) // using while is bcs need 'if p < + // G_FUN_ARG_TOTAL' بعد while finish + { + // if(DEBUG)DEBUG_MESSAGE("\n --[" + SYNTAX[p] + "|" + + // G_FUN_ARG_TYPE[std::make_pair(CALL_FUN, p)] + "]-- \n", o_tokens); // + // DEBUG + + if (SYNTAX[p] != "," && SYNTAX[p] != "،" && p < SYNTAX_LONG) { + if (DEBUG) + DEBUG_MESSAGE("-[ New ARG: " + SYNTAX[p] + " ]-", + o_tokens); // DEBUG + + ARG[ARG_LONG] = SYNTAX[p]; + ARG_LONG++; + } else { + // if(DEBUG)DEBUG_MESSAGE("-[" + + // CONVERT_STRING_ARRAY_TO_STRING(ARG,ARG_LONG) + "]-", o_tokens); + // // DEBUG ErrorCode("|G_FUN_ARG_TYPE TmpFunction: " + TmpFunction + // + " p : " + // + IntToString(p) + "|", o_tokens ); + + if (ARG_LONG < 2) // الدالة ( , ...) ['0'] =, [1] 'user arg', [2] + // null ل incrumentation + ErrorCode("إحدى الخصائص فارغة", o_tokens); + + if (CALL_FUN_GLOBAL) { + // نداء a الدالة العامة ( ... check ARG n ...) + + // الدالة (a,a,a) ل (a,a) + if ((CURRENT_ARG_NUMBER + 1) > CALL_ARG_TOTAL) + ErrorCode("خصائص أكثر من الازم، الدالة العامة ' " + + CALL_FUN + "()' تأخد فقط " + + IntToString(CALL_ARG_TOTAL) + " خاصية ", + o_tokens); + + // Current خاصية OBJECTIF_TYPE + CPP_CODE.append(CheckForSyntax( + G_FUN_ARG_TYPE[std::make_pair(CALL_FUN, + CURRENT_ARG_NUMBER)], + true, // Accept Using Reference إلى namespace:Controls + true, // Accept Using Reference إلى namespace:Function + true, // Accept Using Reference إلى Global Functions + true, // Accept Using Reference إلى Local Functions + true, // Accept Using Reference إلى Global VAR + true, // Accept Using Reference إلى Local VAR + false, // Accept Convertion من نص إلى Int + true, // Accept Convertion من عدد إلى String + ARG, // SYNTAX[] std::string + (ARG_LONG - 1), // SYNTAX_LONG int + FROM_WIN_OR_CLASS, // TMP_WINDOW_NAME + FROM_FUN, // TMP_FUNCTION_NAME + o_tokens)); + } else { + // نداء a الدالة المحلية ( ... check ARG n ...) + + // الدالة (a,a,a) ل (a,a) + if ((CURRENT_ARG_NUMBER + 1) > CALL_ARG_TOTAL) { + if (CALL_IS_CLASS == 1) // constructor + ErrorCode("خصائص أكثر من ألازم، دالة بناء الصنف ' " + + CALL_WIN_OR_CLASS + " ' تأخد فقط " + + IntToString(CALL_ARG_TOTAL) + " خاصية ", + o_tokens); + else if (CALL_IS_CLASS == 2) // الدالة member + ErrorCode("خصائص أكثر من ألازم، الدالة ' " + CALL_FUN + + " ' المنتمية للصنف ' " + + CALL_WIN_OR_CLASS + " ' تأخد فقط " + + IntToString(CALL_ARG_TOTAL) + " خاصية ", + o_tokens); + else + ErrorCode("خصائص أكثر من ألازم، الدالة ' " + CALL_FUN + + " ' تأخد فقط " + + IntToString(CALL_ARG_TOTAL) + " خاصية ", + o_tokens); + } + + // if(DEBUG)DEBUG_MESSAGE("-[ " + + // CONVERT_STRING_ARRAY_TO_STRING(ARG, ARG_LONG) + " ]-", + // o_tokens); // DEBUG ErrorCode(" Yep! ", o_tokens); + + // Current خاصية OBJECTIF_TYPE + CPP_CODE.append(CheckForSyntax( + L_FUN_ARG_TYPE[std::make_pair(CALL_WIN_OR_CLASS + CALL_FUN, + CURRENT_ARG_NUMBER)], + true, // Accept Using Reference إلى namespace:Controls + true, // Accept Using Reference إلى namespace:Function + true, // Accept Using Reference إلى Global Functions + true, // Accept Using Reference إلى Local Functions + true, // Accept Using Reference إلى Global VAR + true, // Accept Using Reference إلى Local VAR + false, // Accept Convertion من نص إلى Int + true, // Accept Convertion من عدد إلى String + ARG, // SYNTAX[] std::string + (ARG_LONG - 1), // SYNTAX_LONG int + FROM_WIN_OR_CLASS, // TMP_WINDOW_NAME + FROM_FUN, // TMP_FUNCTION_NAME + o_tokens)); + } + + ARG[0] = "="; + ARG_LONG = 1; // Point إلى next arg writed بالإشارة user + CURRENT_ARG_NUMBER++; // Point إلى next يدعى الدالة arg + + if (CURRENT_ARG_NUMBER < CALL_ARG_TOTAL) { + if (DEBUG) DEBUG_MESSAGE(", ", o_tokens); // DEBUG + CPP_CODE.append(" , "); + } + } + + p++; + } + + if (CALL_FUN_GLOBAL) { + // الدالة (a,a,a) ل (a,a) + if (CURRENT_ARG_NUMBER < CALL_ARG_TOTAL) + ErrorCode("خصائص قليلة, الدالة العامة ' " + CALL_FUN + "()' تأخد " + + IntToString(CALL_ARG_TOTAL) + + " خاصية، ثم إنشاء فقط " + + IntToString(CURRENT_ARG_NUMBER) + " خاصية ", + o_tokens); + } else { + // الدالة (a,a,a) ل (a,a) + if (CURRENT_ARG_NUMBER < CALL_ARG_TOTAL) { + if (CALL_IS_CLASS == 1) // constructor + ErrorCode("خصائص قليلة, دالة بناء الصنف ' " + + CALL_WIN_OR_CLASS + "()' تأخد " + + IntToString(CALL_ARG_TOTAL) + + " خاصية، ثم إنشاء فقط " + + IntToString(CURRENT_ARG_NUMBER) + " خاصية ", + o_tokens); + else if (CALL_IS_CLASS == 2) // الدالة member + ErrorCode("خصائص قليلة, الدالة منتمي ' " + CALL_FUN + + " ' داخل الصنف ' " + CALL_WIN_OR_CLASS + + "()' تأخد " + IntToString(CALL_ARG_TOTAL) + + " خاصية، ثم إنشاء فقط " + + IntToString(CURRENT_ARG_NUMBER) + " خاصية ", + o_tokens); + else + ErrorCode("خصائص قليلة, الدالة المحلية ' " + CALL_FUN + + "()' تأخد " + IntToString(CALL_ARG_TOTAL) + + " خاصية، ثم إنشاء فقط " + + IntToString(CURRENT_ARG_NUMBER) + " خاصية ", + o_tokens); + } + } + + return CPP_CODE; +} + +// ==================================================== + +void FINAL_CURRENT_FILE_CODE_CHECKING(CLASS_TOKEN *o_tokens) { + // if(DEBUG)DEBUG_MESSAGE("FINAL_CURRENT_FILE_CODE_CHECKING()... \n", + // o_tokens); // DEBUG + + // Function() + if (IsInsideFunction) + ErrorCode("يجب إغلاق الدالة : " + TheFunction, o_tokens); + + // Namespace() + if (IsInsideNamespace && TheNamespace != "") + ErrorCode("يجب إغلاق النافذة : " + TheNamespace, o_tokens); + + // Class() + if (IsInsideClass) ErrorCode("يجب إغلاق الصنف : " + TheClass, o_tokens); + + // IF + if (ALIF_IF_STATUS > 0) + ErrorCode( + "مازال هناك " + IntToString(ALIF_IF_STATUS) + " شروط مازالت مفتوحه", + o_tokens); + + // WHILE + if (ALIF_LOOP_STATUS > 0) + ErrorCode("مازال هناك " + IntToString(ALIF_LOOP_STATUS) + + " كلما مازالت مفتوحه", + o_tokens); + + // #Alif + if (!ALIF_FLAG_FILE[o_tokens->PATH_FULL_SOURCE]) + ErrorCode( + "يجب الإعلان عن علم ألف اولا، المرجو اضافة ' #ألف ' في الأعلى", + o_tokens); +} + +// ==================================================== + +void FINAL_APPLICATION_CODE_CHECKING(CLASS_TOKEN *o_tokens, bool FIRST_FILE) { + if (FIRST_FILE) { + if (DEBUG) + DEBUG_MESSAGE("FINAL_APPLICATION_CODE_CHECKING()... \n", + o_tokens); // DEBUG + + // #Alif + if (!ALIF_FLAG_FILE[o_tokens->PATH_FULL_SOURCE]) + ErrorCode( + "يجب الإعلان عن علم ألف اولا، المرجو اضافة ' #ألف ' في الأعلى", + o_tokens); + + // Main + if (!script.main.is_set) + ErrorCode( + "يجب إنشاء الدالة الرئيسية، لأنها تعتبر المدخل الرئيسي لهذا " + "التطبيق.", + o_tokens); + } +} + +// Setup ******************************************************** + +#ifdef _WIN32 + +std::string GET_WORKING_PATH_WIN32() { + char working_directory[MAX_PATH + 1]; + GetCurrentDirectoryA(sizeof(working_directory), + working_directory); // **** win32 specific **** + return working_directory; +} + +#elif __APPLE__ + +#include +#define GetCurrentDir getcwd + +#else + +#include +#define GetCurrentDir getcwd + +#endif + +std::string GET_WORKING_PATH() { + // https://msdn.microsoft.com/en-us/library/sf98bd4y.aspx + + char *buffer; + + if ((buffer = GetCurrentDir(NULL, 0)) == NULL) { + return NULL; + } else { + // printf( "%s \nLength: %d\n", buffer, strnlen(buffer) ); + // free(buffer); + + return buffer; + } +} + +std::string GET_PATH_WITHOUT_FILE(std::string PATH) { + // In: /abc/def/test.xx + // Out: /abc/def/ + +#ifdef _WIN32 + int POSITION = PATH.find_last_of("\\/"); +#else + int POSITION = PATH.find_last_of("//"); +#endif + + if (POSITION < 1) // To avoid ABC/DEF/ or Relative Path + { + return ""; + } else { +#ifdef _WIN32 + return PATH.substr(0, PATH.find_last_of("\\/")); +#else + return PATH.substr(0, PATH.find_last_of("//")); +#endif + } +} + +bool is_path(std::string PATH_OR_FILE) { + // 'myfile.x' --> false. + // '/abc/test/myfile.x' --> true. + +#ifdef _WIN32 + int POSITION = PATH_OR_FILE.find_last_of("\\/"); +#else + int POSITION = PATH_OR_FILE.find_last_of("//"); +#endif + + if (POSITION < 1) + return false; + else + return true; +} + +std::string GET_PATH_WITHOUT_LAST_SEPARATION(std::string PATH) { + // In : '/abc/test/folder/' + // Out : '/abc/test/folder' + + std::string Last_Char = PATH.substr(PATH.length() - 1); // PATH.back() + +#ifdef _WIN32 + if (Last_Char == "\\") + return PATH.substr(0, PATH.length() - 1); + else + return PATH; +#else + if (Last_Char == "/") + return PATH.substr(0, PATH.length() - 1); + else + return PATH; +#endif +} + +int Temp_File_Rand() { + srand(time(NULL)); + return rand() % 10 + 1000; +} + +/* +bool CHECK_FOLDER_EXISTE(std::string PATH) +{ + #ifdef _WIN32 + // + #else + struct stat info; + + if( stat( PATH, &info ) != 0 ) + return false; // cannot access + else if( info.st_mode & S_IFDIR ) + return true; // is a directory + else + return false; // is no directory + #endif +} +*/ + +bool CHECK_SETUP() // std::string ARGV_0, std::string OUTPUT) +{ + if (DEBUG) + RANDOM = "0000"; + else + RANDOM = IntToString(Temp_File_Rand()); + +#ifdef _WIN32 + + // ------------------- + // Get Absolute Path + // ------------------- + + TCHAR WIN32_PATH_BUFFER[MAX_PATH]; + + if (!GetModuleFileNameW(NULL, WIN32_PATH_BUFFER, MAX_PATH)) { + ALIF_ERROR( + "Sorry, Can't get Absolut Path from Win API \n" + "Please add the path where 'alif.exe' existe, for example : \n\n" + "alif [source.alif] [output.exe] [logfile.txt] " + "-workpath=C:\\Alif "); + } + + wstring WIN32_PATH_BUFFER_W(&WIN32_PATH_BUFFER[0]); + + // PATH_ABSOLUTE = std::string(WIN32_PATH_BUFFER_W.begin(), + // WIN32_PATH_BUFFER_W.end()); + PATH_ABSOLUTE = ws_to_s(WIN32_PATH_BUFFER_W); + + PATH_ABSOLUTE = PATH_ABSOLUTE.substr(0, PATH_ABSOLUTE.find_last_of("\\/")); + + // ------------------- + // Get Working Path + // ------------------- + + if (PATH_WORKING.empty()) { + PATH_WORKING = GET_WORKING_PATH_WIN32(); + + if (PATH_WORKING == PATH_ABSOLUTE) { + // Tray a seconde solution ! + PATH_WORKING = GET_PATH_WITHOUT_FILE(PATH_FULL_ALIF); + } + } + + // ------------------- + // Get Temp Path + // ------------------- + + // C:\Users\Me\AppData\Local\Temp + + ostringstream TEMP_BUFFER; + TEMP_BUFFER << getenv("Temp"); + PATH_TEMP = TEMP_BUFFER.str(); + + // ------------------- + // Other Path + // ------------------- + + cc_path_full = PATH_ABSOLUTE + "\\gcc\\bin\\x86_64-w64-mingw32-g++.exe"; + PATH_FULL_CPP = PATH_TEMP + "\\alifcompiler_" + RANDOM + ".cpp"; + PATH_FULL_OBJ = PATH_TEMP + "\\alifcompiler_" + RANDOM + ".o"; + PATH_FULL_RC = PATH_TEMP + "\\alifcompiler_" + RANDOM + ".rc"; + PATH_FULL_ICO = PATH_ABSOLUTE + "\\aliflib\\alif.ico"; + + // PATH_FULL_LIB_SETTING = PATH_ABSOLUTE + "\\aliflib\\aliflib.inf"; + +#elif __APPLE__ + + // Mac OS X + + // alif_1.0-1.pkg + // /usr/local/bin/alif + // /Library/Application + // Support/Aliflang/Alif_Compiler/aliflib/aliflib.inf + // /Library/Application + // Support/Aliflang/Alif_Compiler/linux_alif_version.inf + // /Library/Application + // Support/Aliflang/Alif_Compiler/Alif_Arabic_Programming_Language + // /Library/Application Support/Aliflang/Alif_Compiler/alif.icns + // /Library/Application Support/Aliflang/Alif_Compiler/Info.plist + + // alifstudio_1.0-1.pkg + // /Applications/Alif Studio.app + // /Library/Application + // Support/Aliflang/Alif_Studio/linux_alifstudio_version.inf + // /Library/Application Support/Aliflang/Alif_Studio/alifstudio.png + // /Library/Application Support/Aliflang/Alif_Studio/mupdate + + // ------------------- + // Get Absolute Path + // ------------------- + + PATH_ABSOLUTE = XSTR(INSTALL_PREFIX) "/bin"; + + // ------------------- + // Get Working Path + // ------------------- + + if (PATH_WORKING.empty()) { + PATH_WORKING = GET_WORKING_PATH(); + + if (PATH_WORKING == PATH_ABSOLUTE) { + // Tray a seconde solution ! + PATH_WORKING = GET_PATH_WITHOUT_FILE(PATH_FULL_ALIF); + } + } + + // ------------------- + // Get Temp Path + // ------------------- + + PATH_TEMP = getenv("TMPDIR"); + + // ------------------- + // Other Path + // ------------------- + + PATH_FULL_BIN_TMP = PATH_TEMP + "/alifcompiler_bin_" + RANDOM; + + cc_path_full = "clang++"; + PATH_FULL_CPP = PATH_TEMP + "/alifcompiler_" + RANDOM + ".cpp"; + PATH_FULL_OBJ = PATH_TEMP + "/alifcompiler_" + RANDOM + ".o"; + PATH_FULL_RC = ""; + PATH_FULL_ICO = + "/Library/Application Support/Aliflang/Alif_Compiler/alif.icns"; + + PATH_FULL_LIB_SETTING = + "/Library/Application " + "Support/Aliflang/Alif_Compiler/aliflib/aliflib.inf"; + + // PATH_FULL_PLIST = "/Library/Application + // Support/Aliflang/Alif_Compiler/Info.plist"; + +#else + + // Linux + + // aliflang_1.0-1.deb + // /usr/local/bin/alif.bin + // /usr/local/lib/aliflib/aliflib.inf + // /usr/local/share/aliflang/copyright + // /usr/local/share/aliflang/linux_alif_version.inf + // /usr/local/share/aliflang/Alif_Arabic_Programming_Language + + // alifstudio_1.0-1.deb + // /usr/local/bin/alifstudio.bin + // /usr/local/bin/mupdate.bin + // /usr/local/share/alifstudio/copyright + // /usr/local/share/alifstudio/linux_alifstudio_version.inf + // /usr/share/alifstudio/alifstudio.ico + // /usr/share/alifstudio/alifstudio.png + // /usr/share/applications/'Alif Studio' + + // ------------------- + // Get Absolute Path + // ------------------- + + PATH_ABSOLUTE = XSTR(INSTALL_PREFIX) "/bin"; + + // ------------------- + // Get Working Path + // ------------------- + + if (PATH_WORKING.empty()) { + PATH_WORKING = GET_WORKING_PATH(); + + if (PATH_WORKING == PATH_ABSOLUTE) { + // Tray a seconde solution ! + PATH_WORKING = GET_PATH_WITHOUT_FILE(PATH_FULL_ALIF); + } + } + + // ------------------- + // Get Temp Path + // ------------------- + using namespace boost::filesystem; + path path = temp_directory_path() / unique_path(); + create_directories(path); + PATH_TEMP = path.string(); + + // ------------------- + // Other Path + // ------------------- + + cc_path_full = "g++"; + PATH_FULL_CPP = PATH_TEMP + "/alifcompiler_" + RANDOM + ".cpp"; + PATH_FULL_OBJ = PATH_TEMP + "/alifcompiler_" + RANDOM + ".o"; + PATH_FULL_RC = ""; + PATH_FULL_ICO = ""; + + // PATH_FULL_LIB_SETTING = "/usr/local/lib/aliflib/aliflib.inf"; + +#endif + + // TODO: check installation.. + // trim all var.. + // check gcc installation.. return false; + // tray create file to check for errors.. + // if mac, be sure PATH_FULL_BIN end with ".app" + + if (PATH_FULL_BIN == PATH_FULL_LOG) { + ALIF_ERROR("ERROR: The binary file and the log are the same."); + } + + if (PATH_WORKING.empty()) { + ALIF_ERROR("ERROR: Can't get Working Path. \n"); + return false; + } + + // Fix GNU LD Bug. + if (PATH_FULL_BIN.find("Windows") != std::string::npos) { + ALIF_ERROR( + "ERROR: Alif can't run from a path contain the word 'Windows', " + "because of a GNU LD Bug. \nPath: " + + PATH_FULL_BIN + + "\nPlease rename the folder 'Windows' to samthing else and tray " + "again. \n"); + return false; + } + + /* + cout << "PATH_ABSOLUTE : " << PATH_ABSOLUTE << endl; + cout << "PATH_WORKING : " << PATH_WORKING << endl << endl; + cout << "PATH_FULL_ALIF : " << PATH_FULL_ALIF << endl; + cout << "PATH_FULL_BIN : " << PATH_FULL_BIN << endl; + cout << "PATH_FULL_LOG : " << PATH_FULL_LOG << endl << endl; + cout << "cc_path_full : " << cc_path_full << endl; + cout << "PATH_FULL_CPP : " << PATH_FULL_CPP << endl; + cout << "PATH_FULL_OBJ : " << PATH_FULL_OBJ << endl; + cout << "PATH_FULL_RC : " << PATH_FULL_RC << endl; + cout << "PATH_FULL_ICO : " << PATH_FULL_ICO << endl << endl; + #if __APPLE__ + cout << "PATH_FULL_BIN_TMP : " << PATH_FULL_BIN_TMP << endl; + cout << "PATH_FULL_PLIST : " << PATH_FULL_PLIST << endl; + #endif + exit(EXIT_FAILURE); + */ + + return true; +} + +// Generator **************************************************** + +// Alif 3 +std::string code_core; +std::string code_stack; +std::string code; +std::string code_entry_point; + +enum code_t : unsigned short { STACK, CODE, ENTRY_POINT }; + +void code_add(code_t type, std::string c) { + if (type == STACK) code_stack.append(c); + if (type == CODE) code.append(c); + if (type == ENTRY_POINT) code_entry_point.append(c); +} + +// - - - - - - - - - - - - - - - - - - + +// General (Old) +std::string CPP_ID_DECLARATION; +std::string CPP_GLOBAL; +std::string CPP_OBJ_DECLARATION; +// std::string CPP_FUN; +std::string CPP_GLOBAL_FUN; +std::string CPP_CLASS; + +// Namespace +std::map, std::string> + CPP_WINDOW; // [window][option] = value + +// Platformes + +// PC Console +std::string CODE_GENERATOR_GET_PC_CONSOLE() { return ""; } + +// PC GUI + +// ---------------------------------- +// C++ Add Code to the current Function +// ---------------------------------- + +void cpp_AddScript(std::string FUN, std::string NEW_CODE) { + // code.append(NEW_CODE); + + // if (IsInsideClass) + // CPP_CLASS.append(NEW_CODE); + // else + // CPP_GLOBAL_FUN.append(NEW_CODE); + + if (IsInsideClass) { + // Local Class Function + CPP_CLASS.append(NEW_CODE); + } else { + // Local Namespace Function + // Local Namespace Main Function + + if (FUN != "رئيسية") { + // Normal Function + CPP_GLOBAL_FUN.append(NEW_CODE); + } else { + // Main Function + // CBUFER = CPP_WINDOW[std::make_pair(TheNamespace, "LOAD")]; + // CPP_WINDOW[std::make_pair(TheNamespace, "LOAD")] = CBUFER + + // NEW_CODE; + + code_entry_point.append(NEW_CODE); + } + } +} + +// ---------------------------------- +// WinX Load() +// ---------------------------------- + +std::string CG_WINX_LOAD() { + std::string CODE; + std::string BUFFER; + + for (int i = 1; i <= Namespace_Total; i++) { + BUFFER = R"( + + // ======================================================================== + // ------------------------------------------------ + // Namespace X )" + + ID[Namespace_Total_Names[i]] + R"( Load() + // ------------------------------------------------ + + void WINDOW_LOAD_)" + + ID[Namespace_Total_Names[i]] + R"(() + { + )" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "LOAD")] + + R"( + } + // ======================================================================== + + )"; + + CODE.append(BUFFER); + } + + return CODE; +} + +// ---------------------------------- +// Application Destroy() +// ---------------------------------- + +std::string CG_APP_DESTROY() { + std::string CODE; + std::string BUFFER; + + BUFFER = R"( + // ------------------------------------------------ + // Application Destroy + // ------------------------------------------------ + )"; + + CODE.append(BUFFER); + + for (int i = 1; i <= Namespace_Total; i++) { + BUFFER = R"( + // Namespace X )" + + ID[Namespace_Total_Names[i]] + R"( Destroy + // --------- + //#ifdef __APPLE__ + //if (WINDOW_IS_CONSTRUCTION_)" + + ID[Namespace_Total_Names[i]] + R"() OBJ_CLASS_WINDOW_)" + + ID[Namespace_Total_Names[i]] + R"(->EndModal(0); + //#else + if (WINDOW_IS_CONSTRUCTION_)" + + ID[Namespace_Total_Names[i]] + R"() OBJ_CLASS_WINDOW_)" + + ID[Namespace_Total_Names[i]] + R"(->Destroy(); + //#endif + )"; + + CODE.append(BUFFER); + } + + BUFFER = + R"( + // --------- + // Win Main Destroy + // --------- + //#ifdef __APPLE__ + //if (WINDOW_IS_CONSTRUCTION_)" + + ID["رئيسية"] + R"() OBJ_CLASS_WINDOW_)" + ID["رئيسية"] + + R"(->EndModal(0); + //#else + if (WINDOW_IS_CONSTRUCTION_)" + + ID["رئيسية"] + R"() OBJ_CLASS_WINDOW_)" + ID["رئيسية"] + + R"(->Destroy(); + //#endif + // ------------------------------------------------ + )"; + + CODE.append(BUFFER); + + return CODE; +} + +// ---------------------------------- +// Namespace Show () +// ---------------------------------- + +std::string CG_WIN_SHOW(std::string WIN) { + std::string CODE = R"( + // ------------------------------- + // Win Show ()" + + WIN + R"() + // ------------------------------- + if (!WINDOW_IS_CONSTRUCTION_)" + + ID[WIN] + R"() + { + OBJ_CLASS_WINDOW_)" + + ID[WIN] + R"( = new NS_)" + ID[WIN] + R"((); + OBJ_CLASS_WINDOW_)" + + ID[WIN] + R"(->SetLayoutDirection(wxLayout_RightToLeft); + WINDOW_IS_CONSTRUCTION_)" + + ID[WIN] + R"( = true; + } + OBJ_CLASS_WINDOW_)" + + ID[WIN] + R"(->Show(true); + OBJ_CLASS_WINDOW_)" + + ID[WIN] + R"(->SetFocus(); + WINDOW_IS_SHOW_)" + + ID[WIN] + R"( = true; + WINDOW_LOAD_)" + + ID[WIN] + R"((); + // ------------------------------- + )"; + + return CODE; +} + +// ---------------------------------- +// Namespace Center () +// ---------------------------------- + +std::string CG_WIN_CENTER(std::string WIN) { + std::string CODE = R"( + // ------------------------------- + // Win Center ()" + + WIN + R"() + // ------------------------------- + if (WINDOW_IS_CONSTRUCTION_)" + + ID[WIN] + R"() + { + OBJ_CLASS_WINDOW_)" + + ID[WIN] + R"(->Center(); + } + // ------------------------------- + )"; + + return CODE; +} + +// ---------------------------------- +// Namespace Hide () +// ---------------------------------- + +std::string CG_WIN_HIDE(std::string WIN) { + std::string CODE = R"( + // ----------------------------------------------- + // Win Hide + // ----------------------------------------------- + if (WINDOW_IS_SHOW_)" + + ID[WIN] + R"() + { + OBJ_CLASS_WINDOW_)" + + ID[WIN] + R"(->Show(false); + WINDOW_IS_SHOW_)" + + ID[WIN] + R"( = false; + } + // ----------------------------------------------- + )"; + + return CODE; +} + +// ---------------------------------- +// Namespace Destroy () +// ---------------------------------- + +std::string CG_WIN_DESTROY(std::string WIN) { + std::string CODE = + R"( + // ----------------------------------------------- + // Win Destroy + // ----------------------------------------------- + if (WINDOW_IS_CONSTRUCTION_)" + + ID[WIN] + R"() + { + //#ifdef __APPLE__ + //OBJ_CLASS_WINDOW_)" + + ID[WIN] + + R"(->EndModal(0); // Hum, maybe this is only for wxDialog, and not wxFrame ! + //#else + OBJ_CLASS_WINDOW_)" + + ID[WIN] + R"(->Destroy(); + //#endif + WINDOW_IS_CONSTRUCTION_)" + + ID[WIN] + R"( = false; + } + // ----------------------------------------------- + )"; + + return CODE; +} + +// ---------------------------------- +// C++ CODE INITIALIZATION +// ---------------------------------- + +void CG_INITIALIZATION() { + //رئيسية + + SET_C_NAME("رئيسية"); + SET_CONTROL_C_NAME("AlifUIWeb"); + + // x = افصول + // y = ارتوب + CPP_WINDOW[std::make_pair("رئيسية", "نص")] = " (رئيسية) مجال بدون عنوان"; +#ifdef __APPLE__ + CPP_WINDOW[std::make_pair("رئيسية", "افصول")] = "10"; + CPP_WINDOW[std::make_pair("رئيسية", "ارتوب")] = + "25"; // Because the macOS task-bar is on top screen. +#else + CPP_WINDOW[std::make_pair("رئيسية", "افصول")] = "0"; + CPP_WINDOW[std::make_pair("رئيسية", "ارتوب")] = "0"; +#endif + CPP_WINDOW[std::make_pair("رئيسية", "عرض")] = "400"; + CPP_WINDOW[std::make_pair("رئيسية", "ارتفاع")] = "400"; + + CPP_WINDOW[std::make_pair("رئيسية", "شكل")] = + "wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | " + "wxCLIP_CHILDREN"; + // wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | + // wxCLIP_CHILDREN) wxMAXIMIZE_BOX + + Namespace_Total = 0; + Namespace_Total_Names[0] = "رئيسية"; + L_FUN_TYPE[std::make_pair("رئيسية", "رئيسية")] = "عادم"; +} + +// ---------------------------------- +// C++ CODE INITIALIZATION +// ---------------------------------- + +std::string CG_WINX_CODE() { + std::string CODE; + std::string BUFFER; + + for (int i = 1; i <= Namespace_Total; i++) { + BUFFER = + R"( + // ======================================================================== + // Namespace X )" + + ID[Namespace_Total_Names[i]] + R"( + // ======================================================================== + + // -------------------- + // Namespace )" + + ID[Namespace_Total_Names[i]] + R"( Definition + // -------------------- + + class NS_)" + + ID[Namespace_Total_Names[i]] + R"( : public wxFrame + { + public: + void OnClose(wxCloseEvent& event); + NS_)" + + ID[Namespace_Total_Names[i]] + R"( (); + virtual ~NS_)" + + ID[Namespace_Total_Names[i]] + R"((); + + // -------------------- + // Namespace )" + + ID[Namespace_Total_Names[i]] + R"( Functions Declaration + // -------------------- + + // +++++++++ > + )" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], + "FUN_DECLARATION")] + + R"( + // +++++++++ > + + private: + DECLARE_NO_COPY_CLASS(NS_)" + + ID[Namespace_Total_Names[i]] + R"() + DECLARE_EVENT_TABLE() + }; + + NS_)" + + ID[Namespace_Total_Names[i]] + R"( *OBJ_CLASS_WINDOW_)" + + ID[Namespace_Total_Names[i]] + R"(; + NS_)" + + ID[Namespace_Total_Names[i]] + R"(::~NS_)" + + ID[Namespace_Total_Names[i]] + R"((){} + + // -------------------- + // Namespace )" + + ID[Namespace_Total_Names[i]] + R"( Constructor + // -------------------- + + NS_)" + + ID[Namespace_Total_Names[i]] + R"( :: NS_)" + + ID[Namespace_Total_Names[i]] + R"(() : + wxFrame(NULL, ID_WINDOW_)" + + ID[Namespace_Total_Names[i]] + R"(, + (")" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "نص")] + R"("), + wxPoint()" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "افصول")] + + R"(, )" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "ارتوب")] + + R"(), + wxSize()" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "عرض")] + + R"(, )" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "ارتفاع")] + + R"(), )" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "شكل")] + + R"( ) + // wxMAXIMIZE_BOX | wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT | wxRESIZE_BORDER + { + wxPanel *P = new wxPanel(this, wxID_ANY); + + // -------------------- + // )" + + ID[Namespace_Total_Names[i]] + R"( Controls Constructor + // -------------------- + + // +++++++++ > + )" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], + "CTR_CONSTRUCTOR")] + + R"( + // +++++++++ > + + // ------------------------------------------------ + } + + // ------------------------------------------------ + // Namespace Winx Close + // ------------------------------------------------ + + void NS_)" + + ID[Namespace_Total_Names[i]] + R"(::OnClose(wxCloseEvent& event) + { + event.Skip(); + + WINDOW_IS_SHOW_)" + + ID[Namespace_Total_Names[i]] + R"( = false; + WINDOW_IS_CONSTRUCTION_)" + + ID[Namespace_Total_Names[i]] + R"( = false; + + // +++++++++ > + )" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "CLOSE")] + R"( + // +++++++++ > + } + + // ------------------------------------------------ + // Event Table + // ------------------------------------------------ + + BEGIN_EVENT_TABLE(NS_)" + + ID[Namespace_Total_Names[i]] + R"(, wxFrame) + EVT_CLOSE(NS_)" + + ID[Namespace_Total_Names[i]] + R"(::OnClose) + + // +++++++++ > + )" + + CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "EVENT")] + R"( + // +++++++++ > + + END_EVENT_TABLE() + + // ======================================================================== + )"; + + CODE.append(BUFFER); + } + + return CODE; +} + +// ----------------------------------------------------------- +// C++ CODE +// ----------------------------------------------------------- + +// TODO: So, when tray GetValue() of control of destroyed Win +// the app not continue the fucntion... so, solution is be sure +// the windows is constructed before control:GetValue() [ MyControl:نص ] + +// // ------------------------------------------------ +// // Generated by Alif Compiler )" + VERSION + R"( +// // www.aliflang.org +// // ------------------------------------------------ + +std::string CODE_GENERATOR_GET_PC_GUI() { + return R"( + /* + Generated by Alif Compiler v)" + + VERSION + R"( + www.aliflang.org + */ + + // --[ Core ] ------------------------------------- + )" + + code_core + R"( + + // ++++++++++++++++++++++++++++++++++++++++++++++++ + // Alif 2.x + // + // --[ CPP_ID_DECLARATION ]------------------------ + )" + + CPP_ID_DECLARATION + R"( + // --[ CPP_GLOBAL ]-------------------------------- + )" + + CPP_GLOBAL + R"( + // --[ CPP_OBJ_DECLARATION ]----------------------- + )" + + CPP_OBJ_DECLARATION + R"( + // --[ CPP_WINDOW[][FUN_DECLARATION] ]------------- + )" + + CPP_WINDOW[std::make_pair("", "FUN_DECLARATION")] + R"( + // --[ CPP_WINDOW[][LOAD] ]------------------------ + )" + + CPP_WINDOW[std::make_pair("", "LOAD")] + R"( + // --[ CPP_WINDOW[رئيسية][FUN_DECLARATION] ]------ + )" + + CPP_WINDOW[std::make_pair("رئيسية", "FUN_DECLARATION")] + R"( + // --[ CPP_WINDOW[رئيسية][LOAD] ]----------------- + )" + + CPP_WINDOW[std::make_pair("رئيسية", "LOAD")] + R"( + // --[ CPP_CLASS ]--------------------------------- + )" + + CPP_CLASS + R"( + // --[ CPP_FUN ]----------------------------------- + // CPP_FUN + // --[ CPP_GLOBAL_FUN ]---------------------------- + )" + + CPP_GLOBAL_FUN + R"( + // ++++++++++++++++++++++++++++++++++++++++++++++++ + + // --[ Stack ] ------------------------------------ + )" + + code_stack + R"( + + // --[ Code ] ------------------------------------- + )" + + code + R"( + + // --[ Entry point ] ------------------------------ + void _alif_main(){ + + alifcore_initialization(); + + )" + + code_entry_point + R"( + + } + + #ifdef _WIN32 + int wmain(int argc, wchar_t* argv[]) { _alif_main(); return 0;} + int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow) { _alif_main(); return 0;} + #elif __APPLE__ + int main(int argc, char** argv) { _alif_main(); return 0;} + #else + int main(int argc, char** argv) { _alif_main(); return 0;} + #endif + + // ------------------------------------------------ + // Generated by Alif Compiler v)" + + VERSION + R"( + // www.aliflang.org + // ------------------------------------------------ + )"; +} + +// Phone Android +std::string CODE_GENERATOR_GET_PHONE_ANDROID() { return ""; } + +// Parser ******************************************************* + +#include "alif_bool.hpp" +#include "alif_class.hpp" +#include "alif_end.hpp" +#include "alif_function.hpp" +#include "alif_function_call.hpp" +#include "alif_function_class.hpp" +#include "alif_if.hpp" +#include "alif_if_else.hpp" +#include "alif_int.hpp" +#include "alif_loop.hpp" +#include "alif_macro.hpp" +#include "alif_namespace.hpp" +#include "alif_next_break.hpp" +#include "alif_obj.hpp" +#include "alif_obj_new.hpp" +#include "alif_operator.hpp" +#include "alif_return.hpp" +#include "alif_string.hpp" +#include "alif_var.hpp" +#include "alif_var_g.hpp" +#include "alif_var_g_class.hpp" + +void ALIF_PARSER(CLASS_TOKEN *o_tokens) { + if (!o_tokens->TOKENS_PREDEFINED) { + // Check for tokens not predifined + + if (ALREADY_PARSED_FILE_TOKENS_NOT_PREDEFINED[o_tokens + ->PATH_FULL_SOURCE]) { + if (DEBUG) + DEBUG_MESSAGE("\n Already Parsed(Not-Predifined) [" + + o_tokens->PATH_FULL_SOURCE + "] \n", + o_tokens); + return; + } else + ALREADY_PARSED_FILE_TOKENS_NOT_PREDEFINED[o_tokens + ->PATH_FULL_SOURCE] = + true; + } else { + // Check for tokens already predifined + + if (ALREADY_PARSED_FILE_TOKENS_PREDEFINED[o_tokens->PATH_FULL_SOURCE]) { + if (DEBUG) + DEBUG_MESSAGE("\n Already Parsed(Predifined) [" + + o_tokens->PATH_FULL_SOURCE + "] \n", + o_tokens); + return; + } else + ALREADY_PARSED_FILE_TOKENS_PREDEFINED[o_tokens->PATH_FULL_SOURCE] = + true; + } + + // For every line + for (o_tokens->Line = 1; o_tokens->Line <= o_tokens->TOTAL_LINES; + o_tokens->Line++) { + // Check total tokens on this current line + if (o_tokens->TOTAL[o_tokens->Line] < 1 || + o_tokens->TOTAL[o_tokens->Line] > 1024) { + // Empty line, or the index is memory-non-allocated + continue; + } + + std::string Token[2048]; + + // Clear TempToken[1024] on every line + // this is for fixing TempToken[p + 1] -> last token from last line! + for (int clear_p = 0; clear_p <= 1023; clear_p++) + TempToken[clear_p] = ""; + + for (o_tokens->NUMBER = 1; + o_tokens->NUMBER <= o_tokens->TOTAL[o_tokens->Line]; + o_tokens->NUMBER++) { + // ----------------------------------------------------------------- + // Line Number : o_tokens->Line + // Token Number : o_tokens->NUMBER + // Token : + // o_tokens->TOKEN[std::make_pair(o_tokens->Line, o_tokens->NUMBER)] + // ----------------------------------------------------------------- + if (o_tokens + ->TOKEN[std::make_pair(o_tokens->Line, o_tokens->NUMBER)] != + "") + Token[o_tokens->NUMBER] = o_tokens->TOKEN[std::make_pair( + o_tokens->Line, o_tokens->NUMBER)]; + } + + if (Token[1] == "") continue; + + if (DEBUG) + DEBUG_MESSAGE(IntToString(o_tokens->Line) + ": ", + o_tokens); // DEBUG + + // ------------------------------------------------------------------------ + + if (Token[1] == "#") { + // Macros + parser_macro_ui(Token, o_tokens); + } + + // --------------------------------------------------------------------------------- + // General Erros + // --------------------------------------------------------------------------------- + + else if (!ALIF_FLAG_FILE[o_tokens->PATH_FULL_SOURCE]) + ErrorCode( + "يجب الإعلان عن علم ألف اولا، المرجو اضافة ' #ألف ' في الأعلى", + o_tokens); + + else if (Token[1] == "خاص" && !IsInsideClass) // ERROR + ErrorCode("يجب استعمال ' خاص ' داخل صنف", o_tokens); + else if (Token[1] == "خاص" && Token[2] == "") + ErrorCode("يجب تحديد نوع المتغير بعد ' خاص ' ", o_tokens); + else if (Token[1] == "خاص" && + (Token[2] != "عدد" && Token[2] != "نص" && Token[2] != "منطق" && + Token[2] != "دالة")) // ERROR + ErrorCode( + "أمر غير معروف : ' " + Token[2] + + " ' ، على العموم أمر ' خاص ' يمكن استعماله فقط مع متغيرات " + "من نوع حرف، عدد، منطق، أو دالة", + o_tokens); + + // --------------------------------------------------------------------------------- + // _س_ ... C++ ... _س_ + // --------------------------------------------------------------------------------- + + else if (Token[1] == "_س_") { + if (!o_tokens->TOKENS_PREDEFINED) continue; + + if (!LIB_INSIDE_CPP_CODE) { + if (DEBUG) DEBUG_MESSAGE("{_س_ START} ", o_tokens); // DEBUG + + LIB_INSIDE_CPP_CODE = true; + LIB_PARSER_CG_BUFER = ""; + + for (int p = 2; p <= o_tokens->TOTAL[o_tokens->Line]; + p++) // _س_ ...C++...@ Alif @...C++... _س_ + { + if (Token[p] == "_س_") // End C++ Code + { + if (DEBUG) + DEBUG_MESSAGE("{_س_ END} ", o_tokens); // DEBUG + LIB_INSIDE_CPP_CODE = false; + + // *** Generate Code *** + if (IsInsideClass) { + // Class Area + CPP_CLASS.append(" " + LIB_PARSER_CG_BUFER + " "); + // code_add(CODE, LIB_PARSER_CG_BUFER); + } else if (!IsInsideNamespace && !IsInsideFunction) { + // Global Area + CPP_GLOBAL.append(" " + LIB_PARSER_CG_BUFER + " "); + // code_add(CODE, LIB_PARSER_CG_BUFER); + } else if (!IsInsideNamespace && IsInsideFunction) { + // Global Function + CPP_GLOBAL_FUN.append(" " + LIB_PARSER_CG_BUFER + + " "); + // code_add(CODE, LIB_PARSER_CG_BUFER); + } else if (IsInsideNamespace && IsInsideFunction) { + // Local Function + cpp_AddScript(TheFunction, + " " + LIB_PARSER_CG_BUFER + " "); + // code_add(CODE, LIB_PARSER_CG_BUFER); + } else { + ErrorCode("علة: لم تنجح عملية ايجاد مكان شفرة سي++", + o_tokens); + } + // *** *** *** *** *** *** + } else if (Token[p] == "@") // @ Start ... + { + // ...C++...@ Alif @...C++... + + if (DEBUG) DEBUG_MESSAGE("{@} ", o_tokens); // DEBUG + + TempTokenCount = 1; // CheckForSyntax() Need this. + TempToken[0] = "="; // CheckForSyntax() Need this. + + bool AT_FOUND = false; + + for (int c = p + 1; c < o_tokens->TOTAL[o_tokens->Line]; + c++) { + if (Token[c] == "@") { + p = c; + AT_FOUND = true; + break; + } + + TempToken[TempTokenCount] = Token[c]; + TempTokenCount++; + } + + if (!AT_FOUND) + ErrorCode("نهايه شفرة سي++ غير موجوده ' @ '", + o_tokens); + + std::string CLASS_OR_WIN; + if (IsInsideClass) + CLASS_OR_WIN = TheClass; + else + CLASS_OR_WIN = TheNamespace; + + ScriptSyntaxBuffer = CheckForSyntax( + "C++", // OBJECTIF_TYPE + true, // Accept Using Reference to + // namespace:Controls + true, // Accept Using Reference to + // namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + true, // Accept Convertion from String To Int + true, // Accept Convertion from Int To String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG int + CLASS_OR_WIN, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (DEBUG) DEBUG_MESSAGE("{@} ", o_tokens); // DEBUG + + // *** C++ *** + LIB_PARSER_CG_BUFER.append(" " + ScriptSyntaxBuffer + + " "); + // *** *** *** *** *** *** + + // @ End. + } else if (Token[p] != "") { + // Add C++ Code to the buffer + LIB_PARSER_CG_BUFER.append(Token[p]); + if (DEBUG) + DEBUG_MESSAGE("{" + Token[p] + "} ", + o_tokens); // DEBUG + } + } + } else { + if (DEBUG) DEBUG_MESSAGE("{_س_ END} ", o_tokens); // DEBUG + LIB_INSIDE_CPP_CODE = false; + } + } + + else if (LIB_INSIDE_CPP_CODE) { + // Continue to adding C++ Code to the Buffer + + for (int p = 1; p <= o_tokens->TOTAL[o_tokens->Line]; + p++) // _س_ ...C++...@ Alif @...C++... _س_ + { + if (Token[p] == "_س_") // End C++ Code + { + if (DEBUG) DEBUG_MESSAGE("{_س_ END} ", o_tokens); // DEBUG + LIB_INSIDE_CPP_CODE = false; + + // if(DEBUG)DEBUG_MESSAGE("\n\n GENERATOR -------> |" + + // LIB_PARSER_CG_BUFER + "| \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + if (IsInsideClass) { + // Class Area + CPP_CLASS.append(" " + LIB_PARSER_CG_BUFER + " "); + // code_add(CODE, LIB_PARSER_CG_BUFER); + } else if (!IsInsideNamespace && !IsInsideFunction) { + // Global Area + CPP_GLOBAL.append(" " + LIB_PARSER_CG_BUFER + " "); + // code_add(CODE, LIB_PARSER_CG_BUFER); + } else if (!IsInsideNamespace && IsInsideFunction) { + // Global Function + CPP_GLOBAL_FUN.append(" " + LIB_PARSER_CG_BUFER + " "); + // code_add(CODE, LIB_PARSER_CG_BUFER); + } else if (IsInsideNamespace && IsInsideFunction) { + // Local Function + cpp_AddScript(TheFunction, + " " + LIB_PARSER_CG_BUFER + " "); + // code_add(CODE, LIB_PARSER_CG_BUFER); + } else { + ErrorCode("علة: لم تنجح عملية ايجاد مكان شفرة سي++", + o_tokens); + } + // *** *** *** *** *** *** + } else if (Token[p] == "@") // @ Start ... + { + // ...C++...@ Alif @...C++... + + if (DEBUG) DEBUG_MESSAGE("{@} ", o_tokens); // DEBUG + + TempTokenCount = 1; // CheckForSyntax() Need this. + TempToken[0] = "="; // CheckForSyntax() Need this. + + bool AT_FOUND = false; + + for (int c = p + 1; c < o_tokens->TOTAL[o_tokens->Line]; + c++) { + if (Token[c] == "@") { + p = c; + AT_FOUND = true; + break; + } + + TempToken[TempTokenCount] = Token[c]; + TempTokenCount++; + } + + if (!AT_FOUND) + ErrorCode("نهايه شفرة سي++ غير موجوده ' @ '", o_tokens); + + std::string CLASS_OR_WIN; + if (IsInsideClass) + CLASS_OR_WIN = TheClass; + else + CLASS_OR_WIN = TheNamespace; + + ScriptSyntaxBuffer = CheckForSyntax( + "C++", // OBJECTIF_TYPE + true, // Accept Using Reference to namespace:Controls + true, // Accept Using Reference to namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + true, // Accept Convertion from String To Int + true, // Accept Convertion from Int To String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG int + CLASS_OR_WIN, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (DEBUG) DEBUG_MESSAGE("{@} ", o_tokens); // DEBUG + + // *** C++ *** + LIB_PARSER_CG_BUFER.append(" " + ScriptSyntaxBuffer + " "); + // *** *** *** *** *** *** + + // @ End. + } else if (Token[p] != "") { + // Add C++ Code to the buffer + LIB_PARSER_CG_BUFER.append(Token[p]); + if (DEBUG) + DEBUG_MESSAGE("{" + Token[p] + "} ", + o_tokens); // DEBUG + } + } + } + + else if (Token[1] == "@") { + if (!LIB_INSIDE_CPP_CODE) + ErrorCode("يجب تحديد ' _س_ ' قبل ' @ '", o_tokens); + + ErrorCode("لا يمكن بدء السطر بالإشارة ' @ '", o_tokens); + } + + // --------------------------------------------------------------------------------- + + // else if (Token[1] == "أداة"){ + // parser_Control(Token, o_tokens); + // } + + else if (Token[1] == "مجال") { + // parser_NewWindow(Token, o_tokens); + parser_new_namespace(Token, o_tokens); + } + + /* + else if (Token[1] == "عدد" || + Token[1] == "نص" || + Token[1] == "منطق" || + Token[1] == "منطق" || + Token[1] == "خاص" || + Token[1] == "ثابت") + CheckForNewVar(Token, o_tokens); + */ + + else if (Token[1] == "عدد" || + (Token[1] == "خاص" && Token[2] == "عدد")) { + parser_Int(Token, o_tokens); + } + + else if (Token[1] == "نص" || (Token[1] == "خاص" && Token[2] == "نص")) { + parser_String(Token, o_tokens); + } + + else if (Token[1] == "منطق" || + (Token[1] == "خاص" && Token[2] == "منطق")) { + parser_bool(Token, o_tokens); + } + + else if (Token[1] == "صنف") { + parser_Class(Token, o_tokens); + } + + else if ((Token[1] == "دالة" && IsInsideClass) || + (Token[1] == "خاص" && Token[2] == "دالة" && IsInsideClass)) { + parser_FunctionClass(Token, o_tokens); + } + + else if (Token[1] == "دالة") { + parser_Function(Token, o_tokens); + } + + else if (Token[1] == "إذا" || Token[1] == "أو") { + parser_IfOr(Token, o_tokens); + } + + else if (Token[1] == "وإلا") { + parser_IfElse(Token, o_tokens); + } + + else if (Token[1] == "كلما") { + parser_While(Token, o_tokens); + } + + else if (Token[1] == "التالي" || Token[1] == "كسر") { + parser_NextBreak(Token, o_tokens); + } + + else if (Token[1] == "إرجاع") { + parser_Return(Token, o_tokens); + } + + else if (Token[1] == "كائن" || CLASS_IS_SET[Token[1]]) { + parser_ObjNew(Token, o_tokens); + } + + else if (OBJ_IS_SET[std::make_pair( + TheNamespace + TheFunction, + Token[1])] || // Namespace -> Func. Local Obj. + OBJ_IS_SET[std::make_pair( + TheClass + TheFunction, + Token[1])] || // Class -> Func. Local Obj. + OBJ_IS_SET[std::make_pair(TheClass, + Token[1])] || // Class. + // Global Class Obj. + OBJ_IS_SET[std::make_pair( + "", + Token[1])]) { // Global Area. Global Obj. + parser_Obj(Token, o_tokens); + } + + else if (L_VAR_IS_SET[std::make_pair(TheNamespace + TheFunction, + Token[1])] || + L_VAR_IS_SET[std::make_pair(TheClass + TheFunction, + Token[1])]) { + parser_Var(Token, o_tokens); + } + + else if (CLASS_G_VAR_IS_SET[std::make_pair(TheClass, Token[1])] && + IsInsideClass) { + parser_VarGlobalClass(Token, o_tokens); + } + + else if (substr_utf8(Token[1], 0, 1) == "_" || + G_VAR_IS_SET[(Token[1])]) { + parser_VarGlobal(Token, o_tokens); + } + + // Call function (Global / Local / Class-fun) + + else if (G_FUN_IS_SET[(Token[1])] || + L_FUN_IS_SET[std::make_pair(TheNamespace, Token[1])] || + CLASS_FUN_IS_SET[std::make_pair(TheClass, Token[1])]) { + parser_FunctionCall(Token, o_tokens); + } + + else if ( // CONTROL_WIN_IS_SET[Token[1]] || + namespace_is_set + [Token[1]] // || + // CONTROL_IS_SET[std::make_pair(TheNamespace, + // Token[1])] || + //(Token[1] == "رئيسية" && + // MAIN_WIN_IS_SET) + ) { + parser_TwoPointOperator(Token, o_tokens); + } + + else if (Token[1] == "نهاية") { + parser_End(Token, o_tokens); + } + + // ####################################################### + + else { + if (!o_tokens->TOKENS_PREDEFINED) { + if (Control_ID[Token[1]] != "") { + // show error description + // when, (no-win) CTR:OPTION + // in global area. + + ErrorCode("أمر غير معروف : ' " + Token[1] + + " '، على العموم، إن كنت تقصد أداة، لا تنسى " + "أن تحدد إسم " + "النافذة قبل إسم الأداة ", + o_tokens); + } + // مجال + else if (Token[1] == "مجال" || Token[1] == "المجال" || + Token[1] == "النافذة" || Token[1] == "نافدت" || + Token[1] == "نافذت" || Token[1] == "نافذ" || + Token[1] == "نافد") { + ErrorCode("أمر غير معروف : ' " + Token[1] + + " '، هل تقصد ' مجال ' ؟ ", + o_tokens); + } + // نص + else if (Token[1] == "كلمة" || Token[1] == "حروف" || + Token[1] == "الحرف" || Token[1] == "نص" || + Token[1] == "الحروف" || Token[1] == "جملة") { + ErrorCode("أمر غير معروف : ' " + Token[1] + + " '، هل تقصد ' نص ' ؟ ", + o_tokens); + } + // إذا + else if (Token[1] == "ادا" || Token[1] == "إدا" || + Token[1] == "أدا" || Token[1] == "اذا" || + Token[1] == "أذا") { + ErrorCode("أمر غير معروف : ' " + Token[1] + + " '، هل تقصد ' إذا ' ؟ ", + o_tokens); + } + // أو + else if (Token[1] == "او" || Token[1] == "ٱو" || + Token[1] == "آو" || Token[1] == "والا" || + // Token[1] == "وإلا" || + Token[1] == "وألا") { + ErrorCode("أمر غير معروف : ' " + Token[1] + + " '، هل تقصد ' وإلا ' أو تقصد ' أو ' ؟ ", + o_tokens); + } + // أداة + else if (Token[1] == "اداة" || Token[1] == "اداه" || + Token[1] == "ادات" || Token[1] == "آداة" || + Token[1] == "آداه" || Token[1] == "آدات" || + Token[1] == "أداه" || Token[1] == "أدات" || + Token[1] == "ٱداة" || Token[1] == "ٱداه" || + Token[1] == "ٱدات") { + ErrorCode("أمر غير معروف : ' " + Token[1] + + " '، هل تقصد ' أداة ' ؟ ", + o_tokens); + } + // أضف + else if (Token[1] == "اضف" || Token[1] == "ٱضف" || + Token[1] == "آضف" || Token[1] == "أظف" || + Token[1] == "اظف" || Token[1] == "ٱظف" || + Token[1] == "آظف" || Token[1] == "إظف" || + Token[1] == "إضف") { + ErrorCode("أمر غير معروف : ' " + Token[1] + + " '، هل تقصد ' #أضف ' ؟ ", + o_tokens); + } + // خاص + else if (Token[1] == "خص" || Token[1] == "حاص" || + Token[1] == "الخاص" || Token[1] == "الحاص") { + ErrorCode("أمر غير معروف : ' " + Token[1] + + " '، هل تقصد ' خاص ' ؟ ", + o_tokens); + } + // إرجاع + else if (Token[1] == "رجوع" || Token[1] == "الرجوع" || + Token[1] == "return" || Token[1] == "أرجاع" || + Token[1] == "ارجاع") { + ErrorCode("أمر غير معروف : ' " + Token[1] + + " '، هل تقصد ' إرجاع ' ؟ ", + o_tokens); + } + + // Yes, Unknow Token.. but meybe the definition + // of this unknown token is in the next lines + // so lets Parse all Tokens first, then re-parse again + } else { + // else + ErrorCode("أمر غير معروف : ' " + Token[1] + " ' ", o_tokens); + } + } + + // ####################################################### + + if (o_tokens->TOKENS_PREDEFINED) + if (DEBUG) DEBUG_MESSAGE("\n\n", o_tokens); + + } // End Line Loop + + // ------------------------- + // Check current file + // if (o_tokens->TOKENS_PREDEFINED) + FINAL_CURRENT_FILE_CODE_CHECKING(o_tokens); + // ------------------------- +} + +// Lexer ******************************************************** + +// ---------------------------------- +// INITIALIZATION +// ---------------------------------- + +void ALIF_VAR_INITIALIZATION_FOR_NEW_SOURCE_FILE(bool FIRST_FILE) { + // ---------------------------------- + // مجال + // ---------------------------------- + + // if (FIRST_FILE) + // { + // MAIN_WIN_IS_SET = false; + // MAIN_WIN_AT_LINE = "0"; + // } + + IsInsideNamespace = false; + TheNamespace = ""; + + // ---------------------------------- + // دالة + // ---------------------------------- + + IsInsideFunction = false; + TheFunction = ""; + + // ---------------------------------- + // PARENTHESIS / IF + // ---------------------------------- + + ALIF_PARENTHESIS_STATUS = 0; + + ALIF_IF_STATUS = 0; + + // ---------------------------------- + // Code + // ---------------------------------- + + ScriptSyntaxBuffer = ""; + ScriptBuffer = ""; +} + +void ADD_TOKEN(std::string TOKEN_CHAR, bool NEW_TOKEN, bool NEW_TOKEN_AFTER, + int REAL_CHAR_NUMBER, CLASS_TOKEN *o_tokens) { + if (NEW_TOKEN) { + // New Token + if (o_tokens->TOKEN[std::make_pair( + o_tokens->TOTAL_LINES, + o_tokens->TOTAL[o_tokens->TOTAL_LINES])] != "") { + o_tokens->TOTAL[o_tokens->TOTAL_LINES]++; + } + + if (TOKEN_CHAR != "") { + if (o_tokens->TOTAL[o_tokens->TOTAL_LINES] < 1) { + o_tokens->TOTAL[o_tokens->TOTAL_LINES] = 1; + } + + o_tokens->TOKEN[std::make_pair( + o_tokens->TOTAL_LINES, + o_tokens->TOTAL[o_tokens->TOTAL_LINES])] = TOKEN_CHAR; + + // Set Real Token position in the real line + o_tokens->REAL_TOKEN_POSITION[std::make_pair( + o_tokens->TOTAL_LINES, + o_tokens->TOTAL[o_tokens->TOTAL_LINES])] = + REAL_CHAR_NUMBER + CharCount_utf8(TOKEN_CHAR, o_tokens); + + if (NEW_TOKEN_AFTER && + o_tokens->TOKEN[std::make_pair( + o_tokens->TOTAL_LINES, + o_tokens->TOTAL[o_tokens->TOTAL_LINES])] != "") { + o_tokens->TOTAL[o_tokens->TOTAL_LINES]++; + } + } + } else if (TOKEN_CHAR != "") { + // New Char + if (o_tokens->TOTAL[o_tokens->TOTAL_LINES] < 1) { + o_tokens->TOTAL[o_tokens->TOTAL_LINES] = 1; + } + + (o_tokens->TOKEN[std::make_pair( + o_tokens->TOTAL_LINES, o_tokens->TOTAL[o_tokens->TOTAL_LINES])]) + .append(TOKEN_CHAR); + + // Set Real Token position in the real line + o_tokens->REAL_TOKEN_POSITION[std::make_pair( + o_tokens->TOTAL_LINES, o_tokens->TOTAL[o_tokens->TOTAL_LINES])] = + REAL_CHAR_NUMBER + CharCount_utf8(TOKEN_CHAR, o_tokens); + + if (NEW_TOKEN_AFTER && + o_tokens->TOKEN[std::make_pair( + o_tokens->TOTAL_LINES, + o_tokens->TOTAL[o_tokens->TOTAL_LINES])] != "") { + o_tokens->TOTAL[o_tokens->TOTAL_LINES]++; + } + } +} + +void AlifLexerParser(std::string file, std::string target, bool is_first_file, + bool is_predefined) { + // Alif lexer + + CLASS_TOKEN OBJ_CLASS_TOKEN; + + // ------------------------------------------------------ + // ALIF FILE EXTENTION + // ------------------------------------------------------ + + int POS = file.find_last_of("."); + std::string EXTENTION; + + // Get extention + if (POS > 0) + EXTENTION = file.substr(POS + 1); + else + EXTENTION = ""; + + // check extention + if (EXTENTION == "") { + // #include "file" + // #include "/foo/folder/file" + + if (target == "ALIF") { + if (is_path(file)) + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file + ".alif"; + else + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = + PATH_WORKING + SEPARATION + file + ".alif"; + } else if (target == "ALIFLIB") { + // #lib "file" + // #lib "/foo/folder/file" + +#ifdef _WIN32 + if (is_path(file)) + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file + ".alif"; + else + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = + PATH_ABSOLUTE + "\\aliflib\\" + file + ".alif"; +#elif __APPLE__ + if (is_path(file)) + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file + ".alif"; + else + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = + XSTR(INSTALL_PREFIX) "/lib/aliflib/" + file + ".alif"; +#else + if (is_path(file)) + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file + ".alif"; + else + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = + XSTR(INSTALL_PREFIX) "/lib/aliflib/" + file + ".alif"; +#endif + } else + ErrorCode("علة: نوع ملف غير معروف : ' " + target + " ' ", + &OBJ_CLASS_TOKEN); + } else if (EXTENTION == "alif" || EXTENTION == "ALIF" || + EXTENTION == "ألف") { + // #include "file.alif" + // #include "/foo/folder/file.alif" + + if (target != "ALIF") + ErrorCode("يجب إستعمال #اضف لترجمة هدا الملف : ' " + file + " ' ", + &OBJ_CLASS_TOKEN); + + if (is_path(file)) + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file; + else + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = PATH_WORKING + SEPARATION + file; + } else + ErrorCode("امتداد الملف غير مقبول : ' " + file + " ' ", + &OBJ_CLASS_TOKEN); + + // check file existe + if (!is_file_exists(OBJ_CLASS_TOKEN.PATH_FULL_SOURCE)) { + // Try second path + std::string second_path = argument.input.path; // [/home/folder/] + second_path.append(file); // [test] + + if (is_file_exists(second_path)) { // [/home/folder/test] + + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = second_path; + } else if (is_file_exists(second_path + + ".alif")) { // [/home/folder/test.alif] + + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = second_path + ".alif"; + } else { + // Search in all include path's + bool found = false; + for (auto inc_path : argument.input.includes) { + // std::cout << "Look: |" << inc_path << "| "; + + if (is_file_exists(inc_path + file)) { + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = inc_path + file; + found = true; + break; + } else if (is_file_exists(inc_path + file + ".alif")) { + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = + inc_path + file + ".alif"; + found = true; + break; + } + } + + if (!found) + ErrorCode("ملف غير موجود : ' " + file + " ' ", + &OBJ_CLASS_TOKEN); + } + } + + // if (!is_file_exists(OBJ_CLASS_TOKEN.PATH_FULL_SOURCE)) { + // SHOW_FILE_AND_LINE = false; + // ErrorCode("ملف غير موجود : ' " + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE + " ' + // ", &OBJ_CLASS_TOKEN); + // } + + // ------------------------------------------------------ + // Current File Type + // ------------------------------------------------------ + + OBJ_CLASS_TOKEN.ALIF_SCRIPT_TYPE = target; + + // ------------------------------------------------------ + // ALIF VARIABLES INITIALIZATION + // ------------------------------------------------------ + + // Initialisation + ALIF_VAR_INITIALIZATION_FOR_NEW_SOURCE_FILE(is_first_file); + + // ------------------------------------------------------ + // Log File Start + // ------------------------------------------------------ + + // if(DEBUG)DEBUG_MESSAGE("----------- DEBUGING START ----------- \n", + // &OBJ_CLASS_TOKEN); + + // ------------------------------------------------------ + // Read Source file (UTF8 File name) + // ------------------------------------------------------ + + // if (!is_file_exists(OBJ_CLASS_TOKEN.PATH_FULL_SOURCE)) { + // ALIF_ERROR("ERROR [F001]: Could not open " + + // OBJ_CLASS_TOKEN.PATH_FULL_SOURCE); exit(EXIT_FAILURE); + // } + + boost::nowide::ifstream FILE_STREAM(OBJ_CLASS_TOKEN.PATH_FULL_SOURCE); + + std::string LINE8; + + bool INSIDE_STRING_CPP = false; + + while (getline(FILE_STREAM, LINE8)) { + // ------------------------------------------------------ + // Ignore blank lines + // ------------------------------------------------------ + + if ((LINE8 == "\n") || (LINE8 == "\r") || (LINE8 == "\r\n") || + (LINE8 == "") || (LINE8 == " ")) { + OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES] = 0; + OBJ_CLASS_TOKEN.TOTAL_LINES++; + continue; + } + + // ------------------------------------------------------ + // Remove bad line-break character + // Windows: \r\n + // Linux: \n + // MacOS: \r + // ------------------------------------------------------ + + size_t LINE_FIX_LAST_POS = LINE8.find_last_not_of("\r\n"); + + if (LINE_FIX_LAST_POS != std::string::npos) { + LINE8.substr(0, LINE_FIX_LAST_POS + 1).swap(LINE8); + } + + // ------------------------------------------------------ + // Remove extra spaces + // ------------------------------------------------------ + + LINE8 = REMOVE_DOUBLE_SPACE(LINE8, &OBJ_CLASS_TOKEN); + + if ((LINE8 == "\n") || (LINE8 == "\r") || (LINE8 == "\r\n") || + (LINE8 == "") || (LINE8 == " ")) { + OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES] = 0; + OBJ_CLASS_TOKEN.TOTAL_LINES++; + continue; + } + + // Set Real Line + OBJ_CLASS_TOKEN.REAL_LINE[OBJ_CLASS_TOKEN.TOTAL_LINES] = LINE8; + + // ------------------------------------------------------ + // Char loop + // ------------------------------------------------------ + + int CHAR_NUMBER = 0; + int LINE_CHAR_TOTAL = 0; + std::string Char; + bool INSIDE_STRING = false; + + OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES] = 0; + + LINE_CHAR_TOTAL = CharCount_utf8(LINE8, &OBJ_CLASS_TOKEN); + + while (CHAR_NUMBER < LINE_CHAR_TOTAL) // '<=' is wrong! + { + Char = substr_utf8(LINE8, CHAR_NUMBER, 1); + // --------------------------------------------- + + if (Char == "۰") + Char = "0"; + else if (Char == "۱") + Char = "1"; + else if (Char == "۲") + Char = "2"; + else if (Char == "۳") + Char = "3"; + else if (Char == "۴") + Char = "4"; + else if (Char == "۵") + Char = "5"; + else if (Char == "۶") + Char = "6"; + else if (Char == "۷") + Char = "7"; + else if (Char == "۸") + Char = "8"; + else if (Char == "۹") + Char = "9"; + else if (Char == "“") + Char = "\""; + else if (Char == "”") + Char = "\""; + else if (Char == "‘") + Char = "'"; + + // Comments + // if ( (Char == "\\") && (substr_utf8(LINE8, (CHAR_NUMBER + 1), 1) + // == + // "\\") && !INSIDE_STRING) + if ((CHAR_NUMBER == 0) && !INSIDE_STRING && (Char == "'")) // ' + { + goto NEXT_LINE; + } + + // ------------------------------------------------------------- + + // _س_ + + if ((Char == "_" && + (substr_utf8(LINE8, CHAR_NUMBER + 1, 1) == "س") && + (substr_utf8(LINE8, CHAR_NUMBER + 2, 1) == "_")) || + // (Char == "_" && (substr_utf8(LINE8, CHAR_NUMBER + 1, 1) == + // "ج") && (substr_utf8(LINE8, CHAR_NUMBER + 2, 1) == "_")) || + (Char == "@" && + (substr_utf8(LINE8, CHAR_NUMBER + 1, 1) != "@"))) // Skip '@@' + { + std::string CompletChar = ""; + + if (substr_utf8(LINE8, CHAR_NUMBER + 1, 1) == "س") + CompletChar = "_س_"; + + if (Char != "@") { + CHAR_NUMBER = CHAR_NUMBER + 2; // Point to after : _س_ + } + + if (!INSIDE_STRING_CPP) { + if (Char != "@") { + ADD_TOKEN(CompletChar, true, true, CHAR_NUMBER, + &OBJ_CLASS_TOKEN); + + // if(DEBUG)DEBUG_MESSAGE(" " , + // &OBJ_CLASS_TOKEN); // DEBUG + } else { + ADD_TOKEN("@", true, true, CHAR_NUMBER, + &OBJ_CLASS_TOKEN); + + // if(DEBUG)DEBUG_MESSAGE(" " , + // &OBJ_CLASS_TOKEN); // DEBUG + } + + INSIDE_STRING_CPP = true; + LIB_LEXER_CG_BUFER = ""; + } else { + INSIDE_STRING_CPP = false; + ADD_TOKEN(LIB_LEXER_CG_BUFER, true, true, CHAR_NUMBER, + &OBJ_CLASS_TOKEN); + + if (Char != "@") { + ADD_TOKEN(CompletChar, true, true, CHAR_NUMBER, + &OBJ_CLASS_TOKEN); + + // if(DEBUG)DEBUG_MESSAGE("|" + + // LIB_LEXER_CG_BUFER + "| " , &OBJ_CLASS_TOKEN); // + // DEBUG + } else { + ADD_TOKEN("@", true, true, CHAR_NUMBER, + &OBJ_CLASS_TOKEN); + + // if(DEBUG)DEBUG_MESSAGE("|" + + // LIB_LEXER_CG_BUFER + "| " , &OBJ_CLASS_TOKEN); // + // DEBUG + } + + LIB_LEXER_CG_BUFER = ""; + } + } else if (INSIDE_STRING_CPP) { + // This char is inside quote _س_ + + LIB_LEXER_CG_BUFER.append(Char); + } else if ((Char == "'" && !INSIDE_STRING && !INSIDE_STRING_CPP) || + (Char == "-" && + substr_utf8(LINE8, CHAR_NUMBER + 1, 1) == "-" && + !INSIDE_STRING && !INSIDE_STRING_CPP)) { + goto NEXT_LINE; + } else if ((Char == "\"" && substr_utf8(LINE8, (CHAR_NUMBER - 1), + 1) != "\\") || // [salam"] + (Char == "\"" && substr_utf8(LINE8, (CHAR_NUMBER - 2), + 2) == "\\\\") // [salam\\"] + ) { + // [salam"] -> Yes + // [salam\"] -> No + // [salam\\"] -> Yes + + /* + if (INSIDE_STRING_CPP) + { + // This char is inside quote _س_ ..... _س_ + // Add this char to this current token + ADD_TOKEN("\"", false, false, CHAR_NUMBER, + &OBJ_CLASS_TOKEN); + } + */ + if (INSIDE_STRING) { + // String End + // Add char, and new token after + ADD_TOKEN("\"", false, true, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + INSIDE_STRING = false; + } else { + // String Start + // New token, add char + ADD_TOKEN("\"", true, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + INSIDE_STRING = true; + } + } + /* + else if (Char == "@") + { + if (INSIDE_STRING) + { + // Inside String + // Add char, continue + ADD_TOKEN("@", false, false, CHAR_NUMBER, + &OBJ_CLASS_TOKEN); + } + else + { + // New token, add char + ADD_TOKEN("@", true, true, CHAR_NUMBER, + &OBJ_CLASS_TOKEN); + } + } + */ + else if (INSIDE_STRING) { + // This char is inside quote " " OR _س_ + // Add this char to this current token + ADD_TOKEN(Char, false, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + } else if (Char == " ") // Space + { + // ignore space! + // Point to next token + ADD_TOKEN("", true, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + } else if (Char == "-") // || Char == "+") + { + // If is '-123', must be in the same token + // else, '-', and '123', in different token + + if (IsValidDigit(substr_utf8(LINE8, CHAR_NUMBER + 1, 1), false, + &OBJ_CLASS_TOKEN)) { + // FORCED Point to next token + // if(OBJ_CLASS_TOKEN.TOKEN[std::make_pair(OBJ_CLASS_TOKEN.TOTAL_LINES, + // OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES])] != + // "") + //{ + // OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES]++; + //} + + // Add char '-', next is digit, so no new token + ADD_TOKEN(Char, true, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + } else { + // Add char + // Point to next token + ADD_TOKEN(Char, true, true, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + } + } else if (Char == "@" || // C++ Code + Char == "#" || // Hash + Char == ":" || // Operator + Char == "=" || Char == "+" || + // Char == "-" || + Char == "*" || Char == "&" || // New line + Char == "(" || Char == ")" || Char == "[" || + Char == "]" || Char == "{" || Char == "}" || + Char == "!" || Char == "<" || Char == ">" || + Char == ";" || // To show error ! + Char == "،" || // اشارة ، + Char == ",") { + // Add char + // Point to next token + ADD_TOKEN(Char, true, true, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + } else { + // Add char + ADD_TOKEN(Char, false, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + } + // ====================================================== + CHAR_NUMBER++; + } // End char loop. + + NEXT_LINE: + + if (INSIDE_STRING_CPP) + // ADD_TOKEN("\n", false, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + LIB_LEXER_CG_BUFER.append("\n"); + + OBJ_CLASS_TOKEN.TOTAL_LINES++; + } // End Line loop. + // ------------------------------------------------------ + + if (is_first_file) { + // This is the first file (main.alif) + // this file, need Tokens Predefinetion + + // ------------------------------------------------------ + // Parser - Tokens Predefinetion + // ------------------------------------------------------ + if (DEBUG) + DEBUG_MESSAGE("\n --- TOKENS PREDEFINITION START --- \n", + &OBJ_CLASS_TOKEN); + OBJ_CLASS_TOKEN.TOKENS_PREDEFINED = false; + // Read list of tokens + ALIF_PARSER(&OBJ_CLASS_TOKEN); + if (DEBUG) + DEBUG_MESSAGE("\n --- TOKENS PREDEFINITION END --- \n\n", + &OBJ_CLASS_TOKEN); + + // ------------------------------------------------------ + // Parser - Normal way + // ------------------------------------------------------ + if (DEBUG) + DEBUG_MESSAGE(" ----------- DEBUGING START ----------- \n", + &OBJ_CLASS_TOKEN); + OBJ_CLASS_TOKEN.TOKENS_PREDEFINED = true; + // Read list of tokens + ALIF_PARSER(&OBJ_CLASS_TOKEN); + // Check final application code + FINAL_APPLICATION_CODE_CHECKING(&OBJ_CLASS_TOKEN, is_first_file); + if (DEBUG) + DEBUG_MESSAGE("\n ----------- DEBUGING FINISH ------------- \n", + &OBJ_CLASS_TOKEN); + } else { + // This is a seconde file (mylib.alif) + // so, check if this file need Tokens Predefinetion + + if (!is_predefined) { + // This file did not have any Tokens Predefinetion + // so, lets start one.. + + // ------------------------------------------------------ + // Parser - Tokens Predefinetion + // ------------------------------------------------------ + if (DEBUG) + DEBUG_MESSAGE("\n --- TOKENS PREDEFINITION START --- \n", + &OBJ_CLASS_TOKEN); + OBJ_CLASS_TOKEN.TOKENS_PREDEFINED = false; + // Read list of tokens + ALIF_PARSER(&OBJ_CLASS_TOKEN); + if (DEBUG) + DEBUG_MESSAGE("\n --- TOKENS PREDEFINITION END --- \n\n", + &OBJ_CLASS_TOKEN); + } else { + // This file have already Tokens Predefinetion + // so, lets parse in normal way.. + + // ------------------------------------------------------ + // Parser - Normal way + // ------------------------------------------------------ + if (DEBUG) + DEBUG_MESSAGE(" ----------- DEBUGING START ----------- \n", + &OBJ_CLASS_TOKEN); + OBJ_CLASS_TOKEN.TOKENS_PREDEFINED = true; + // Read list of tokens + ALIF_PARSER(&OBJ_CLASS_TOKEN); + // Check final application code + FINAL_APPLICATION_CODE_CHECKING(&OBJ_CLASS_TOKEN, is_first_file); + if (DEBUG) + DEBUG_MESSAGE("\n ----------- DEBUGING FINISH ------------- \n", + &OBJ_CLASS_TOKEN); + } + } + + FILE_STREAM.close(); +} + +// Compiler ***************************************************** + +#ifdef _WIN32 + +// ------------------------------------------------ +// Alif Compiler For Windows +// ------------------------------------------------ + +void CLEAN() { + if (DEBUG) return; + + std::string CLEAR_CMD; + + if (!THIS_IS_ALIF_C_FILE) { + CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + + RANDOM + "_strip.bat\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean strip Bat temp file. " << + // endl; + } + + CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + + RANDOM + "_strip.log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean strip log temp file. " << + // endl; + } + } + CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + + "_resource.bat\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean resource Bat temp file. " << + // endl; + } + + CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + + "_resource.log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean resource log temp file. " << + // endl; + } + + CLEAR_CMD = std::string("del \"") + PATH_FULL_CPP + std::string("\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean CPP temp file. " << endl; + } + + CLEAR_CMD = std::string("del \"") + PATH_FULL_RC + std::string("\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean RC temp file. " << endl; + } + + CLEAR_CMD = std::string("del \"" + PATH_FULL_RC + ".res\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean compiled RES temp file. " << + // endl; + } + + CLEAR_CMD = std::string("del \"") + PATH_FULL_OBJ + std::string("\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean OBJ temp file. " << endl; + } + + CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + + "_compile.log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean compile log temp file. " << + // endl; + } + + CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + + "_link.log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean link log temp file. " << endl; + } + + CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + + "_compile.bat\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean compile Bat temp file. " << + // endl; + } + + CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + + "_linker.bat\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean link Bat temp file. " << endl; + } +} + +void compile_win64() { + // stringstream GCC_COMPILE_CMD; + // stringstream GCC_RESOURCE_CMD; + // stringstream GCC_LINK_CMD; + + std::string CMD; + + std::string LOG_PATH; + std::string LOG_LINE8; + std::string LOG_LINE8_Buffer; + + // Need file Bach to set Path=... + // for GCC Envirenment. + boost::nowide::ofstream FILE_BATCH; + std::string FILE_BATCH_PATH; + + // Compile: WebUI - TDM (GCC) 9.2 C++17 64Bit - Windows + + // ALIF_ERROR("PATH_FULL_CPP: " + PATH_FULL_CPP); + + // CMD = "@echo off\n" + // "Set PATH=" + PATH_ABSOLUTE + "\\gcc\\bin\n" + // " \"" + cc_path_full + "\" -Wa,-mbig-obj -fvisibility=hidden + // -Wall -O3 -std=gnu++17 -O3 -DNDEBUG -c -o \"" + PATH_FULL_OBJ + "\" " + // " -I\"" + + // PATH_ABSOLUTE + "\\boost\\include\" " " -I\"" + PATH_ABSOLUTE + // + + // "\\aliflib\" " " \"" + PATH_FULL_CPP + "\" " " 2> \"" + // + PATH_TEMP + + // "\\alifcompiler_" + RANDOM + "_compile.log\" "; + + CMD = + "@echo off\n" + "Set PATH=" + + PATH_ABSOLUTE + + "\\gcc\\bin\n" + " \"" + + cc_path_full + "\" -c -o \"" + PATH_FULL_OBJ + + "\" " + " -I\"" + + PATH_ABSOLUTE + + "\\boost\\include\" " + " -I\"" + + PATH_ABSOLUTE + + "\\aliflib\" " + " \"" + + PATH_FULL_CPP + "\" " + Compile_ExtraCompile + " 2> \"" + PATH_TEMP + + "\\alifcompiler_" + RANDOM + "_compile.log\" "; + + if (DEBUG) LogMessage("Compile script (Windows) : " + CMD + " \n"); + + FILE_BATCH_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_compile.bat"; + + FILE_BATCH.open(FILE_BATCH_PATH); + FILE_BATCH << CMD << endl; + FILE_BATCH.close(); + + system(("\"" + FILE_BATCH_PATH + "\"").c_str()); + + // ---------------------- + // Read Log File + // ---------------------- + + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + + LOG_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_compile.log"; + + boost::nowide::ifstream FILE_STREAM_COMPILER(LOG_PATH); + + if (!FILE_STREAM_COMPILER.is_open()) { + ALIF_ERROR("ERROR: Could not open compile log file: " + LOG_PATH); + exit(EXIT_FAILURE); + } + + while (getline(FILE_STREAM_COMPILER, LOG_LINE8)) { + LOG_LINE8_Buffer.append(LOG_LINE8); + } + + FILE_STREAM_COMPILER.close(); + + if (!LOG_LINE8_Buffer.empty()) { + // Error while compiling source code + + if (!DEBUG) + boost::replace_all(LOG_LINE8_Buffer, PATH_FULL_CPP + ":", ""); + + ALIF_ERROR( + "Please report this error to the Alif Community: " + "https://github.com/alifcommunity/compiler/issues \n\nAlif " + "Compiler " + + VERSION + " - Windows\n\nFile : " + PATH_FULL_ALIF + + "\nError: " + LOG_LINE8_Buffer); + exit(EXIT_FAILURE); + } + + // ------------------------------------------------------ + // Resource + // ------------------------------------------------------ + + CMD = + "@echo off\n" + "Set PATH=" + + PATH_ABSOLUTE + + "\\gcc\\bin\n" + //"SLEEP 1 \n" + "\"" + + PATH_ABSOLUTE + + "\\gcc\\bin\\windres.exe\"" + " -J rc -O coff -i \"" + + PATH_FULL_RC + "\" -o \"" + PATH_FULL_RC + + ".res\" --define _UNICODE --define NOPCH 2> \"" + PATH_TEMP + + "\\alifcompiler_" + RANDOM + "_resource.log\""; + + FILE_BATCH_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_resource.bat"; + + FILE_BATCH.open(FILE_BATCH_PATH); + FILE_BATCH << CMD << endl; + FILE_BATCH.close(); + + system(("\"" + FILE_BATCH_PATH + "\"").c_str()); + + // ------------------------------------------------------ + // Link + // ------------------------------------------------------ + + // CMD = "@echo off\n" + // "Set PATH=" + PATH_ABSOLUTE + "\\gcc\\bin\n" + // //"SLEEP 1 \n" + // "\"" + cc_path_full + "\"" + // " -Os -static-libgcc -static-libstdc++ -static -m64 + // -finput-charset=utf-8 -mthreads -o \"" + PATH_FULL_BIN + "\" \"" + + // PATH_FULL_RC + ".res\" \"" + PATH_FULL_OBJ + "\" -L\"" + PATH_ABSOLUTE + + // "\\boost\\lib\" -L\"" + PATH_ABSOLUTE + "\\aliflib\" -lwebui + // -lboost_thread-mgw8-mt-s-x64-1_76 -lboost_date_time-mgw8-mt-s-x64-1_76 + // -lboost_filesystem-mgw8-mt-s-x64-1_76 -lboost_regex-mgw8-mt-s-x64-1_76 + // -lws2_32 -lwsock32 " + // + GUI_CMD + " 2> \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + + // "_link.log\""; + + CMD = + "@echo off\n" + "Set PATH=" + + PATH_ABSOLUTE + + "\\gcc\\bin\n" + //"SLEEP 1 \n" + "\"" + + cc_path_full + "\" -o \"" + PATH_FULL_BIN + "\" \"" + PATH_FULL_RC + + ".res\" \"" + PATH_FULL_OBJ + "\" -L\"" + PATH_ABSOLUTE + + "\\boost\\lib\" -L\"" + PATH_ABSOLUTE + "\\aliflib\" " + + Compile_ExtraLink + " 2> \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + + "_link.log\""; + + if (DEBUG) LogMessage("Link script (Windows) : " + CMD + " \n"); + + FILE_BATCH_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_linker.bat"; + + FILE_BATCH.open(FILE_BATCH_PATH); + FILE_BATCH << CMD << endl; + FILE_BATCH.close(); + + system(("\"" + FILE_BATCH_PATH + "\"").c_str()); + + // Read Log File + // std::string path = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_link.log"; + // boost::replace_all(Buffer, "C:\\Alif\\bin/ld.exe:", ""); + + // ---------------------- + // Read Log File + // ---------------------- + + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + + LOG_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_link.log"; + + boost::nowide::ifstream FILE_STREAM_LINKER(LOG_PATH); + + if (!FILE_STREAM_LINKER.is_open()) { + ALIF_ERROR("ERROR: Could not open linker log file : " + LOG_PATH); + exit(EXIT_FAILURE); + } + + while (getline(FILE_STREAM_LINKER, LOG_LINE8)) { + LOG_LINE8_Buffer.append(LOG_LINE8); + } + + FILE_STREAM_LINKER.close(); + + if (!LOG_LINE8_Buffer.empty()) { + // Error while compiling source code + + boost::replace_all(LOG_LINE8_Buffer, "C:\\Alif\\bin/ld.exe:", ""); + + ALIF_ERROR( + "Please report this error to the Alif Community: " + "https://github.com/alifcommunity/compiler/issues \n\nAlif " + "Compiler " + + VERSION + " - Windows\n\nFile : " + PATH_FULL_ALIF + + "\nError (Linker): " + LOG_LINE8_Buffer + + "\nLinker command (Windows): \n" + CMD); + exit(EXIT_FAILURE); + } + + // ------------------------------------------------------ + // Striping + // ------------------------------------------------------ + + if (!THIS_IS_ALIF_C_FILE) { + CMD = + "@echo off\n" + "Set PATH=" + + PATH_ABSOLUTE + + "\\gcc\\bin\n" + "\"" + + PATH_ABSOLUTE + + "\\gcc\\bin\\strip.exe\"" + " --strip-all \"" + + PATH_FULL_BIN + "\" 2> \"" + PATH_TEMP + "\\alifcompiler_" + + RANDOM + "_strip.log\""; + + FILE_BATCH_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_strip.bat"; + + FILE_BATCH.open(FILE_BATCH_PATH); + FILE_BATCH << CMD << endl; + FILE_BATCH.close(); + + system(("\"" + FILE_BATCH_PATH + "\"").c_str()); + + /* + FILE_BATCH_PATH = PATH_ABSOLUTE + "\\_alif\\tmp\\" + RAND + + "_strip.bat"; FILE_BATCH.open (FILE_BATCH_PATH); + + FILE_BATCH << "@echo off \n\n" + << "Set PATH=" + PATH_ABSOLUTE + + "\\_alif\\bin" + "\n\n" // SET PATH_ABSOLUTE + + << "\"" + PATH_ABSOLUTE + + "\\_alif\\bin\\strip.exe\"" // Strip PATH_ABSOLUTE + << " " // SPACE + << "--strip-all" + << " " // SPACE + << "\"" + PATH_FULL_BIN + "\\" + + PATH_BIN_FILE_NAME // EXE PATH_ABSOLUTE + << ".exe\"" + << " " // SPACE + << "2> \"" << PATH_FULL_CPP << + ".exe.strip.log\" "; // ERRORS OUTPUTE PATH_ABSOLUTE + + //<< " \n\n pause"; // DEBUG + + FILE_BATCH.close(); + */ + + // system(("\"" + FILE_BATCH_PATH + "\"").c_str()); + + //_wsystem(CMD_BATCH.c_str()); + + // Read log (PATH_FULL_CPP.exe.log) if error.. + } + + // ------------------------------------------------------ + // Clean + // ------------------------------------------------------ + + CLEAN(); +} + +#elif __APPLE__ + +// ------------------------------------------------ +// Alif Compiler For Mac OS X +// ------------------------------------------------ + +void CLEAN() { + if (DEBUG) return; + + std::string CLEAR_CMD = + std::string("rm -rf \"") + PATH_FULL_CPP + std::string("\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean CPP temp file. " << endl; + } + + CLEAR_CMD = std::string("rm -rf \"") + PATH_FULL_OBJ + std::string("\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean OBJ temp file. " << endl; + } + + CLEAR_CMD = + std::string("rm -rf \"") + PATH_FULL_CPP + std::string(".log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean compile log temp file. " << + // endl; + } + + CLEAR_CMD = + std::string("rm -rf \"") + PATH_FULL_BIN_TMP + std::string(".log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean link log temp file. " << endl; + } + + CLEAR_CMD = std::string("rm -rf \"") + PATH_FULL_BIN_TMP + + std::string(".strip.log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean strip log temp file. " << endl; + } +} + +// ---------------------------------- + +void COMPILE_MAC_64BIT() // std::string RAND, std::string PATH_FULL_ICO, + // std::string APP_PLIST) +{ + std::string MAC_CMD; + + // ------------------------------------------------------ + // macOS Compile + // SDK 10.12 - CMD 10.11 - Minimum 10.9 + // ------------------------------------------------------ + + // clang++ -mmacosx-version-min=10.9 -m64 -O2 -std=c++11 -c -o + // "alifstudio.o" -D__WXOSX_COCOA__ -Wall -Wundef -Wunused-parameter + // -Wno-ctor-dtor-privacy -Woverloaded-virtual -Wno-deprecated-declarations + // -D_FILE_OFFSET_BITS=64 -DwxDEBUG_LEVEL=0 -I"/Library/Application + // Support/Aliflang/Alif_Lib_WX/lib/wx/include/osx_cocoa-unicode-static-3.1-alif" + // -I"/Library/Application Support/Aliflang/Alif_Lib_WX/include" -fno-common + // "Src/alifstudio.cpp" + + MAC_CMD = "clang++ -mmacosx-version-min=10.9 -m64 -O2 -std=c++11 -c -o " + "\"" + + PATH_FULL_OBJ + + "\" -D__WXOSX_COCOA__ -Wall -Wundef -Wunused-parameter " + "-Wno-ctor-dtor-privacy -Woverloaded-virtual " + "-Wno-deprecated-declarations -D_FILE_OFFSET_BITS=64 " + "-I" XSTR(INSTALL_PREFIX) "/lib/aliflib" // Alif lib path on macOS + " -fno-common \"" + + PATH_FULL_CPP + + "\" " + "2> \"" + + PATH_FULL_CPP + ".log\" "; + + if (system(MAC_CMD.c_str()) != 0) { + cout << endl + << "ERROR [CORE001]: Can't compile generated code. " << endl; + exit(EXIT_FAILURE); + } + + // TODO: Read log for error.. + + // ------------------------------------------------------ + // Resource + // ------------------------------------------------------ + + // Nothing in macOS + // All Resource are inside .app folder + + // ------------------------------------------------------ + // Link + // ------------------------------------------------------ + + std::string GUI_CMD = ""; + + if (APP_TYPE == "PC_GUI") GUI_CMD = " ............. "; + + // clang++ -m64 -mmacosx-version-min=10.9 -o "alifstudio" "alifstudio.o" + // -L"/Library/Application Support/Aliflang/Alif_Lib_WX/lib" -framework + // IOKit -framework Carbon -framework Cocoa -framework AudioToolbox + // -framework System -framework OpenGL -lwx_osx_cocoau_alif_aui-3.1 + // -lwx_osx_cocoau_alif_propgrid-3.1 -lwx_osx_cocoau_alif_adv-3.1 + // -lwx_osx_cocoau_alif_stc-3.1 -lwx_osx_cocoau_alif_core-3.1 + // -lwx_baseu_alif-3.1 -lwxscintilla_alif-3.1 -lwxtiff_alif-3.1 + // -lwxjpeg_alif-3.1 -lwxpng_alif-3.1 -framework WebKit -lwxzlib_alif-3.1 + // -lwxregexu_alif-3.1 -lwxexpat_alif-3.1 -framework IOKit -framework Carbon + // -framework Cocoa -framework AudioToolbox -framework System -framework + // OpenGL -framework Security -lpthread -liconv -framework Security + // -lpthread -liconv + + MAC_CMD = "clang++ -m64 -mmacosx-version-min=10.9 -o \"" + PATH_FULL_BIN_TMP + + "\" \"" + PATH_FULL_OBJ + + "\" " + " -framework IOKit " + "-framework Carbon -framework Cocoa -framework AudioToolbox " + "-framework System -framework OpenGL " + " -L" XSTR(INSTALL_PREFIX) "/lib/aliflib -lwebui_linux_x86_64 " + "-framework WebKit " + "-framework IOKit -framework Carbon " + "-framework Cocoa -framework " + "AudioToolbox -framework System " + "-framework OpenGL -framework " + "Security -lpthread -liconv -framework " + "Security -lpthread -liconv " + " -lboost_filesystem -lboost_iostreams " + "2> \"" + + PATH_FULL_BIN_TMP + ".log\" "; + + if (system(MAC_CMD.c_str()) != 0) { + cout << endl << "ERROR [CORE001]: Can't Link generated code. " << endl; + exit(EXIT_FAILURE); + } + + // ------------------------------------------------------ + // Striping + // ------------------------------------------------------ + + MAC_CMD = "strip \"" + PATH_FULL_BIN_TMP + "\" 2> \"" + PATH_FULL_BIN_TMP + + ".strip.log\" "; + + if (system(MAC_CMD.c_str()) != 0) { + cout << endl << "ERROR [CORE001]: Can't Strip. " << endl; + exit(EXIT_FAILURE); + } + + // ------------------------------------------------------ + // Generate bundle Application + // ------------------------------------------------------ + + if (APP_TYPE == "PC_GUI") { + // SetFile -t APPL MyAlif + + // mkdir -p MyAlif.app + // mkdir -p MyAlif.app/Contents + // mkdir -p MyAlif.app/Contents/MacOS + // mkdir -p MyAlif.app/Contents/Resources + + // cp MyAlif MyAlif.app/Contents/MacOS/alif + + // cp alif.icns MyAlif.app/Contents/Resources/alif.icns + + // cp Info.plist MyAlif.app/Contents/Info.plist + + // touch MyAlif.app + + MAC_CMD = "SetFile -t APPL \"" + PATH_FULL_BIN_TMP + "\" "; + system(MAC_CMD.c_str()); + + MAC_CMD = "mkdir -p \"" + PATH_FULL_BIN + "\" "; + system(MAC_CMD.c_str()); + + MAC_CMD = "mkdir -p \"" + PATH_FULL_BIN + "/Contents\" "; + system(MAC_CMD.c_str()); + + MAC_CMD = "mkdir -p \"" + PATH_FULL_BIN + "/Contents/MacOS\" "; + system(MAC_CMD.c_str()); + + MAC_CMD = "mkdir -p \"" + PATH_FULL_BIN + "/Contents/Resources\" "; + system(MAC_CMD.c_str()); + + MAC_CMD = "cp \"" + PATH_FULL_BIN_TMP + "\" \"" + PATH_FULL_BIN + + "/Contents/MacOS/alif\" "; + system(MAC_CMD.c_str()); + + MAC_CMD = "cp \"" + PATH_FULL_ICO + "\" \"" + PATH_FULL_BIN + + "/Contents/Resources/alif.icns\" "; + system(MAC_CMD.c_str()); + + MAC_CMD = "cp \"" + PATH_FULL_PLIST + "\" \"" + PATH_FULL_BIN + + "/Contents/Info.plist\" "; + system(MAC_CMD.c_str()); + + MAC_CMD = "touch \"" + PATH_FULL_BIN + "\" "; + system(MAC_CMD.c_str()); + + CLEAN(); + } else { + // macOS Console + + MAC_CMD = "cp \"" + PATH_FULL_BIN_TMP + "\" \"" + PATH_FULL_BIN + "\" "; + system(MAC_CMD.c_str()); + } +} + +#else + +// ------------------------------------------------ +// Alif Compiler For Linux +// ------------------------------------------------ - // Set Real Token position in the real line - o_tokens->REAL_TOKEN_POSITION[std::make_pair( - o_tokens->TOTAL_LINES, - o_tokens->TOTAL[o_tokens->TOTAL_LINES])] = - REAL_CHAR_NUMBER + CharCount_utf8(TOKEN_CHAR, o_tokens); +void CLEAN() { + if (DEBUG) return; - if (NEW_TOKEN_AFTER && - o_tokens->TOKEN[std::make_pair( - o_tokens->TOTAL_LINES, - o_tokens->TOTAL[o_tokens->TOTAL_LINES])] != "") { - o_tokens->TOTAL[o_tokens->TOTAL_LINES]++; - } - } - } else if (TOKEN_CHAR != "") { - // New Char - if (o_tokens->TOTAL[o_tokens->TOTAL_LINES] < 1) { - o_tokens->TOTAL[o_tokens->TOTAL_LINES] = 1; - } + std::string CLEAR_CMD = + std::string("rm -rf \"") + PATH_FULL_CPP + std::string("\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean CPP temp file. " << endl; + } - (o_tokens->TOKEN[std::make_pair( - o_tokens->TOTAL_LINES, o_tokens->TOTAL[o_tokens->TOTAL_LINES])]) - .append(TOKEN_CHAR); + CLEAR_CMD = std::string("rm -rf \"") + PATH_FULL_OBJ + std::string("\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean OBJ temp file. " << endl; + } - // Set Real Token position in the real line - o_tokens->REAL_TOKEN_POSITION[std::make_pair( - o_tokens->TOTAL_LINES, o_tokens->TOTAL[o_tokens->TOTAL_LINES])] = - REAL_CHAR_NUMBER + CharCount_utf8(TOKEN_CHAR, o_tokens); + CLEAR_CMD = std::string("rm -rf \"" + PATH_TEMP + "/alifcompiler_" + + RANDOM + "_compile.log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean compile log temp file. " << + // endl; + } - if (NEW_TOKEN_AFTER && - o_tokens->TOKEN[std::make_pair( - o_tokens->TOTAL_LINES, - o_tokens->TOTAL[o_tokens->TOTAL_LINES])] != "") { - o_tokens->TOTAL[o_tokens->TOTAL_LINES]++; - } + CLEAR_CMD = std::string("rm -rf \"" + PATH_TEMP + "/alifcompiler_" + + RANDOM + "_link.log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean link log temp file. " << endl; + } + + CLEAR_CMD = std::string("rm -rf \"" + PATH_TEMP + "/alifcompiler_" + + RANDOM + "_strip.log\" "); + if (system(CLEAR_CMD.c_str()) != 0) { + // cout << endl << "Warning: Can't clean strip log temp file. " << endl; } } -void AlifLexerParser(std::string file, std::string target, bool is_first_file, - bool is_predefined) { - // Alif lexer +void compile_linux64() { + std::string LINUX_CMD; - CLASS_TOKEN OBJ_CLASS_TOKEN; + std::string LOG_PATH; + std::string LOG_LINE8; + std::string LOG_LINE8_Buffer; // ------------------------------------------------------ - // ALIF FILE EXTENTION + // Compile - WX3 Master - GTK2 - x86_64 - Optimized // ------------------------------------------------------ - int POS = file.find_last_of("."); - std::string EXTENTION; + // -std=gnu++17 -m64 -finput-charset=utf-8 -O3 -pthread -DNDEBUG + // -fvisibility=hidden -lfto -fno-fat-lto-objects -DBOOST_ALL_NO_LIB + // -DBOOST_FILESYSTEM_DYN_LINK - // Get extention - if (POS > 0) - EXTENTION = file.substr(POS + 1); - else - EXTENTION = ""; + // LINUX_CMD = "g++ -Wall -std=gnu++17 -m64 -finput-charset=utf-8 -O3 + // -pthread -DNDEBUG -fvisibility=hidden -c -o \"" + PATH_FULL_OBJ + "\" " + // " -I\"/usr/local/include\" " // Standard " + // -I\"/usr/local/lib/aliflib\" " // Alif lib " \"" + + // PATH_FULL_CPP + // + "\" + // " " 2> \"" + PATH_TEMP + "/alifcompiler_" + RANDOM + // + + // "_compile.log\" "; - // check extention - if (EXTENTION == "") { - // #include "file" - // #include "/foo/folder/file" + LINUX_CMD = "g++ -c -o \"" + PATH_FULL_OBJ + "\" \"" + PATH_FULL_CPP + + "\" -I \"" XSTR(INSTALL_PREFIX) "/lib/aliflib\" " + + Compile_ExtraCompile + " 2> \"" + PATH_TEMP + "/alifcompiler_" + + RANDOM + "_compile.log\" "; - if (target == "ALIF") { - if (is_path(file)) - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file + ".alif"; - else - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = - PATH_WORKING + SEPARATION + file + ".alif"; - } else if (target == "ALIFLIB") { - // #lib "file" - // #lib "/foo/folder/file" + if (DEBUG) LogMessage("Compile command (Linux) : " + LINUX_CMD + " \n"); + // std::cout << "\n\n--------------\nCompile: |" << LINUX_CMD << + // "|\n--------------\n"; - #ifdef _WIN32 - if (is_path(file)) - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file + ".alif"; - else - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = - PATH_ABSOLUTE + "\\aliflib\\" + file + ".alif"; - #elif __APPLE__ - if (is_path(file)) - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file + ".alif"; - else - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = - XSTR(INSTALL_PREFIX) "/lib/aliflib/" + file + ".alif"; - #else - if (is_path(file)) - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file + ".alif"; - else - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = - XSTR(INSTALL_PREFIX) "/lib/aliflib/" + file + ".alif"; - #endif - } else - ErrorCode("علة: نوع ملف غير معروف : ' " + target + " ' ", - &OBJ_CLASS_TOKEN); - } else if (EXTENTION == "alif" || EXTENTION == "ALIF" || - EXTENTION == "ألف") { - // #include "file.alif" - // #include "/foo/folder/file.alif" + system(LINUX_CMD.c_str()); - if (target != "ALIF") - ErrorCode("يجب إستعمال #اضف لترجمة هدا الملف : ' " + file + " ' ", - &OBJ_CLASS_TOKEN); + // ---------------------- + // Read Log File + // ---------------------- - if (is_path(file)) - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = file; - else - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = PATH_WORKING + SEPARATION + file; - } else - ErrorCode("امتداد الملف غير مقبول : ' " + file + " ' ", - &OBJ_CLASS_TOKEN); + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - // check file existe - if (!is_file_exists(OBJ_CLASS_TOKEN.PATH_FULL_SOURCE)) { - // Try second path - std::string second_path = argument.input.path; // [/home/folder/] - second_path.append(file); // [test] + LOG_PATH = PATH_TEMP + "/alifcompiler_" + RANDOM + "_compile.log"; - if (is_file_exists(second_path)) { // [/home/folder/test] + boost::nowide::ifstream FILE_STREAM_COMPILER(LOG_PATH); - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = second_path; - } else if (is_file_exists(second_path + - ".alif")) { // [/home/folder/test.alif] + if (!FILE_STREAM_COMPILER.is_open()) { + ALIF_ERROR("ERROR: Could not open compile log file : " + LOG_PATH); + exit(EXIT_FAILURE); + } - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = second_path + ".alif"; - } else { - // Search in all include path's - bool found = false; - for (auto inc_path : argument.input.includes) { - // std::cout << "Look: |" << inc_path << "| "; + while (getline(FILE_STREAM_COMPILER, LOG_LINE8)) { + LOG_LINE8_Buffer.append(LOG_LINE8); + } - if (is_file_exists(inc_path + file)) { - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = inc_path + file; - found = true; - break; - } else if (is_file_exists(inc_path + file + ".alif")) { - OBJ_CLASS_TOKEN.PATH_FULL_SOURCE = - inc_path + file + ".alif"; - found = true; - break; - } - } + FILE_STREAM_COMPILER.close(); - if (!found) - ErrorCode("ملف غير موجود : ' " + file + " ' ", - &OBJ_CLASS_TOKEN); - } - } + if (!LOG_LINE8_Buffer.empty()) { + // Error while compiling source code - // if (!is_file_exists(OBJ_CLASS_TOKEN.PATH_FULL_SOURCE)) { - // SHOW_FILE_AND_LINE = false; - // ErrorCode("ملف غير موجود : ' " + OBJ_CLASS_TOKEN.PATH_FULL_SOURCE + " ' - // ", &OBJ_CLASS_TOKEN); - // } + if (!DEBUG) + boost::replace_all(LOG_LINE8_Buffer, PATH_FULL_CPP + ":", ""); + + ALIF_ERROR( + "Please report this error to the Alif Community: " + "https://github.com/alifcommunity/compiler/issues \n\nAlif " + "Compiler " + + VERSION + " - Linux\n\nFile : " + PATH_FULL_ALIF + + "\nError: " + LOG_LINE8_Buffer + "\nCompile command: " + LINUX_CMD); + exit(EXIT_FAILURE); + } // ------------------------------------------------------ - // Current File Type + // Resource // ------------------------------------------------------ - OBJ_CLASS_TOKEN.ALIF_SCRIPT_TYPE = target; + // ... // ------------------------------------------------------ - // ALIF VARIABLES INITIALIZATION + // Link // ------------------------------------------------------ - // Initialisation - ALIF_VAR_INITIALIZATION_FOR_NEW_SOURCE_FILE(is_first_file); + std::string GUI_CMD = ""; - // ------------------------------------------------------ - // Log File Start - // ------------------------------------------------------ + // if (APP_TYPE == "PC_GUI") + // GUI_CMD = " ............. "; - // if(DEBUG)DEBUG_MESSAGE("----------- DEBUGING START ----------- \n", - // &OBJ_CLASS_TOKEN); + // -L\"/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu" -lpython3.5 - // ------------------------------------------------------ - // Read Source file (UTF8 File name) - // ------------------------------------------------------ + // LINUX_CMD = "g++ -Os -m64 -finput-charset=utf-8 -pthread -o \"" + + // PATH_FULL_BIN + "\" \"" + PATH_FULL_OBJ + "\" " + // "-L\"/usr/local/lib/aliflib\" -lwebui + // -lboost_filesystem"; - // if (!is_file_exists(OBJ_CLASS_TOKEN.PATH_FULL_SOURCE)) { - // ALIF_ERROR("ERROR [F001]: Could not open " + - // OBJ_CLASS_TOKEN.PATH_FULL_SOURCE); AlifExitFailure(); - // } + LINUX_CMD = "g++ -o \"" + PATH_FULL_BIN + "\" \"" + PATH_FULL_OBJ + + "\" -L\"" XSTR(INSTALL_PREFIX) "/lib/aliflib\" " + + Compile_ExtraLink + " "; // TODO: Add 2 > log - boost::nowide::ifstream FILE_STREAM(OBJ_CLASS_TOKEN.PATH_FULL_SOURCE); + if (DEBUG) LogMessage("Link command (Linux) : " + LINUX_CMD + " \n"); - std::string LINE8; + // std::cout << "\n\n--------------\nLink: |" << LINUX_CMD << + // "|\n--------------\n"; + // g++ + // -Os -m64 -finput-charset=utf-8 -pthread -lboost_filesystem -lboost_thread + // -Os -m64 -finput-charset=utf-8 -pthread -lboost_filesystem -lboost_thread + // -L"/usr/local/lib/aliflib" -o "test" "/tmp/alifcompiler_1007.o" - bool INSIDE_STRING_CPP = false; + if (system(LINUX_CMD.c_str()) != 0) { + // cout << endl << "Bug: Can't Link generated code. " << endl; + // exit(EXIT_FAILURE); - while (getline(FILE_STREAM, LINE8)) { - // ------------------------------------------------------ - // Ignore blank lines - // ------------------------------------------------------ + if (DEBUG) cout << endl << "Debuging: " << LINUX_CMD.c_str() << endl; - if ((LINE8 == "\n") || (LINE8 == "\r") || (LINE8 == "\r\n") || - (LINE8 == "") || (LINE8 == " ")) { - OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES] = 0; - OBJ_CLASS_TOKEN.TOTAL_LINES++; - continue; - } + ALIF_ERROR( + "Please report this error to the Alif Community: " + "https://github.com/alifcommunity/compiler/issues \nAlif " + "Compiler " + + VERSION + " - Linux\n\nFile : " + PATH_FULL_ALIF + + "\nError: Linking Librarys error.\nLink command: " + LINUX_CMD); + exit(EXIT_FAILURE); + } - // ------------------------------------------------------ - // Remove bad line-break character - // Windows: \r\n - // Linux: \n - // MacOS: \r - // ------------------------------------------------------ + // ------------------------------------------------------ + // Striping + // ------------------------------------------------------ - size_t LINE_FIX_LAST_POS = LINE8.find_last_not_of("\r\n"); + LINUX_CMD = + " strip --strip-all --strip-unneeded \"" + PATH_FULL_BIN + "\" "; - if (LINE_FIX_LAST_POS != std::string::npos) { - LINE8.substr(0, LINE_FIX_LAST_POS + 1).swap(LINE8); - } + if (system(LINUX_CMD.c_str()) != 0) { + // Striping error.. + } - // ------------------------------------------------------ - // Remove extra spaces - // ------------------------------------------------------ + // ------------------------------------------------------ - LINE8 = REMOVE_DOUBLE_SPACE(LINE8, &OBJ_CLASS_TOKEN); + // Debugging Mode : - if ((LINE8 == "\n") || (LINE8 == "\r") || (LINE8 == "\r\n") || - (LINE8 == "") || (LINE8 == " ")) { - OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES] = 0; - OBJ_CLASS_TOKEN.TOTAL_LINES++; - continue; - } + // gdb -silent -ex 'set logging redirect off' -ex 'printf "\nAlif + // Compiler 1.0 + // - GNU Debugger\n\n"' -ex 'run' -ex 'printf "\nBacktrace : \n"' -ex 'bt' + // -ex 'printf "\nEnd.\n"' -ex 'detach' -ex 'quit' ./AlifStudio > + // AlifDebug.txt - // Set Real Line - OBJ_CLASS_TOKEN.REAL_LINE[OBJ_CLASS_TOKEN.TOTAL_LINES] = LINE8; + CLEAN(); +} - // ------------------------------------------------------ - // Char loop - // ------------------------------------------------------ +#endif - int CHAR_NUMBER = 0; - int LINE_CHAR_TOTAL = 0; - std::string Char; - bool INSIDE_STRING = false; +// Tools ******************************************************** - OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES] = 0; +void set_input_file(std::string file) { + boost::filesystem::path p(file); - LINE_CHAR_TOTAL = CharCount_utf8(LINE8, &OBJ_CLASS_TOKEN); + std::string p_buf = p.parent_path().string(); + if (p_buf.empty()) p_buf = boost::filesystem::current_path().string(); - while (CHAR_NUMBER < LINE_CHAR_TOTAL) // '<=' is wrong! - { - Char = substr_utf8(LINE8, CHAR_NUMBER, 1); - // --------------------------------------------- + argument.input.path = p_buf + settings.os.path_sep; + argument.input.filename = p.stem().string(); + argument.input.extension = p.extension().string(); - if (Char == "۰") - Char = "0"; - else if (Char == "۱") - Char = "1"; - else if (Char == "۲") - Char = "2"; - else if (Char == "۳") - Char = "3"; - else if (Char == "۴") - Char = "4"; - else if (Char == "۵") - Char = "5"; - else if (Char == "۶") - Char = "6"; - else if (Char == "۷") - Char = "7"; - else if (Char == "۸") - Char = "8"; - else if (Char == "۹") - Char = "9"; - else if (Char == "“") - Char = "\""; - else if (Char == "”") - Char = "\""; - else if (Char == "‘") - Char = "'"; + // Check root path + if (argument.input.path == settings.os.path_sep) argument.input.path = ""; - // Comments - // if ( (Char == "\\") && (substr_utf8(LINE8, (CHAR_NUMBER + 1), 1) - // == - // "\\") && !INSIDE_STRING) - if ((CHAR_NUMBER == 0) && !INSIDE_STRING && (Char == "'")) // ' - { - goto NEXT_LINE; - } + // Check input extention + if (argument.input.extension != ".alif") + err("Unsupported file extention.\n" + "Extention: " + + argument.input.extension + + "\n" + "File: " + + argument.input.path + argument.input.filename + + argument.input.extension); - // ------------------------------------------------------------- + argument.input.fullpath = argument.input.path + argument.input.filename + + argument.input.extension; +} - // _س_ +void set_output_file(std::string file) { + boost::filesystem::path p(file); - if ((Char == "_" && - (substr_utf8(LINE8, CHAR_NUMBER + 1, 1) == "س") && - (substr_utf8(LINE8, CHAR_NUMBER + 2, 1) == "_")) || - // (Char == "_" && (substr_utf8(LINE8, CHAR_NUMBER + 1, 1) == - // "ج") && (substr_utf8(LINE8, CHAR_NUMBER + 2, 1) == "_")) || - (Char == "@" && - (substr_utf8(LINE8, CHAR_NUMBER + 1, 1) != "@"))) // Skip '@@' - { - std::string CompletChar = ""; + argument.output.path = p.parent_path().string() + settings.os.path_sep; + argument.output.filename = p.stem().string(); + argument.output.extension = p.extension().string(); + + // Check root path + if (argument.output.path == settings.os.path_sep) argument.output.path = ""; + + // Check output extention + if (argument.output.extension == "") + argument.output.extension = settings.os.exe_ext; + else if (argument.output.extension != settings.os.exe_ext) + err("Unsupported output extention.\n" + "Extention: " + + argument.output.extension + + "\n" + "File: " + + argument.output.path + argument.output.filename + + argument.output.extension); + + argument.output.fullpath = argument.output.path + argument.output.filename + + argument.output.extension; +} - if (substr_utf8(LINE8, CHAR_NUMBER + 1, 1) == "س") - CompletChar = "_س_"; +void set_log_file(std::string file) { + boost::filesystem::path p(file); - if (Char != "@") { - CHAR_NUMBER = CHAR_NUMBER + 2; // Point to after : _س_ - } + argument.log.path = p.parent_path().string() + settings.os.path_sep; + argument.log.filename = p.stem().string(); + argument.log.extension = p.extension().string(); - if (!INSIDE_STRING_CPP) { - if (Char != "@") { - ADD_TOKEN(CompletChar, true, true, CHAR_NUMBER, - &OBJ_CLASS_TOKEN); + // Check root path + if (argument.log.path == settings.os.path_sep) argument.log.path = ""; - // if(DEBUG)DEBUG_MESSAGE(" " , - // &OBJ_CLASS_TOKEN); // DEBUG - } else { - ADD_TOKEN("@", true, true, CHAR_NUMBER, - &OBJ_CLASS_TOKEN); + // Check log extention + // if(argument.log.extension == "") + // argument.log.extension = ".log"; + // if(argument.log.extension == "") + // argument.log.extension = settings.os.exe_ext; + // else if(argument.log.extension != settings.os.exe_ext) + // err("Unsupported log extention.\n" + // "Extention: " + argument.log.extension + "\n" + // "File: " + argument.log.path + + // argument.outplogut.filename + argument.log.extension); - // if(DEBUG)DEBUG_MESSAGE(" " , - // &OBJ_CLASS_TOKEN); // DEBUG - } + // Check log + if (argument.log.filename == "") err("Log file name is empty."); - INSIDE_STRING_CPP = true; - LIB_LEXER_CG_BUFER = ""; - } else { - INSIDE_STRING_CPP = false; - ADD_TOKEN(LIB_LEXER_CG_BUFER, true, true, CHAR_NUMBER, - &OBJ_CLASS_TOKEN); + argument.log.fullpath = + argument.log.path + argument.log.filename + argument.log.extension; - if (Char != "@") { - ADD_TOKEN(CompletChar, true, true, CHAR_NUMBER, - &OBJ_CLASS_TOKEN); + // Empty file + boost::nowide::ofstream ofile(argument.log.fullpath); + if (ofile) { + ofile << ""; + ofile.close(); + } +} - // if(DEBUG)DEBUG_MESSAGE("|" + - // LIB_LEXER_CG_BUFER + "| " , &OBJ_CLASS_TOKEN); // - // DEBUG - } else { - ADD_TOKEN("@", true, true, CHAR_NUMBER, - &OBJ_CLASS_TOKEN); +static const unsigned char base64_table[65] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +unsigned char *_base64_encode(const unsigned char *src, size_t len, + size_t *out_len) { + unsigned char *out, *pos; + const unsigned char *end, *in; + size_t olen; + int line_len; + + olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */ + olen += olen / 72; /* line feeds */ + olen++; /* nul termination */ + if (olen < len) return NULL; /* integer overflow */ + out = (unsigned char *)malloc(olen); + if (out == NULL) return NULL; + + end = src + len; + in = src; + pos = out; + line_len = 0; + while (end - in >= 3) { + *pos++ = base64_table[in[0] >> 2]; + *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)]; + *pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)]; + *pos++ = base64_table[in[2] & 0x3f]; + in += 3; + line_len += 4; + if (line_len >= 72) { + *pos++ = '\n'; + line_len = 0; + } + } - // if(DEBUG)DEBUG_MESSAGE("|" + - // LIB_LEXER_CG_BUFER + "| " , &OBJ_CLASS_TOKEN); // - // DEBUG - } + if (end - in) { + *pos++ = base64_table[in[0] >> 2]; + if (end - in == 1) { + *pos++ = base64_table[(in[0] & 0x03) << 4]; + *pos++ = '='; + } else { + *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)]; + *pos++ = base64_table[(in[1] & 0x0f) << 2]; + } + *pos++ = '='; + line_len += 4; + } - LIB_LEXER_CG_BUFER = ""; - } - } else if (INSIDE_STRING_CPP) { - // This char is inside quote _س_ + if (line_len) *pos++ = '\n'; - LIB_LEXER_CG_BUFER.append(Char); - } else if ((Char == "'" && !INSIDE_STRING && !INSIDE_STRING_CPP) || - (Char == "-" && - substr_utf8(LINE8, CHAR_NUMBER + 1, 1) == "-" && - !INSIDE_STRING && !INSIDE_STRING_CPP)) { - goto NEXT_LINE; - } else if ((Char == "\"" && substr_utf8(LINE8, (CHAR_NUMBER - 1), - 1) != "\\") || // [salam"] - (Char == "\"" && substr_utf8(LINE8, (CHAR_NUMBER - 2), - 2) == "\\\\") // [salam\\"] - ) { - // [salam"] -> Yes - // [salam\"] -> No - // [salam\\"] -> Yes + *pos = '\0'; + if (out_len) *out_len = pos - out; + return out; +} - /* - if (INSIDE_STRING_CPP) - { - // This char is inside quote _س_ ..... _س_ - // Add this char to this current token - ADD_TOKEN("\"", false, false, CHAR_NUMBER, - &OBJ_CLASS_TOKEN); - } - */ - if (INSIDE_STRING) { - // String End - // Add char, and new token after - ADD_TOKEN("\"", false, true, CHAR_NUMBER, &OBJ_CLASS_TOKEN); - INSIDE_STRING = false; - } else { - // String Start - // New token, add char - ADD_TOKEN("\"", true, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); - INSIDE_STRING = true; - } - } - /* - else if (Char == "@") - { - if (INSIDE_STRING) - { - // Inside String - // Add char, continue - ADD_TOKEN("@", false, false, CHAR_NUMBER, - &OBJ_CLASS_TOKEN); - } - else - { - // New token, add char - ADD_TOKEN("@", true, true, CHAR_NUMBER, - &OBJ_CLASS_TOKEN); - } - } - */ - else if (INSIDE_STRING) { - // This char is inside quote " " OR _س_ - // Add this char to this current token - ADD_TOKEN(Char, false, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); - } else if (Char == " ") // Space - { - // ignore space! - // Point to next token - ADD_TOKEN("", true, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); - } else if (Char == "-") // || Char == "+") - { - // If is '-123', must be in the same token - // else, '-', and '123', in different token +unsigned char *_base64_decode(const unsigned char *src, size_t len, + size_t *out_len) { + unsigned char dtable[256], *out, *pos, block[4], tmp; + size_t i, count, olen; + int pad = 0; - if (IsValidDigit(substr_utf8(LINE8, CHAR_NUMBER + 1, 1), false, - &OBJ_CLASS_TOKEN)) { - // FORCED Point to next token - // if(OBJ_CLASS_TOKEN.TOKEN[std::make_pair(OBJ_CLASS_TOKEN.TOTAL_LINES, - // OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES])] != - // "") - //{ - // OBJ_CLASS_TOKEN.TOTAL[OBJ_CLASS_TOKEN.TOTAL_LINES]++; - //} + memset(dtable, 0x80, 256); + for (i = 0; i < sizeof(base64_table) - 1; i++) + dtable[base64_table[i]] = (unsigned char)i; + dtable['='] = 0; - // Add char '-', next is digit, so no new token - ADD_TOKEN(Char, true, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); - } else { - // Add char - // Point to next token - ADD_TOKEN(Char, true, true, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + count = 0; + for (i = 0; i < len; i++) { + if (dtable[src[i]] != 0x80) count++; + } + + if (count == 0 || count % 4) return NULL; + + olen = count / 4 * 3; + pos = out = (unsigned char *)malloc(olen); + if (out == NULL) return NULL; + + count = 0; + for (i = 0; i < len; i++) { + tmp = dtable[src[i]]; + if (tmp == 0x80) continue; + + if (src[i] == '=') pad++; + block[count] = tmp; + count++; + if (count == 4) { + *pos++ = (block[0] << 2) | (block[1] >> 4); + *pos++ = (block[1] << 4) | (block[2] >> 2); + *pos++ = (block[2] << 6) | block[3]; + count = 0; + if (pad) { + if (pad == 1) + pos--; + else if (pad == 2) + pos -= 2; + else { + /* Invalid padding */ + if (out) free(out); + return NULL; } - } else if (Char == "@" || // C++ Code - Char == "#" || // Hash - Char == ":" || // Operator - Char == "=" || Char == "+" || - // Char == "-" || - Char == "*" || Char == "&" || // New line - Char == "(" || Char == ")" || Char == "[" || - Char == "]" || Char == "{" || Char == "}" || - Char == "!" || Char == "<" || Char == ">" || - Char == ";" || // To show error ! - Char == "،" || // اشارة ، - Char == ",") { - // Add char - // Point to next token - ADD_TOKEN(Char, true, true, CHAR_NUMBER, &OBJ_CLASS_TOKEN); - } else { - // Add char - ADD_TOKEN(Char, false, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); + break; } - // ====================================================== - CHAR_NUMBER++; - } // End char loop. + } + } - NEXT_LINE: + *out_len = pos - out; + return out; +} - if (INSIDE_STRING_CPP) - // ADD_TOKEN("\n", false, false, CHAR_NUMBER, &OBJ_CLASS_TOKEN); - LIB_LEXER_CG_BUFER.append("\n"); +std::string base64_encode(std::string data) { + // Encode - OBJ_CLASS_TOKEN.TOTAL_LINES++; - } // End Line loop. - // ------------------------------------------------------ + std::string buf = ""; + size_t len = 0; + unsigned char *pbuf = NULL; - if (is_first_file) { - // This is the first file (main.alif) - // this file, need Tokens Predefinetion + pbuf = _base64_encode((const unsigned char *)data.c_str(), data.length(), + &len); + buf = reinterpret_cast(pbuf); + // alifcore_trim(buf); - // ------------------------------------------------------ - // Parser - Tokens Predefinetion - // ------------------------------------------------------ - if (DEBUG) - DEBUG_MESSAGE("\n --- TOKENS PREDEFINITION START --- \n", - &OBJ_CLASS_TOKEN); - OBJ_CLASS_TOKEN.TOKENS_PREDEFINED = false; - // Read list of tokens - ALIF_PARSER(&OBJ_CLASS_TOKEN); - if (DEBUG) - DEBUG_MESSAGE("\n --- TOKENS PREDEFINITION END ----- \n\n", - &OBJ_CLASS_TOKEN); + // alifcore_free(pbuf); - // ------------------------------------------------------ - // Parser - Normal way - // ------------------------------------------------------ - if (DEBUG) - DEBUG_MESSAGE(" ----------- DEBUGING START ------- \n", - &OBJ_CLASS_TOKEN); - OBJ_CLASS_TOKEN.TOKENS_PREDEFINED = true; - // Read list of tokens - ALIF_PARSER(&OBJ_CLASS_TOKEN); - // Check final application code - FINAL_APPLICATION_CODE_CHECKING(&OBJ_CLASS_TOKEN, is_first_file); - if (DEBUG) - DEBUG_MESSAGE("\n ----------- DEBUGING FINISH ------ \n", - &OBJ_CLASS_TOKEN); - } else { - // This is a seconde file (mylib.alif) - // so, check if this file need Tokens Predefinetion + // std::cout << "Encode: [" << data << "] -> [" << buf << "] (" << len << " + // Bytes) \n"; - if (!is_predefined) { - // This file did not have any Tokens Predefinetion - // so, lets start one.. + return buf; +} - // ------------------------------------------------------ - // Parser - Tokens Predefinetion - // ------------------------------------------------------ - if (DEBUG) - DEBUG_MESSAGE("\n --- TOKENS PREDEFINITION START --- \n", - &OBJ_CLASS_TOKEN); - OBJ_CLASS_TOKEN.TOKENS_PREDEFINED = false; - // Read list of tokens - ALIF_PARSER(&OBJ_CLASS_TOKEN); - if (DEBUG) - DEBUG_MESSAGE("\n --- TOKENS PREDEFINITION END ----- \n\n", - &OBJ_CLASS_TOKEN); - } else { - // This file have already Tokens Predefinetion - // so, lets parse in normal way.. +std::string base64_decode(std::string data) { + // Decode - // ------------------------------------------------------ - // Parser - Normal way - // ------------------------------------------------------ - if (DEBUG) - DEBUG_MESSAGE(" ----------- DEBUGING START ------- \n", - &OBJ_CLASS_TOKEN); - OBJ_CLASS_TOKEN.TOKENS_PREDEFINED = true; - // Read list of tokens - ALIF_PARSER(&OBJ_CLASS_TOKEN); - // Check final application code - FINAL_APPLICATION_CODE_CHECKING(&OBJ_CLASS_TOKEN, is_first_file); - if (DEBUG) - DEBUG_MESSAGE("\n ----------- DEBUGING FINISH ------ \n", - &OBJ_CLASS_TOKEN); - } - } + std::string buf = ""; + size_t len = 0; + unsigned char *pbuf = NULL; - FILE_STREAM.close(); -} + pbuf = _base64_decode((const unsigned char *)data.c_str(), data.length(), + &len); + buf = reinterpret_cast(pbuf); + // alifcore_trim(buf); -// Compiler ***************************************************** -#include "alif_compile.hpp" + // alifcore_free(pbuf); + + // std::cout << "Decode: [" << data << "] -> [" << buf << "] (" << len << " + // Bytes) \n"; + + return buf; +} // Main ********************************************************* +// void alif() { +// // Check Files extention +// if (argument.input.extension != ".alif"){ +// err("Unsupported file extention.\n" +// "Extention: " + argument.input.extension + "\n" +// "File: " + argument.input.fullpath); +// } +// boost::nowide::ifstream ifile(argument.input.fullpath); +// if(!ifile.is_open()) { +// err("Can't open input source file.\n" +// "File: " + argument.input.fullpath); +// } +// std::cout << "--> File opened: "<< argument.input.fullpath << '\n'; +// std::string line; +// while(getline(ifile, line)) { +// std::cout << "Line: " << line << '\n'; +// } +// } + void alif() { // Check Files extention if (argument.input.extension != ".alif") @@ -1324,15 +7723,15 @@ void alif() { err("Please re-install Alif Compiler, or download the latest version " "from " "\n\nwww.aliflang.org"); - AlifExitFailure(); + exit(EXIT_FAILURE); } - // --- Read Core Script -------------------- - #ifdef _WIN32 - std::string core_path = PATH_ABSOLUTE + "\\aliflib\\alifcore.cc"; - #else - std::string core_path = XSTR(INSTALL_PREFIX) "/lib/aliflib/alifcore.cc"; - #endif +// --- Read Core Script -------------------- +#ifdef _WIN32 + std::string core_path = PATH_ABSOLUTE + "\\aliflib\\alifcore.cc"; +#else + std::string core_path = XSTR(INSTALL_PREFIX) "/lib/aliflib/alifcore.cc"; +#endif boost::nowide::ifstream alifcore_if(core_path); stringstream alifcore_ss; alifcore_ss << alifcore_if.rdbuf(); @@ -1342,7 +7741,7 @@ void alif() { "]\nPlease re-install Alif Compiler, or download the latest " "version " "from http://www.aliflang.org"); - AlifExitFailure(); + exit(EXIT_FAILURE); } // Alif Lib Setting (to fix arab file name problem) @@ -1374,39 +7773,39 @@ void alif() { // PARSER : Read list of tokens, Generate a C++ code AlifLexerParser(PATH_FULL_ALIF, "ALIF", true, false); - // Check if App Runing - #ifdef _WIN32 - std::string CLEAR_BIN_CMD = std::string("@echo off & del /s \"") + - PATH_FULL_BIN + std::string("\" >nul 2>&1"); - if (system(CLEAR_BIN_CMD.c_str()) != 0) - cout << endl - << "Warning: Can't execut Windows remove EXE output command" - << endl; - // boost::nowide::remove(PATH_FULL_BIN); - // std::remove(PATH_FULL_BIN); - #elif __APPLE__ - std::string CLEAR_BIN_CMD = std::string("rm -rf \"") + PATH_FULL_BIN + - std::string("\" 2> /dev/null"); - if (system(CLEAR_BIN_CMD.c_str()) != 0) - cout << endl - << "Warning: Can't execut macOS remove App output command" << endl; - #else - std::string CLEAR_BIN_CMD = std::string("rm -f \"") + PATH_FULL_BIN + - std::string("\" 2> /dev/null"); - if (system(CLEAR_BIN_CMD.c_str()) != 0) - cout << endl - << "Warning: Can't execut Linux remove Bin output command" << endl; - #endif +// Check if App Runing +#ifdef _WIN32 + std::string CLEAR_BIN_CMD = std::string("@echo off & del /s \"") + + PATH_FULL_BIN + std::string("\" >nul 2>&1"); + if (system(CLEAR_BIN_CMD.c_str()) != 0) + cout << endl + << "Warning: Can't execut Windows remove EXE output command" + << endl; + // boost::nowide::remove(PATH_FULL_BIN); + // std::remove(PATH_FULL_BIN); +#elif __APPLE__ + std::string CLEAR_BIN_CMD = std::string("rm -rf \"") + PATH_FULL_BIN + + std::string("\" 2> /dev/null"); + if (system(CLEAR_BIN_CMD.c_str()) != 0) + cout << endl + << "Warning: Can't execut macOS remove App output command" << endl; +#else + std::string CLEAR_BIN_CMD = std::string("rm -f \"") + PATH_FULL_BIN + + std::string("\" 2> /dev/null"); + if (system(CLEAR_BIN_CMD.c_str()) != 0) + cout << endl + << "Warning: Can't execut Linux remove Bin output command" << endl; +#endif - #ifdef __APPLE__ - if (is_file_exists(PATH_FULL_BIN + "/Contents/MacOS/alif")) - #else - if (is_file_exists(PATH_FULL_BIN)) - #endif +#ifdef __APPLE__ + if (is_file_exists(PATH_FULL_BIN + "/Contents/MacOS/alif")) +#else + if (is_file_exists(PATH_FULL_BIN)) +#endif { ALIF_ERROR("\nأسف، لم تنجح عملية مسح هدا الملف، جرب غلق التطبيق: " + PATH_FULL_BIN); - AlifExitFailure(); + exit(EXIT_FAILURE); } // Save debug message @@ -1422,7 +7821,7 @@ void alif() { if (SyntaxOnly) return; // This is syntax only checking no compile needed - #ifdef _WIN32 +#ifdef _WIN32 if (!THIS_IS_ALIF_C_FILE) { // Get GENERATED C++ CODE @@ -1433,7 +7832,7 @@ void alif() { if (!FILE_CPP.is_open()) { ALIF_ERROR("ERROR: Could not create CPP temp file. " + PATH_FULL_CPP); - AlifExitFailure(); + exit(EXIT_FAILURE); } FILE_CPP << CODE_GENERATOR_GET_PC_GUI(); @@ -1448,7 +7847,7 @@ void alif() { FILE_RESOURCE.open(PATH_FULL_RC); // .c_str()); if (!FILE_RESOURCE.is_open()) { ALIF_ERROR("ERROR: Could not create RC temp files. "); - AlifExitFailure(); + exit(EXIT_FAILURE); } FILE_RESOURCE << "aaaa ICON \"" + PATH_FULL_ICO + "\""; FILE_RESOURCE.close(); @@ -1456,7 +7855,7 @@ void alif() { // Compile compile_win64(); - #elif __APPLE__ +#elif __APPLE__ // app icon if (!PATH_FULL_ICO.empty()) boost::replace_all(PATH_FULL_ICO, "\\", "\\\\"); @@ -1467,7 +7866,7 @@ void alif() { FILE_CPP.open(PATH_FULL_CPP); // .c_str()); if (!FILE_CPP.is_open()) { ALIF_ERROR("ERROR [F004]: Could not create CPP temp files. "); - AlifExitFailure(); + exit(EXIT_FAILURE); } FILE_CPP << CODE_GENERATOR_GET_PC_GUI(); FILE_CPP.close(); @@ -1476,7 +7875,7 @@ void alif() { // Compile COMPILE_MAC_64BIT(); - #else // Linux +#else // Linux if (!THIS_IS_ALIF_C_FILE) { // GENERATE C++ CODE @@ -1485,7 +7884,7 @@ void alif() { FILE_CPP.open(PATH_FULL_CPP); // .c_str()); if (!FILE_CPP.is_open()) { ALIF_ERROR("ERROR [F004]: Could not create CPP temp files. "); - AlifExitFailure(); + exit(EXIT_FAILURE); } FILE_CPP << CODE_GENERATOR_GET_PC_GUI(); FILE_CPP.close(); @@ -1494,7 +7893,7 @@ void alif() { // Compile compile_linux64(); - #endif +#endif } // Entry point ************************************************** @@ -1508,53 +7907,53 @@ int main(int argc, char **argv) int main(int argc, char **argv) #endif { - #ifdef _WIN32 - // Create and install global locale - std::locale::global(boost::locale::generator().generate("")); - #endif +#ifdef _WIN32 + // Create and install global locale + std::locale::global(boost::locale::generator().generate("")); +#endif - // Make boost.filesystem use it - boost::filesystem::path::imbue(std::locale()); - - try { - // Argument parsing - boost::program_options::options_description desc("Allowed options"); - desc.add_options()("h", "Produce help message")( - "v", "Print compiler version")("debug", - "Add debugging info to the log file")("debug-screen", - "Add debugging info to the log file, And print it on the screen")("syntax-only", "Check only the Alif code syntax (no compile)")("o", boost::program_options::value(), "Set output file")("log", boost::program_options::value(), "Set log file")("log-json", boost::program_options::value(), - "Set log file as JSON format")("log-json-base64", boost::program_options::value(), - "Like 'log-json' but data is base64 encoded")("input", boost::program_options::value>(), - "Set input file (only one)")("include-path,I", boost::program_options::value>(), - "Add include path")("clib,L", boost::program_options::value>(), - "Add extra C/C++ libs"); - - boost::program_options::positional_options_description optional_desc; - optional_desc.add("input", -1); - - boost::program_options::variables_map vm; - #ifdef _WIN32 - boost::program_options::store( - boost::program_options::wcommand_line_parser(argc, argv) - .options(desc) - .positional(optional_desc) - .run(), - vm); - #elif __APPLE__ - boost::program_options::store( - boost::program_options::command_line_parser(argc, argv) - .options(desc) - .positional(optional_desc) - .run(), - vm); - #else - boost::program_options::store( - boost::program_options::command_line_parser(argc, argv) - .options(desc) - .positional(optional_desc) - .run(), - vm); - #endif + // Make boost.filesystem use it + boost::filesystem::path::imbue(std::locale()); + + try { + // Argument parsing + boost::program_options::options_description desc("Allowed options"); + desc.add_options()("h", "Produce help message")( + "v", "Print compiler version")("debug", + "Add debugging info to the log file")("debug-screen", + "Add debugging info to the log file, And print it on the screen")("syntax-only", "Check only the Alif code syntax (no compile)")("o", boost::program_options::value(), "Set output file")("log", boost::program_options::value(), "Set log file")("log-json", boost::program_options::value(), + "Set log file as JSON format")("log-json-base64", boost::program_options::value(), + "Like 'log-json' but data is base64 encoded")("input", boost::program_options::value>(), + "Set input file (only one)")("include-path,I", boost::program_options::value>(), + "Add include path")("clib,L", boost::program_options::value>(), + "Add extra C/C++ libs"); + + boost::program_options::positional_options_description optional_desc; + optional_desc.add("input", -1); + + boost::program_options::variables_map vm; +#ifdef _WIN32 + boost::program_options::store( + boost::program_options::wcommand_line_parser(argc, argv) + .options(desc) + .positional(optional_desc) + .run(), + vm); +#elif __APPLE__ + boost::program_options::store( + boost::program_options::command_line_parser(argc, argv) + .options(desc) + .positional(optional_desc) + .run(), + vm); +#else + boost::program_options::store( + boost::program_options::command_line_parser(argc, argv) + .options(desc) + .positional(optional_desc) + .run(), + vm); +#endif boost::program_options::notify(vm); // Version @@ -1658,11 +8057,9 @@ int main(int argc, char **argv) return 1; } + // Start parsing alif(); - if(AlifFailure) - return EXIT_FAILURE; - // Al Hamdo li ALLAH =) exit(EXIT_SUCCESS); } diff --git a/src/alif_bool.hpp b/src/alif_bool.hpp new file mode 100644 index 00000000..1ae6c657 --- /dev/null +++ b/src/alif_bool.hpp @@ -0,0 +1,389 @@ +/* + The Alif Programming Language + Version 3.x Series + (C)2021 Hassan DRAGA + www.aliflang.org + + This file is part of Alif compiler. + + Alif compiler is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 3, or (at your option) any later + version. + + Alif compiler is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with Alif compiler; see the file COPYING3. If not see + . +*/ + +void parser_bool(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + //منطق + + // bool A = true + + if (!o_tokens->TOKENS_PREDEFINED && IsInsideFunction) + // Ignore Local func bool-var predefinition, + // focus only on Global bool-var predefinition, and Class global bool-var + // predefinition. + return; // continue; + + if (IsInsideNamespace && !IsInsideFunction) + ErrorCode("انشاء متغير منطقي جديد يجب ان يكون خارج المجال ليكون عام، او " + "داخل دالة ليكون محلي", + o_tokens); + + if (Token[1] == "خاص" && !IsInsideClass) + ErrorCode("يجب استعمال خاصيه ' خاص ' داخل صنف", o_tokens); + + if (Token[1] == "خاص" && IsInsideFunction) + ErrorCode("يجب استعمال خاصيه ' خاص ' خارج الدالة", o_tokens); + + int BOOL_POS = 1; + + if (Token[1] == "خاص") + BOOL_POS = 2; + + if (Token[BOOL_POS + 1] == "") + ErrorCode("يجب تحديد اسم المتغير المنطقي", o_tokens); + + if (Token[BOOL_POS + 2] != "" && Token[BOOL_POS + 2] != "=") + ErrorCode("يجب استعمال ' = ' بعد اسم المتغير المنطقي", o_tokens); + + if (Token[BOOL_POS + 2] == "=" && Token[BOOL_POS + 3] == "") + ErrorCode("يجب اعطاء قيمة بعد ' = '", o_tokens); + + // Class + if (IsInsideClass) + { + if (!IsInsideFunction) + { + // global class bool-var Bool + + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + SetNewVarClass(true, true, TheClass, TheFunction, Token[BOOL_POS + 1], + "منطق", false, false, o_tokens->Line, o_tokens); + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-GLOBAL-BOOL] [" + + Token[BOOL_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class : New Private Bool + CPP_CLASS.append(" private: bool " + Global_ID[Token[BOOL_POS + 1]] + + " "); + if (Token[BOOL_POS + 2] == "") + { + CPP_CLASS.append(" = false; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + SetNewVarClass(true, false, TheClass, TheFunction, + Token[BOOL_POS + 1], "منطق", false, false, + o_tokens->Line, o_tokens); + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-GLOBAL-BOOL] [" + Token[BOOL_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class : New Public Bool + CPP_CLASS.append(" public: bool " + Global_ID[Token[BOOL_POS + 1]] + + " "); + if (Token[BOOL_POS + 2] == "") + { + CPP_CLASS.append(" = false; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + } + else + { + // local Bool class + + if (Token[1] == "خاص") + { + ErrorCode("يجب استعمال خاصيه ' خاص ' خارج الدالة", o_tokens); + } + else + { + // if (!o_tokens->TOKENS_PREDEFINED) + //{ + SetNewVarClass(false, false, TheClass, TheFunction, Token[BOOL_POS + 1], + "منطق", false, false, o_tokens->Line, o_tokens); + // return; // continue; + //} + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-BOOL] [" + Token[BOOL_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class : New Local Class Bool + CPP_CLASS.append(" bool " + ID[Token[BOOL_POS + 1]] + " "); + if (Token[BOOL_POS + 2] == "") + { + CPP_CLASS.append(" = false; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + } + } + else if (!IsInsideFunction) + { + // Global Area Bool + + // Ignore Local bool-var predefinition, + // focus only on Global bool-var predefinition + + if (!o_tokens->TOKENS_PREDEFINED) + { + SetNewVar(true, "", "", Token[BOOL_POS + 1], "منطق", false, false, + o_tokens->Line, o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-BOOL] [" + Token[BOOL_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Global Area + // Bool a + CPP_GLOBAL.append(" bool " + Global_ID[Token[BOOL_POS + 1]] + " "); + if (Token[BOOL_POS + 2] == "") + { + CPP_GLOBAL.append(" = false; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + else + { + // Local Bool + + SetNewVar(false, TheNamespace, TheFunction, Token[BOOL_POS + 1], "منطق", + false, false, o_tokens->Line, o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-BOOL ] [" + Token[BOOL_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Local Area + // Bool a + if (!IsInsideNamespace) + { + // Global Function + CPP_GLOBAL_FUN.append(" bool " + ID[Token[BOOL_POS + 1]] + " "); + if (Token[BOOL_POS + 2] == "") + { + CPP_GLOBAL_FUN.append(" = false; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + } + else + { + // Local Function + cpp_AddScript(TheFunction, " bool " + ID[Token[BOOL_POS + 1]] + " "); + if (Token[BOOL_POS + 2] == "") + { + cpp_AddScript(TheFunction, " = false; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + } + // *** *** *** *** *** *** + } + + if (Token[BOOL_POS + 2] == "=") + { + if (DEBUG) + DEBUG_MESSAGE("= ", o_tokens); // DEBUG + + if (!IsInsideFunction) + { + if (IsInsideClass) + { + // Class Global-Area + // *** Generate Code *** + CPP_CLASS.append(" = "); + // *** *** *** *** *** *** + } + else + { + // *** Generate Code *** + // Global Area + // Bool a = + CPP_GLOBAL.append(" = "); + // *** *** *** *** *** *** + } + } + else + { + if (IsInsideClass) + { + // Local Function Class + // *** Generate Code *** + CPP_CLASS.append(" = "); + // *** *** *** *** *** *** + } + else + { + // *** Generate Code *** + // Local Area + // Bool a = + if (!IsInsideNamespace) + // Global Function + CPP_GLOBAL_FUN.append(" = "); + else + // Local Function + cpp_AddScript(TheFunction, " = "); + // *** *** *** *** *** *** + } + } + + TempTokenCount = 0; + + for (int p = (BOOL_POS + 2); p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + if (substr_utf8(Token[p], 0, 1) == "_" && + !IsInsideFunction) // to avoid : a = b + _a + { + if (Token[BOOL_POS + 1] == + substr_utf8(Token[p], 1, CharCount_utf8(Token[p], o_tokens))) + ErrorCode("لا يمكن استعمال المتغير المنطقي العام في نفس السطر الذي " + "تم الانشاء فيه '" + + Token[p] + "' ", + o_tokens); + } + else if (Token[BOOL_POS + 1] == Token[p] && + (Token[p - 1] != + ":")) // to avoid a = b + a, but ok for a = b + x:y:a + { + if (G_VAR_IS_SET[(Token[BOOL_POS + 1])] && + IntToString(o_tokens->Line) != + G_VAR_AT_LINE[(Token[BOOL_POS + 1])]) + ErrorCode( + "لا يمكن استعمال المتغير المنطقي في نفس السطر الذي تم الانشاء " + "فيه '" + + Token[p] + "', كذلك اذا كنت تود استعمال المتغير العام '" + + Token[BOOL_POS + 1] + + "', يجب اضافه خط قبل اسم المتغير على سبيل المثال : _" + + Token[BOOL_POS + 1], + o_tokens); + + ErrorCode("لا يمكن استعمال المتغير المنطقي في نفس السطر الذي تم " + "الانشاء فيه '" + + Token[p] + "' ", + o_tokens); + } + + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + std::string WIN_OR_CLASS; + if (IsInsideClass) + WIN_OR_CLASS = TheClass; + else + WIN_OR_CLASS = TheNamespace; + + // Bool Syntax + ScriptSyntaxBuffer = + CheckForSyntax("منطق", // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Bool + true, // Accept Convertion from Bool To String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG + WIN_OR_CLASS, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + + if (IsInsideClass) + { + // just for fixing this ... + // *** Generate Code *** + CPP_CLASS.append(ScriptSyntaxBuffer + " ; \n "); + // *** *** *** *** *** *** + } + else if (!IsInsideFunction) + { + // Global Area + // Bool a = ... ; + CPP_GLOBAL.append(ScriptSyntaxBuffer + " ; \n "); + } + else + { + // Local Area + // Bool a = ... ; + if (!IsInsideNamespace) + // Global Function + CPP_GLOBAL_FUN.append(ScriptSyntaxBuffer + " ; \n "); + else + // Local Function + cpp_AddScript(TheFunction, ScriptSyntaxBuffer + " ; \n "); + } + // *** *** *** *** *** *** + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + else if (Token[BOOL_POS + 2] != "") + ErrorCode("أمر غير معروف '" + Token[BOOL_POS + 2] + "', ربما تقصد '=' ", + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG +} diff --git a/src/alif_class.hpp b/src/alif_class.hpp index 2b37c79f..324b21bc 100644 --- a/src/alif_class.hpp +++ b/src/alif_class.hpp @@ -21,6 +21,71 @@ . */ -void parser_Class(std::string Token[2048], CLASS_TOKEN *o_tokens){ - +void parser_Class(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + //صنف + + if (IsInsideClass) + ErrorCode("لا يمكن إنشاء صنف داخل صنف، الصنف الحالي : " + TheClass, + o_tokens); + + if (IsInsideFunction) + ErrorCode("لا يمكن أنشاء صنف داخل دالة، يجب إنشائها في المجال عام فقط", + o_tokens); + + if (IsInsideNamespace) + ErrorCode("لا يمكن أنشاء صنف داخل مجال، يجب إنشائها في المجال عام فقط", + o_tokens); + + if (Token[2] == "") + ErrorCode("يجب اعطاء اسم لهدا الصنف الجديدة", o_tokens); + + if (Token[3] != "" && Token[3] != "(") + ErrorCode("أمر غير معروف : ' " + Token[3] + " ' ", o_tokens); + + if (Token[3] == "(") + ErrorCode("الصنف لا يقبل خصائص ' ( ' ", o_tokens); + + if (!IsValidName(Token[2], o_tokens)) + ErrorCode("تعريف غير مقبول : ' " + Token[2] + " ' ", o_tokens); + + // TODO: Check if extended from other class + + if (!o_tokens->TOKENS_PREDEFINED) + { + if (CLASS_IS_SET[Token[2]]) + ErrorCode("الصنف ' " + Token[2] + " ' تم انشاؤه مسبقا في السطر رقم : " + + CLASS_AT_LINE[Token[2]], + o_tokens); + + // if already any other type of global var exist + CheckForSameGlobalID(Token[2], o_tokens); + + // Add New Class + CLASS_IS_SET[Token[2]] = true; + CLASS_AT_LINE[Token[2]] = IntToString(o_tokens->Line); + + IsInsideClass = true; + TheClass = Token[2]; + + SET_GLOBAL_C_NAME(Token[2]); + + return; // continue; + } + + IsInsideClass = true; + TheClass = Token[2]; + + // TheNamespace = TheClass; // < ======================================= TODO: + // TO BE CHECK IF THIS WORKAROUND WORK FINE !!!!!! + + if (DEBUG) + DEBUG_MESSAGE("[NEW CLASS] [" + Token[2] + "] \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + // New Class + CPP_CLASS.append(" class CLASS_" + Global_ID[Token[2]] + " { \n"); + // *** *** *** *** *** *** + + return; // continue; } diff --git a/src/alif_compile.hpp b/src/alif_compile.hpp deleted file mode 100644 index 542093a5..00000000 --- a/src/alif_compile.hpp +++ /dev/null @@ -1,769 +0,0 @@ -/* - The Alif Programming Language - Version 3.x Series - (C)2021 Hassan DRAGA - www.aliflang.org - - This file is part of Alif compiler. - - Alif compiler is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the Free - Software Foundation; either version 3, or (at your option) any later - version. - - Alif compiler is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. - - You should have received a copy of the GNU General Public License - along with Alif compiler; see the file COPYING3. If not see - . -*/ - - -#ifdef _WIN32 - -// ------------------------------------------------ -// Alif Compiler For Windows -// ------------------------------------------------ - -void CLEAN() { - if (DEBUG) return; - - std::string CLEAR_CMD; - - if (!THIS_IS_ALIF_C_FILE) { - CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + - RANDOM + "_strip.bat\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean strip Bat temp file. " << - // endl; - } - - CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + - RANDOM + "_strip.log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean strip log temp file. " << - // endl; - } - } - CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + - "_resource.bat\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean resource Bat temp file. " << - // endl; - } - - CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + - "_resource.log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean resource log temp file. " << - // endl; - } - - CLEAR_CMD = std::string("del \"") + PATH_FULL_CPP + std::string("\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean CPP temp file. " << endl; - } - - CLEAR_CMD = std::string("del \"") + PATH_FULL_RC + std::string("\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean RC temp file. " << endl; - } - - CLEAR_CMD = std::string("del \"" + PATH_FULL_RC + ".res\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean compiled RES temp file. " << - // endl; - } - - CLEAR_CMD = std::string("del \"") + PATH_FULL_OBJ + std::string("\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean OBJ temp file. " << endl; - } - - CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + - "_compile.log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean compile log temp file. " << - // endl; - } - - CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + - "_link.log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean link log temp file. " << endl; - } - - CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + - "_compile.bat\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean compile Bat temp file. " << - // endl; - } - - CLEAR_CMD = std::string("del \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + - "_linker.bat\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean link Bat temp file. " << endl; - } -} - -void compile_win64() { - // stringstream GCC_COMPILE_CMD; - // stringstream GCC_RESOURCE_CMD; - // stringstream GCC_LINK_CMD; - - std::string CMD; - - std::string LOG_PATH; - std::string LOG_LINE8; - std::string LOG_LINE8_Buffer; - - // Need file Bach to set Path=... - // for GCC Envirenment. - boost::nowide::ofstream FILE_BATCH; - std::string FILE_BATCH_PATH; - - // Compile: WebUI - TDM (GCC) 9.2 C++17 64Bit - Windows - - // ALIF_ERROR("PATH_FULL_CPP: " + PATH_FULL_CPP); - - // CMD = "@echo off\n" - // "Set PATH=" + PATH_ABSOLUTE + "\\gcc\\bin\n" - // " \"" + cc_path_full + "\" -Wa,-mbig-obj -fvisibility=hidden - // -Wall -O3 -std=gnu++17 -O3 -DNDEBUG -c -o \"" + PATH_FULL_OBJ + "\" " - // " -I\"" + - // PATH_ABSOLUTE + "\\boost\\include\" " " -I\"" + PATH_ABSOLUTE - // + - // "\\aliflib\" " " \"" + PATH_FULL_CPP + "\" " " 2> \"" - // + PATH_TEMP + - // "\\alifcompiler_" + RANDOM + "_compile.log\" "; - - CMD = - "@echo off\n" - "Set PATH=" + - PATH_ABSOLUTE + - "\\gcc\\bin\n" - " \"" + - cc_path_full + "\" -c -o \"" + PATH_FULL_OBJ + - "\" " - " -I\"" + - PATH_ABSOLUTE + - "\\boost\\include\" " - " -I\"" + - PATH_ABSOLUTE + - "\\aliflib\" " - " \"" + - PATH_FULL_CPP + "\" " + Compile_ExtraCompile + " 2> \"" + PATH_TEMP + - "\\alifcompiler_" + RANDOM + "_compile.log\" "; - - if (DEBUG) LogMessage("Compile script (Windows) : " + CMD + " \n"); - - FILE_BATCH_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_compile.bat"; - - FILE_BATCH.open(FILE_BATCH_PATH); - FILE_BATCH << CMD << endl; - FILE_BATCH.close(); - - system(("\"" + FILE_BATCH_PATH + "\"").c_str()); - - // ---------------------- - // Read Log File - // ---------------------- - - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - - LOG_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_compile.log"; - - boost::nowide::ifstream FILE_STREAM_COMPILER(LOG_PATH); - - if (!FILE_STREAM_COMPILER.is_open()) { - ALIF_ERROR("ERROR: Could not open compile log file: " + LOG_PATH); - AlifExitFailure(); - } - - while (getline(FILE_STREAM_COMPILER, LOG_LINE8)) { - LOG_LINE8_Buffer.append(LOG_LINE8); - } - - FILE_STREAM_COMPILER.close(); - - if (!LOG_LINE8_Buffer.empty()) { - // Error while compiling source code - - if (!DEBUG) - boost::replace_all(LOG_LINE8_Buffer, PATH_FULL_CPP + ":", ""); - - ALIF_ERROR( - "Please report this error to the Alif Community: " - "https://github.com/alifcommunity/compiler/issues \n\nAlif " - "Compiler " + - VERSION + " - Windows\n\nFile : " + PATH_FULL_ALIF + - "\nError: " + LOG_LINE8_Buffer); - AlifExitFailure(); - } - - // ------------------------------------------------------ - // Resource - // ------------------------------------------------------ - - CMD = - "@echo off\n" - "Set PATH=" + - PATH_ABSOLUTE + - "\\gcc\\bin\n" - //"SLEEP 1 \n" - "\"" + - PATH_ABSOLUTE + - "\\gcc\\bin\\windres.exe\"" - " -J rc -O coff -i \"" + - PATH_FULL_RC + "\" -o \"" + PATH_FULL_RC + - ".res\" --define _UNICODE --define NOPCH 2> \"" + PATH_TEMP + - "\\alifcompiler_" + RANDOM + "_resource.log\""; - - FILE_BATCH_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_resource.bat"; - - FILE_BATCH.open(FILE_BATCH_PATH); - FILE_BATCH << CMD << endl; - FILE_BATCH.close(); - - system(("\"" + FILE_BATCH_PATH + "\"").c_str()); - - // ------------------------------------------------------ - // Link - // ------------------------------------------------------ - - // CMD = "@echo off\n" - // "Set PATH=" + PATH_ABSOLUTE + "\\gcc\\bin\n" - // //"SLEEP 1 \n" - // "\"" + cc_path_full + "\"" - // " -Os -static-libgcc -static-libstdc++ -static -m64 - // -finput-charset=utf-8 -mthreads -o \"" + PATH_FULL_BIN + "\" \"" + - // PATH_FULL_RC + ".res\" \"" + PATH_FULL_OBJ + "\" -L\"" + PATH_ABSOLUTE + - // "\\boost\\lib\" -L\"" + PATH_ABSOLUTE + "\\aliflib\" -lwebui - // -lboost_thread-mgw8-mt-s-x64-1_76 -lboost_date_time-mgw8-mt-s-x64-1_76 - // -lboost_filesystem-mgw8-mt-s-x64-1_76 -lboost_regex-mgw8-mt-s-x64-1_76 - // -lws2_32 -lwsock32 " - // + GUI_CMD + " 2> \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + - // "_link.log\""; - - CMD = - "@echo off\n" - "Set PATH=" + - PATH_ABSOLUTE + - "\\gcc\\bin\n" - //"SLEEP 1 \n" - "\"" + - cc_path_full + "\" -o \"" + PATH_FULL_BIN + "\" \"" + PATH_FULL_RC + - ".res\" \"" + PATH_FULL_OBJ + "\" -L\"" + PATH_ABSOLUTE + - "\\boost\\lib\" -L\"" + PATH_ABSOLUTE + "\\aliflib\" " + - Compile_ExtraLink + " 2> \"" + PATH_TEMP + "\\alifcompiler_" + RANDOM + - "_link.log\""; - - if (DEBUG) LogMessage("Link script (Windows) : " + CMD + " \n"); - - FILE_BATCH_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_linker.bat"; - - FILE_BATCH.open(FILE_BATCH_PATH); - FILE_BATCH << CMD << endl; - FILE_BATCH.close(); - - system(("\"" + FILE_BATCH_PATH + "\"").c_str()); - - // Read Log File - // std::string path = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_link.log"; - // boost::replace_all(Buffer, "C:\\Alif\\bin/ld.exe:", ""); - - // ---------------------- - // Read Log File - // ---------------------- - - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - - LOG_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_link.log"; - - boost::nowide::ifstream FILE_STREAM_LINKER(LOG_PATH); - - if (!FILE_STREAM_LINKER.is_open()) { - ALIF_ERROR("ERROR: Could not open linker log file : " + LOG_PATH); - AlifExitFailure(); - } - - while (getline(FILE_STREAM_LINKER, LOG_LINE8)) { - LOG_LINE8_Buffer.append(LOG_LINE8); - } - - FILE_STREAM_LINKER.close(); - - if (!LOG_LINE8_Buffer.empty()) { - // Error while compiling source code - - boost::replace_all(LOG_LINE8_Buffer, "C:\\Alif\\bin/ld.exe:", ""); - - ALIF_ERROR( - "Please report this error to the Alif Community: " - "https://github.com/alifcommunity/compiler/issues \n\nAlif " - "Compiler " + - VERSION + " - Windows\n\nFile : " + PATH_FULL_ALIF + - "\nError (Linker): " + LOG_LINE8_Buffer + - "\nLinker command (Windows): \n" + CMD); - AlifExitFailure(); - } - - // ------------------------------------------------------ - // Striping - // ------------------------------------------------------ - - if (!THIS_IS_ALIF_C_FILE) { - CMD = - "@echo off\n" - "Set PATH=" + - PATH_ABSOLUTE + - "\\gcc\\bin\n" - "\"" + - PATH_ABSOLUTE + - "\\gcc\\bin\\strip.exe\"" - " --strip-all \"" + - PATH_FULL_BIN + "\" 2> \"" + PATH_TEMP + "\\alifcompiler_" + - RANDOM + "_strip.log\""; - - FILE_BATCH_PATH = PATH_TEMP + "\\alifcompiler_" + RANDOM + "_strip.bat"; - - FILE_BATCH.open(FILE_BATCH_PATH); - FILE_BATCH << CMD << endl; - FILE_BATCH.close(); - - system(("\"" + FILE_BATCH_PATH + "\"").c_str()); - - /* - FILE_BATCH_PATH = PATH_ABSOLUTE + "\\_alif\\tmp\\" + RAND + - "_strip.bat"; FILE_BATCH.open (FILE_BATCH_PATH); - - FILE_BATCH << "@echo off \n\n" - << "Set PATH=" + PATH_ABSOLUTE + - "\\_alif\\bin" + "\n\n" // SET PATH_ABSOLUTE - - << "\"" + PATH_ABSOLUTE + - "\\_alif\\bin\\strip.exe\"" // Strip PATH_ABSOLUTE - << " " // SPACE - << "--strip-all" - << " " // SPACE - << "\"" + PATH_FULL_BIN + "\\" + - PATH_BIN_FILE_NAME // EXE PATH_ABSOLUTE - << ".exe\"" - << " " // SPACE - << "2> \"" << PATH_FULL_CPP << - ".exe.strip.log\" "; // ERRORS OUTPUTE PATH_ABSOLUTE - - //<< " \n\n pause"; // DEBUG - - FILE_BATCH.close(); - */ - - // system(("\"" + FILE_BATCH_PATH + "\"").c_str()); - - //_wsystem(CMD_BATCH.c_str()); - - // Read log (PATH_FULL_CPP.exe.log) if error.. - } - - // ------------------------------------------------------ - // Clean - // ------------------------------------------------------ - - CLEAN(); -} - -#elif __APPLE__ - -// ------------------------------------------------ -// Alif Compiler For Mac OS X -// ------------------------------------------------ - -void CLEAN() { - if (DEBUG) return; - - std::string CLEAR_CMD = - std::string("rm -rf \"") + PATH_FULL_CPP + std::string("\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean CPP temp file. " << endl; - } - - CLEAR_CMD = std::string("rm -rf \"") + PATH_FULL_OBJ + std::string("\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean OBJ temp file. " << endl; - } - - CLEAR_CMD = - std::string("rm -rf \"") + PATH_FULL_CPP + std::string(".log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean compile log temp file. " << - // endl; - } - - CLEAR_CMD = - std::string("rm -rf \"") + PATH_FULL_BIN_TMP + std::string(".log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean link log temp file. " << endl; - } - - CLEAR_CMD = std::string("rm -rf \"") + PATH_FULL_BIN_TMP + - std::string(".strip.log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean strip log temp file. " << endl; - } -} - -// ---------------------------------- - -void COMPILE_MAC_64BIT() // std::string RAND, std::string PATH_FULL_ICO, - // std::string APP_PLIST) -{ - std::string MAC_CMD; - - // ------------------------------------------------------ - // macOS Compile - // SDK 10.12 - CMD 10.11 - Minimum 10.9 - // ------------------------------------------------------ - - // clang++ -mmacosx-version-min=10.9 -m64 -O2 -std=c++11 -c -o - // "alifstudio.o" -D__WXOSX_COCOA__ -Wall -Wundef -Wunused-parameter - // -Wno-ctor-dtor-privacy -Woverloaded-virtual -Wno-deprecated-declarations - // -D_FILE_OFFSET_BITS=64 -DwxDEBUG_LEVEL=0 -I"/Library/Application - // Support/Aliflang/Alif_Lib_WX/lib/wx/include/osx_cocoa-unicode-static-3.1-alif" - // -I"/Library/Application Support/Aliflang/Alif_Lib_WX/include" -fno-common - // "Src/alifstudio.cpp" - - MAC_CMD = "clang++ -mmacosx-version-min=10.9 -m64 -O2 -std=c++11 -c -o " - "\"" + - PATH_FULL_OBJ + - "\" -D__WXOSX_COCOA__ -Wall -Wundef -Wunused-parameter " - "-Wno-ctor-dtor-privacy -Woverloaded-virtual " - "-Wno-deprecated-declarations -D_FILE_OFFSET_BITS=64 " - "-I" XSTR(INSTALL_PREFIX) "/lib/aliflib" // Alif lib path on macOS - " -fno-common \"" + - PATH_FULL_CPP + - "\" " - "2> \"" + - PATH_FULL_CPP + ".log\" "; - - if (system(MAC_CMD.c_str()) != 0) { - cout << endl - << "ERROR [CORE001]: Can't compile generated code. " << endl; - AlifExitFailure(); - } - - // TODO: Read log for error.. - - // ------------------------------------------------------ - // Resource - // ------------------------------------------------------ - - // Nothing in macOS - // All Resource are inside .app folder - - // ------------------------------------------------------ - // Link - // ------------------------------------------------------ - - std::string GUI_CMD = ""; - - if (APP_TYPE == "PC_GUI") GUI_CMD = " ............. "; - - // clang++ -m64 -mmacosx-version-min=10.9 -o "alifstudio" "alifstudio.o" - // -L"/Library/Application Support/Aliflang/Alif_Lib_WX/lib" -framework - // IOKit -framework Carbon -framework Cocoa -framework AudioToolbox - // -framework System -framework OpenGL -lwx_osx_cocoau_alif_aui-3.1 - // -lwx_osx_cocoau_alif_propgrid-3.1 -lwx_osx_cocoau_alif_adv-3.1 - // -lwx_osx_cocoau_alif_stc-3.1 -lwx_osx_cocoau_alif_core-3.1 - // -lwx_baseu_alif-3.1 -lwxscintilla_alif-3.1 -lwxtiff_alif-3.1 - // -lwxjpeg_alif-3.1 -lwxpng_alif-3.1 -framework WebKit -lwxzlib_alif-3.1 - // -lwxregexu_alif-3.1 -lwxexpat_alif-3.1 -framework IOKit -framework Carbon - // -framework Cocoa -framework AudioToolbox -framework System -framework - // OpenGL -framework Security -lpthread -liconv -framework Security - // -lpthread -liconv - - MAC_CMD = "clang++ -m64 -mmacosx-version-min=10.9 -o \"" + PATH_FULL_BIN_TMP + - "\" \"" + PATH_FULL_OBJ + - "\" " - " -framework IOKit " - "-framework Carbon -framework Cocoa -framework AudioToolbox " - "-framework System -framework OpenGL " - " -L" XSTR(INSTALL_PREFIX) "/lib/aliflib -lwebui_linux_x86_64 " - "-framework WebKit " - "-framework IOKit -framework Carbon " - "-framework Cocoa -framework " - "AudioToolbox -framework System " - "-framework OpenGL -framework " - "Security -lpthread -liconv -framework " - "Security -lpthread -liconv " - " -lboost_filesystem -lboost_iostreams " - "2> \"" + - PATH_FULL_BIN_TMP + ".log\" "; - - if (system(MAC_CMD.c_str()) != 0) { - cout << endl << "ERROR [CORE001]: Can't Link generated code. " << endl; - AlifExitFailure(); - } - - // ------------------------------------------------------ - // Striping - // ------------------------------------------------------ - - MAC_CMD = "strip \"" + PATH_FULL_BIN_TMP + "\" 2> \"" + PATH_FULL_BIN_TMP + - ".strip.log\" "; - - if (system(MAC_CMD.c_str()) != 0) { - cout << endl << "ERROR [CORE001]: Can't Strip. " << endl; - AlifExitFailure(); - } - - // ------------------------------------------------------ - // Generate bundle Application - // ------------------------------------------------------ - - if (APP_TYPE == "PC_GUI") { - // SetFile -t APPL MyAlif - - // mkdir -p MyAlif.app - // mkdir -p MyAlif.app/Contents - // mkdir -p MyAlif.app/Contents/MacOS - // mkdir -p MyAlif.app/Contents/Resources - - // cp MyAlif MyAlif.app/Contents/MacOS/alif - - // cp alif.icns MyAlif.app/Contents/Resources/alif.icns - - // cp Info.plist MyAlif.app/Contents/Info.plist - - // touch MyAlif.app - - MAC_CMD = "SetFile -t APPL \"" + PATH_FULL_BIN_TMP + "\" "; - system(MAC_CMD.c_str()); - - MAC_CMD = "mkdir -p \"" + PATH_FULL_BIN + "\" "; - system(MAC_CMD.c_str()); - - MAC_CMD = "mkdir -p \"" + PATH_FULL_BIN + "/Contents\" "; - system(MAC_CMD.c_str()); - - MAC_CMD = "mkdir -p \"" + PATH_FULL_BIN + "/Contents/MacOS\" "; - system(MAC_CMD.c_str()); - - MAC_CMD = "mkdir -p \"" + PATH_FULL_BIN + "/Contents/Resources\" "; - system(MAC_CMD.c_str()); - - MAC_CMD = "cp \"" + PATH_FULL_BIN_TMP + "\" \"" + PATH_FULL_BIN + - "/Contents/MacOS/alif\" "; - system(MAC_CMD.c_str()); - - MAC_CMD = "cp \"" + PATH_FULL_ICO + "\" \"" + PATH_FULL_BIN + - "/Contents/Resources/alif.icns\" "; - system(MAC_CMD.c_str()); - - MAC_CMD = "cp \"" + PATH_FULL_PLIST + "\" \"" + PATH_FULL_BIN + - "/Contents/Info.plist\" "; - system(MAC_CMD.c_str()); - - MAC_CMD = "touch \"" + PATH_FULL_BIN + "\" "; - system(MAC_CMD.c_str()); - - CLEAN(); - } else { - // macOS Console - - MAC_CMD = "cp \"" + PATH_FULL_BIN_TMP + "\" \"" + PATH_FULL_BIN + "\" "; - system(MAC_CMD.c_str()); - } -} - -#else - -// ------------------------------------------------ -// Alif Compiler For Linux -// ------------------------------------------------ - -void CLEAN() { - if (DEBUG) return; - - std::string CLEAR_CMD = - std::string("rm -rf \"") + PATH_FULL_CPP + std::string("\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean CPP temp file. " << endl; - } - - CLEAR_CMD = std::string("rm -rf \"") + PATH_FULL_OBJ + std::string("\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean OBJ temp file. " << endl; - } - - CLEAR_CMD = std::string("rm -rf \"" + PATH_TEMP + "/alifcompiler_" + - RANDOM + "_compile.log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean compile log temp file. " << - // endl; - } - - CLEAR_CMD = std::string("rm -rf \"" + PATH_TEMP + "/alifcompiler_" + - RANDOM + "_link.log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean link log temp file. " << endl; - } - - CLEAR_CMD = std::string("rm -rf \"" + PATH_TEMP + "/alifcompiler_" + - RANDOM + "_strip.log\" "); - if (system(CLEAR_CMD.c_str()) != 0) { - // cout << endl << "Warning: Can't clean strip log temp file. " << endl; - } -} - -void compile_linux64() { - std::string LINUX_CMD; - - std::string LOG_PATH; - std::string LOG_LINE8; - std::string LOG_LINE8_Buffer; - - // ------------------------------------------------------ - // Compile - WX3 Master - GTK2 - x86_64 - Optimized - // ------------------------------------------------------ - - // -std=gnu++17 -m64 -finput-charset=utf-8 -O3 -pthread -DNDEBUG - // -fvisibility=hidden -lfto -fno-fat-lto-objects -DBOOST_ALL_NO_LIB - // -DBOOST_FILESYSTEM_DYN_LINK - - // LINUX_CMD = "g++ -Wall -std=gnu++17 -m64 -finput-charset=utf-8 -O3 - // -pthread -DNDEBUG -fvisibility=hidden -c -o \"" + PATH_FULL_OBJ + "\" " - // " -I\"/usr/local/include\" " // Standard " - // -I\"/usr/local/lib/aliflib\" " // Alif lib " \"" + - // PATH_FULL_CPP - // + "\" - // " " 2> \"" + PATH_TEMP + "/alifcompiler_" + RANDOM - // + - // "_compile.log\" "; - - LINUX_CMD = "g++ -c -o \"" + PATH_FULL_OBJ + "\" \"" + PATH_FULL_CPP + - "\" -I \"" XSTR(INSTALL_PREFIX) "/lib/aliflib\" " + - Compile_ExtraCompile + " 2> \"" + PATH_TEMP + "/alifcompiler_" + - RANDOM + "_compile.log\" "; - - if (DEBUG) LogMessage("Compile command (Linux) : " + LINUX_CMD + " \n"); - // std::cout << "\n\n--------------\nCompile: |" << LINUX_CMD << - // "|\n--------------\n"; - - system(LINUX_CMD.c_str()); - - // ---------------------- - // Read Log File - // ---------------------- - - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - - LOG_PATH = PATH_TEMP + "/alifcompiler_" + RANDOM + "_compile.log"; - - boost::nowide::ifstream FILE_STREAM_COMPILER(LOG_PATH); - - if (!FILE_STREAM_COMPILER.is_open()) { - ALIF_ERROR("ERROR: Could not open compile log file : " + LOG_PATH); - AlifExitFailure(); - } - - while (getline(FILE_STREAM_COMPILER, LOG_LINE8)) { - LOG_LINE8_Buffer.append(LOG_LINE8); - } - - FILE_STREAM_COMPILER.close(); - - if (!LOG_LINE8_Buffer.empty()) { - // Error while compiling source code - - if (!DEBUG) - boost::replace_all(LOG_LINE8_Buffer, PATH_FULL_CPP + ":", ""); - - ALIF_ERROR( - "Please report this error to the Alif Community: " - "https://github.com/alifcommunity/compiler/issues \n\nAlif " - "Compiler " + - VERSION + " - Linux\n\nFile : " + PATH_FULL_ALIF + - "\nError: " + LOG_LINE8_Buffer + "\nCompile command: " + LINUX_CMD); - AlifExitFailure(); - } - - // ------------------------------------------------------ - // Resource - // ------------------------------------------------------ - - // ... - - // ------------------------------------------------------ - // Link - // ------------------------------------------------------ - - std::string GUI_CMD = ""; - - // if (APP_TYPE == "PC_GUI") - // GUI_CMD = " ............. "; - - // -L\"/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu" -lpython3.5 - - // LINUX_CMD = "g++ -Os -m64 -finput-charset=utf-8 -pthread -o \"" + - // PATH_FULL_BIN + "\" \"" + PATH_FULL_OBJ + "\" " - // "-L\"/usr/local/lib/aliflib\" -lwebui - // -lboost_filesystem"; - - LINUX_CMD = "g++ -o \"" + PATH_FULL_BIN + "\" \"" + PATH_FULL_OBJ + - "\" -L\"" XSTR(INSTALL_PREFIX) "/lib/aliflib\" " + - Compile_ExtraLink + " "; // TODO: Add 2 > log - - if (DEBUG) LogMessage("Link command (Linux) : " + LINUX_CMD + " \n"); - - // std::cout << "\n\n--------------\nLink: |" << LINUX_CMD << - // "|\n--------------\n"; - // g++ - // -Os -m64 -finput-charset=utf-8 -pthread -lboost_filesystem -lboost_thread - // -Os -m64 -finput-charset=utf-8 -pthread -lboost_filesystem -lboost_thread - // -L"/usr/local/lib/aliflib" -o "test" "/tmp/alifcompiler_1007.o" - - if (system(LINUX_CMD.c_str()) != 0) { - // cout << endl << "Bug: Can't Link generated code. " << endl; - // AlifExitFailure(); - - if (DEBUG) cout << endl << "Debuging: " << LINUX_CMD.c_str() << endl; - - ALIF_ERROR( - "Please report this error to the Alif Community: " - "https://github.com/alifcommunity/compiler/issues \nAlif " - "Compiler " + - VERSION + " - Linux\n\nFile : " + PATH_FULL_ALIF + - "\nError: Linking Librarys error.\nLink command: " + LINUX_CMD); - AlifExitFailure(); - } - - // ------------------------------------------------------ - // Striping - // ------------------------------------------------------ - - LINUX_CMD = - " strip --strip-all --strip-unneeded \"" + PATH_FULL_BIN + "\" "; - - if (system(LINUX_CMD.c_str()) != 0) { - // Striping error.. - } - - // ------------------------------------------------------ - - // Debugging Mode : - - // gdb -silent -ex 'set logging redirect off' -ex 'printf "\nAlif - // Compiler 1.0 - // - GNU Debugger\n\n"' -ex 'run' -ex 'printf "\nBacktrace : \n"' -ex 'bt' - // -ex 'printf "\nEnd.\n"' -ex 'detach' -ex 'quit' ./AlifStudio > - // AlifDebug.txt - - CLEAN(); -} - -#endif - diff --git a/src/alif_control.hpp b/src/alif_control.hpp new file mode 100644 index 00000000..904a028e --- /dev/null +++ b/src/alif_control.hpp @@ -0,0 +1,210 @@ +/* + The Alif Programming Language + Version 3.x Series + (C)2021 Hassan DRAGA + www.aliflang.org + + This file is part of Alif compiler. + + Alif compiler is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 3, or (at your option) any later + version. + + Alif compiler is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with Alif compiler; see the file COPYING3. If not see + . +*/ + +void parser_Control(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + //أداة + + if (IsInsideNamespace || IsInsideFunction || IsInsideClass) + ErrorCode("يجب انشاء الادوات في المنطقة العامة", o_tokens); + + if (Token[2] == "مجال") + { + if (Token[3] != "(") + ErrorCode("إشارة مفقودة '(' قبل ' " + Token[3] + " ' ", o_tokens); + if (Token[5] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[5] + " ' ", o_tokens); + if (Token[7] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[7] + " ' ", o_tokens); + if (Token[9] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[9] + " ' ", o_tokens); + if (Token[11] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[11] + " ' ", o_tokens); + if (Token[13] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[13] + " ' ", o_tokens); + if (Token[15] != ")") + ErrorCode("إشارة مفقودة ')' بعد ' " + Token[14] + " ' ", o_tokens); + + if (!IsValidName(Token[4], o_tokens)) + ErrorCode("تعريف غير مقبول : ' " + Token[4] + " ' ", o_tokens); + + // if already any other type of global var exist + CheckForSameGlobalID(Token[6], o_tokens); + + if (!o_tokens->TOKENS_PREDEFINED) + { + if (CONTROL_WIN_IS_SET[Token[4]]) + ErrorCode("النافذة ' " + Token[4] + + " ' تم انشاؤها مسبقا في السطر رقم : " + + CONTROL_WIN_AT_LINE[(Token[4])], + o_tokens); + + CONTROL_WIN_IS_SET[Token[4]] = true; + WIN_IS_WEB[Token[4]] = false; + CONTROL_WIN_AT_LINE[(Token[4])] = IntToString(o_tokens->Line); + CPP_WINDOW[std::make_pair(Token[4], "شكل")] = + " wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | " + "wxCLIP_CHILDREN "; + APP_TYPE = "PC_GUI"; + + SET_C_NAME(Token[4]); + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CONTROL] [NAMESPACE] ['" + Token[4] + " '] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // New Namespace + CPP_WINDOW[std::make_pair(Token[4], "افصول")] = Token[6]; + CPP_WINDOW[std::make_pair(Token[4], "ارتوب")] = Token[8]; + CPP_WINDOW[std::make_pair(Token[4], "عرض")] = Token[10]; + CPP_WINDOW[std::make_pair(Token[4], "ارتفاع")] = Token[12]; + CPP_WINDOW[std::make_pair(Token[4], "نص")] = + remove_quote(Token[14], o_tokens); + if (Token[4] != "رئيسية") + { + Namespace_Total++; + Namespace_Total_Names[Namespace_Total] = Token[4]; + CPP_ID_DECLARATION.append(" int ID_WINDOW_" + ID[Token[4]] + + " = ALIFCORE_ID_GENERATOR(); \n"); + CPP_GLOBAL.append(" bool WINDOW_IS_SHOW_" + ID[Token[4]] + + " = false; \n"); + CPP_GLOBAL.append(" bool WINDOW_IS_CONSTRUCTION_" + ID[Token[4]] + + " = false; \n"); + CPP_GLOBAL.append(" void WINDOW_LOAD_" + ID[Token[4]] + "(); \n"); + } + // *** *** *** *** *** *** + + return; // continue; + } + else if (Token[2] == "زر" || Token[2] == "نص" || Token[2] == "ملصق") + { + if (Token[3] != "(") + ErrorCode("إشارة مفقودة '(' قبل ' " + Token[3] + " ' ", o_tokens); + if (Token[5] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[5] + " ' ", o_tokens); + if (Token[7] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[7] + " ' ", o_tokens); + if (Token[9] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[9] + " ' ", o_tokens); + if (Token[11] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[11] + " ' ", o_tokens); + if (Token[13] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[13] + " ' ", o_tokens); + if (Token[15] != ",") + ErrorCode("إشارة مفقودة ',' قبل ' " + Token[15] + " ' ", o_tokens); + if (Token[17] != ")") + ErrorCode("إشارة مفقودة ')' بعد ' " + Token[16] + " ' ", o_tokens); + + if (!CONTROL_WIN_IS_SET[Token[4]] && Token[4] != "رئيسية") + ErrorCode("مجال غير موجوده : ' " + Token[4] + " ' ", o_tokens); + + if (!IsValidName(Token[6], o_tokens)) + ErrorCode("تعريف غير مقبول : ' " + Token[6] + " ' ", o_tokens); + + // if already any other type of global var exist + CheckForSameGlobalID(Token[6], o_tokens); + + if (!o_tokens->TOKENS_PREDEFINED) + { + if (CONTROL_IS_SET[std::make_pair(Token[4], Token[6])]) + ErrorCode("الأداة ' " + Token[6] + + " ' تم انشاؤها مسبقا في السطر رقم : " + + CONTROL_AT_LINE[std::make_pair(Token[4], Token[6])], + o_tokens); + + CONTROL_IS_SET[std::make_pair(Token[4], Token[6])] = true; + CONTROL_AT_LINE[std::make_pair(Token[4], Token[6])] = + IntToString(o_tokens->Line); + CONTROL_TYPE[std::make_pair(Token[4], Token[6])] = Token[2]; + + SET_CONTROL_C_NAME(Token[6]); + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CONTROL] ['" + Token[6] + " '] ['" + Token[2] + + " '] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // New CTR + CBUFER_ID = "ID_CTR_" + ID[Token[4]] + "_" + Control_ID[Token[6]]; + CBUFER_OBJ = "OBJ_CTR_" + ID[Token[4]] + "_" + Control_ID[Token[6]]; + CPP_ID_DECLARATION.append(" int " + CBUFER_ID + + " = ALIFCORE_ID_GENERATOR(); \n"); + if (Token[2] == "زر") + { + CPP_OBJ_DECLARATION.append(" wxButton* " + CBUFER_OBJ + "; \n"); + CBUFER = CPP_WINDOW[std::make_pair(Token[4], "CTR_CONSTRUCTOR")]; + CPP_WINDOW[std::make_pair(Token[4], "CTR_CONSTRUCTOR")] = + CBUFER + " \n" + CBUFER_OBJ + " = new wxButton (P, " + CBUFER_ID + + ", (\"" + remove_quote(Token[16], o_tokens) + "\"), wxPoint(" + + Token[8] + "," + Token[10] + "), wxSize(" + Token[12] + ", " + + Token[14] + ")); \n"; + } + else if (Token[2] == "نص") + { + // TODO: AppendText -> أضف + // SetLabel -> نص + // what about wxTE_MULTILINE ? + + CPP_OBJ_DECLARATION.append(" wxTextCtrl* " + CBUFER_OBJ + "; \n"); + CBUFER = CPP_WINDOW[std::make_pair(Token[4], "CTR_CONSTRUCTOR")]; + CPP_WINDOW[std::make_pair(Token[4], "CTR_CONSTRUCTOR")] = + CBUFER + " \n" + CBUFER_OBJ + " = new wxTextCtrl (P, " + CBUFER_ID + + ", (\"" + remove_quote(Token[16], o_tokens) + "\"), wxPoint(" + + Token[8] + "," + Token[10] + "), wxSize(" + Token[12] + ", " + + Token[14] + "), wxTE_MULTILINE | wxTE_RIGHT); \n"; + } + else if (Token[2] == "ملصق") + { + CPP_OBJ_DECLARATION.append(" wxStaticText* " + CBUFER_OBJ + "; \n"); + CBUFER = CPP_WINDOW[std::make_pair(Token[4], "CTR_CONSTRUCTOR")]; + CPP_WINDOW[std::make_pair(Token[4], "CTR_CONSTRUCTOR")] = + CBUFER + " \n" + CBUFER_OBJ + " = new wxStaticText (P, " + CBUFER_ID + + ", (\"" + remove_quote(Token[16], o_tokens) + "\"), wxPoint(" + + Token[8] + "," + Token[10] + "), wxSize(" + Token[12] + ", " + + Token[14] + + "), wxST_NO_AUTORESIZE | wxALIGN_RIGHT | wxST_ELLIPSIZE_END); \n"; + } + else + { + ErrorCode("علة: نوع الأداة غير معروف ' " + Token[2] + " ' ", o_tokens); + } + // *** *** *** *** *** *** + + return; // continue; + } + else + { + if (Token[2] == "مجال") + ErrorCode("نوع الأداة غير معروف ' " + Token[2] + + " '، هل تقصد ' مجال ' ؟ ", + o_tokens); + else + ErrorCode("نوع الأداة غير معروف ' " + Token[2] + " ' ", o_tokens); + } +} diff --git a/src/alif_core.hpp b/src/alif_core.hpp deleted file mode 100644 index 21cf4cb1..00000000 --- a/src/alif_core.hpp +++ /dev/null @@ -1,5364 +0,0 @@ -/* - The Alif Programming Language - Version 3.x Series - (C)2021 Hassan DRAGA - www.aliflang.org - - This file is part of Alif compiler. - - Alif compiler is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the Free - Software Foundation; either version 3, or (at your option) any later - version. - - Alif compiler is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - for more details. - - You should have received a copy of the GNU General Public License - along with Alif compiler; see the file COPYING3. If not see - . -*/ - -// Global ******************************************************* - -// Alif v3 - -void core_add_object(string ns, string cl, string fn, string ob){ - - std::map< - std::pair< - std::pair, - std::pair - >, - std::string - > t; - t[make_pair(make_pair("a", "a"), make_pair("a", "a"))] = "A"; - cout << t[make_pair(make_pair("a", "a"), make_pair("a", "a"))]; -} - -unsigned char *_base64_encode(const unsigned char *src, size_t len, - size_t *out_len); -unsigned char *_base64_decode(const unsigned char *src, size_t len, - size_t *out_len); -std::string base64_encode(std::string data); -std::string base64_decode(std::string data); - -struct _settings { - struct _os { -#ifdef _WIN32 - std::string exe_ext = ".exe"; - std::string path_sep = "\\"; -#elif __APPLE__ - std::string exe_ext = ".app"; - std::string path_sep = "/"; -#else - std::string exe_ext = ""; - std::string path_sep = "/"; -#endif - } os; - -} settings; - -struct _argument { - struct _input { - std::string path = ""; - std::string filename = ""; - std::string extension = ""; - std::string fullpath = ""; - std::vector includes; - } input; - - struct _output { - std::string path = ""; - std::string filename = ""; - std::string extension = ""; - std::string fullpath = ""; - } output; - - struct _log { - std::string path = ""; - std::string filename = ""; - std::string extension = ""; - std::string fullpath = ""; - } log; - -} argument; - -struct _script { - struct _main { - bool is_set = false; - std::string set_at_line = "0"; - } main; - -} script; - -bool AlifFailure = false; - -void AlifExitFailure(){ - - AlifFailure = true; - exit(EXIT_FAILURE); -} - -// دالة -bool IsInsideFunction = false; -std::string TheFunction; -std::string TheFunctionType; -std::map, std::string> RETURN_FUN; // abc[win][fun] = return is ok ? "OK", "IF" - -// -- Alif v2 (Old) ------------------------------------------ - -using namespace std; -bool DEBUG = false; -bool SyntaxOnly = false; -static const std::string VERSION = ALIF_VERSION; - -// ----------------------------------------------------------- -// Reserved Words -// ----------------------------------------------------------- - -// ألف أضف مكتبة رئيسية _س_ واجهة خاص -// نهاية كلما مجال دالة عدد نص كائن إذا و أو سطر إرجاع صنف أداة نقر زر نص -// ملصق إظهار إخفاء تدمير عنوان نص تجميد عرض محتوى ارتفاع أفصول أرتوب - -static const std::string ALIF_RESERVED[] = { - - "ألف", "أضف", "مكتبة", "_س_", "مجال", "إرجاع", "نهاية", - "صنف", "خاص", "عدد", "نص", "كائن", "دالة", "هدم", - "بناء", "كلما", "إذا", "أو", "و", "وإلا", "سطر", - "صحيح", "خطأ", "كسر", "متغير", "ثابت", "منطق", "رئيسية"}; - -static const int ALIF_RESERVED_TOTAL = 33; - -static const std::vector DataType_v{"منطق", "نص", "عدد"}; - -// ----------------------------------------------------------- -// Lexic Tokens Class -// Create Obj for every Alif Source files -// ----------------------------------------------------------- - -std::string TempToken[1024]; -int TempTokenCount = 1; - -class CLASS_TOKEN { - public: - // ---------------------------------- - // Script Type - // ---------------------------------- - - // to block setting Alif-Namespace inside library's - std::string ALIF_SCRIPT_TYPE; - - // ---------------------------------- - // File Path - // ---------------------------------- - - // usr/username/Desktop/myproject/src/mysource.alif - // Used only by Lexer() - std::string PATH_FULL_SOURCE; - - // ---------------------------------- - // Tokens - // ---------------------------------- - - std::string - REAL_LINE[2048]; // The real Alif script line, without toknonisation ! - std::map, int> - REAL_TOKEN_POSITION; // The real Alif script token position in real - // line ! [Line Number, Token Number] = "real char - // number" - - bool TOKENS_PREDEFINED = false; - - std::map, std::string> - TOKEN; // TOKEN [Line Number, Token Number] = "token" - - int TOTAL[2048]; - int TOTAL_LINES; - int NUMBER; - int Line; - - // ---------------------------------- - // Constructor - // ---------------------------------- - - CLASS_TOKEN() { - TOTAL_LINES = 1; - NUMBER = 1; - Line = 1; - ALIF_SCRIPT_TYPE = ""; - PATH_FULL_SOURCE = ""; - } -}; - -// ---------------------------------- -// Alif Global Language Variables -// ---------------------------------- - -static std::string APP_TYPE = "PC_CONSOLE"; - -// ---------------------------------- -// Flag -// ---------------------------------- - -static std::map - ALIF_FLAG_FILE; // alif_flag[full_file_path] = true or false -static std::map - ALIF_FLAG_AT_LINE_FILE; // alif_flag[full_file_path] = at_line - -// ---------------------------------- -// صنف -// ---------------------------------- - -static std::map - CLASS_CONSTRICTOR_FUN_IS_SET; // abc[class] = main_func true or false -static std::map - CLASS_CONSTRICTOR_FUN_AT_LINE; // abc[class] = main_func_at_line -static std::map - CLASS_CONSTRICTOR_FUN_ARG_TOTAL; // abc[class] = total args -static std::map, std::string> - CLASS_CONSTRICTOR_FUN_ARG_TYPE; // abc[class][arg number] = arg type - -static bool IsInsideClass = false; -static std::string TheClass; -static std::map - CLASS_IS_SET; // abc['class name'] = already set ? -static std::map - CLASS_AT_LINE; // abc['class name'] = class at line - -static std::map, bool> - CLASS_FUN_IS_SET; // abc[class][fun] = class fun already set ? -static std::map, std::string> - CLASS_FUN_AT_LINE; // abc[class][fun] = class fun line number -static std::map, std::string> - CLASS_FUN_TYPE; // abc[class][fun] = class fun type -static std::map, bool> - CLASS_FUN_PRIVATE; // abc[class][fun] = class fun private ? -static std::map, int> - CLASS_FUN_ARG_TOTAL; // abc[class][fun] = global total args -static std::map, std::string> - CLASS_FUN_ARG_TYPE; // abc[class + fun][arg number] = arg type - -static std::map, bool> - CLASS_G_VAR_IS_SET; // abc[class][var] = global var already set ? -static std::map, std::string> - CLASS_G_VAR_AT_LINE; // abc[class][var] = global var line number -static std::map, std::string> - CLASS_G_VAR_TYPE; // abc[class][var] = global var type -static std::map, bool> - CLASS_G_VAR_PRIVATE; // abc[class][var] = global private ? -static std::map, bool> - CLASS_G_VAR_IS_CONST; // abc[class][var] = global var Constant -static std::map, bool> CLASS_G_VAR_IS_ARRAY; - -// ---------------------------------- -// كائن -// ---------------------------------- - -static std::map, bool> - OBJ_IS_SET; // abc[namespace + fun][obj] = already set ? -static std::map, std::string> - OBJ_AT_LINE; // abc[namespace + fun][obj] = line number -static std::map, std::string> - OBJ_CLASS; // abc[namespace + fun][obj] = base class -static std::map - OBJ_GLOBAL_DECLARATION; // abc[class] = Obj1; Obj2;... - -// ---------------------------------- -// مجال -// ---------------------------------- - -static bool IsInsideNamespace = false; -static std::string TheNamespace; - -int Namespace_Total = 0; -std::string Namespace_Total_Names[64]; - -// ---------------------------------- -// مجال رئيسية -// ---------------------------------- - -// static bool MAIN_WIN_IS_SET = false; -// static std::string MAIN_WIN_AT_LINE; - -// ---------------------------------- -// مجال -// ---------------------------------- - -static std::map - namespace_is_set; // abc['namespace_name'] = already set ? -static std::map - namespace_at_line; // abc['namespace_name'] = func_at_line -// static std::map WIN_IS_WEB; // -// abc['namespace_name'] = Web UI ? - -// ---------------------------------- -// دالة -// ---------------------------------- - - - - -static bool IS_CONTROL_FUNCTION_NAME = false; - -// ---------------------------------- -// دالة رئيسية -// ---------------------------------- - -static std::map - MAIN_FUN_IS_SET; // abc['namespace_name'] = main_func true or false -static std::map - MAIN_FUN_AT_LINE; // abc['namespace_name'] = main_func_at_line - -// ---------------------------------- -// دالة -// ---------------------------------- - -static std::map - G_FUN_IS_SET; // abc[gfun] = global fun already set ? -static std::map - G_FUN_AT_LINE; // abc[gfun] = global fun line number -static std::map - G_FUN_TYPE; // abc[gfun] = global fun type -static std::map - G_FUN_ARG_TOTAL; // abc[gfun] = global total args -static std::map, std::string> - G_FUN_ARG_TYPE; // abc[gfun][arg number] = arg type -int Global_TotalFucntion = 0; -static std::map - Global_FunctionNames; // abc[global fun number] = func name - -static std::map, bool> - L_FUN_IS_SET; // abc[namespace_name][fun] = local fun already set ? -static std::map, std::string> - L_FUN_AT_LINE; // abc[namespace_name][fun] = local fun line number -static std::map, std::string> - L_FUN_TYPE; // abc[namespace_name][fun] = local fun type -static std::map, int> - L_FUN_ARG_TOTAL; // abc[namespace_name][fun] = global total args -static std::map, std::string> - L_FUN_ARG_TYPE; // abc[namespace_name + fun][arg number] = arg type - -int Win_CurrentTotalFucntion = 0; -static std::map - Win_TotalFucntion; // abc[namespace_name] = total functions -static std::map, std::string> - Win_FunctionNames; // abc[namespace_name][fun number] = func name - -static std::string NEW_FUNCTION_ARG = ""; - -// ----------------------------------------------------------- -// VARs -// ----------------------------------------------------------- - -// Local var - -static std::map, bool> - L_VAR_IS_SET; // abc[namespace_name + func][var] = local var already set ? -static std::map, std::string> - L_VAR_AT_LINE; // abc[namespace_name + func][var] = local var line number -static std::map, std::string> - L_VAR_TYPE; // abc[namespace_name + func][var] = local var type -static std::map, bool> - L_VAR_IS_CONST; // abc[namespace_name + func][var] = local var Constant -static std::map, bool> L_VAR_IS_ARRAY; - -// Global var - -static std::map - G_VAR_IS_SET; // abc[var] = global var already set ? -static std::map - G_VAR_AT_LINE; // abc[var] = global var line number -static std::map - G_VAR_TYPE; // abc[var] = global var type -static std::map - G_VAR_IS_CONST; // abc[var] = global var Constant -static std::map G_VAR_IS_ARRAY; -static int G_VAR_TOTAL = 0; // Total of global vars -static std::map G_VAR_NAMES; // abc[var] = var_name - -// ---------------------------------- -// PARENTHESIS -// ---------------------------------- - -static int ALIF_PARENTHESIS_STATUS = 0; - -// ---------------------------------- -// IF -// ---------------------------------- - -static int ALIF_IF_STATUS = 0; -static bool IS_IF_SYNTAX = false; - -// ---------------------------------- -// LOOP -// ---------------------------------- - -static int ALIF_LOOP_STATUS = 0; - -// ----------------------------------------------------------- -// DEBUG / ERROR / LOG -// ----------------------------------------------------------- - -// Debug - -bool DEBUG_PRINT_ON_SCREEN = false; -bool THIS_IS_ALIF_C_FILE = false; - -// Error - -bool ERROR_PRINT_ON_SCREEN = false; -bool ERROR_AS_JSON = false; -bool ERROR_AS_JSON64 = false; - -// Log -std::string LOG_MESSAGE_FULL = ""; - -// ----------------------------------------------------------- -// CPP BUFERs -// ----------------------------------------------------------- - -std::string CBUFER; -std::string CBUFER_ID; -std::string CBUFER_OBJ; -std::string ScriptSyntaxBuffer; -std::string ScriptBuffer; - -// ----------------------------------------------------------- -// C++ Code Inside Alif Code -// ----------------------------------------------------------- - -static bool LIB_INSIDE_CPP_CODE = false; -std::string LIB_LEXER_CG_BUFER; -std::string LIB_PARSER_CG_BUFER; - -// ----------------------------------------------------------- -// ALIF COMPILER VARs -// ----------------------------------------------------------- - -static std::map ALREADY_PARSED_FILE_TOKENS_NOT_PREDEFINED; -static std::map ALREADY_PARSED_FILE_TOKENS_PREDEFINED; - -std::string PATH_FULL_ALIF; // Desktop/myapp.alif -std::string PATH_FULL_BIN; // Desktop/mybin.bin -std::string PATH_FULL_LOG; // Desktop/myapp.log - -std::string cc_path_full; // Linux : 'gcc' | Win : c:\Alif\bin\gcc.exe -std::string PATH_FULL_CPP; // tmp/123456789.cpp -std::string PATH_FULL_OBJ; // tmp/123456789.o -std::string PATH_FULL_RC; // tmp/123456789.rc -std::string - PATH_FULL_ICO; // Mac: /usr/share/aliflang/alif.ics | Win: c:\Alif\alif.ico -#if __APPLE__ -std::string PATH_FULL_PLIST; // Mac only -std::string PATH_FULL_BIN_TMP; // Tmp/mybin.bin -#endif - -std::string PATH_ABSOLUTE; -std::string PATH_WORKING; - -std::string PATH_TEMP; // /usr/tmp -std::string RANDOM; // 1234 - -std::string PATH_FULL_LIB_SETTING; // 'gcc' | c:\Alif\aliflib\aliflib.inf -// std::map LIB_FILE_NAME; - -// Complet path of Web UI window (HTML5) file -// Used by parser #window_web -// std::string PATH_FULL_WINDOW_WEB; - -#ifdef _WIN32 -std::string SEPARATION = "\\"; -#else -std::string SEPARATION = "/"; -#endif - -// ----------------------------------------------------------- -// Compile Extra commands -// ----------------------------------------------------------- - -std::string Compile_ExtraCompile = " "; // -I/... -std::string Compile_ExtraLink = " "; // -L\"/...\" -lmylib... - -void add_extra_arg_to_compiler(std::string cmd) { - Compile_ExtraCompile.append(cmd); - Compile_ExtraCompile.append(" "); - // std::cout << "\n\n--------------\nAdd compile: |" << cmd << - // "|\n--------------\n"; -} - -void add_extra_arg_to_linker(std::string cmd) { - Compile_ExtraLink.append(cmd); - Compile_ExtraLink.append(" "); - // std::cout << "\n\n--------------\nAdd link: |" << cmd << - // "|\n--------------\n"; -} - -void add_extra_arg_to_compiler_beginning(std::string cmd) { - Compile_ExtraCompile.insert(0, (cmd + " ")); - // std::cout << "\n\n--------------\nAdd compile beginning: |" << cmd << - // "|\n--------------\n"; -} - -void add_extra_arg_to_linker_beginning(std::string cmd) { - Compile_ExtraLink.insert(0, (cmd + " ")); - // std::cout << "\n\n--------------\nAdd link beginning: |" << cmd << - // "|\n--------------\n"; -} - -// ----------------------------------------------------------- -// Python -// ----------------------------------------------------------- - -// -I/usr/include/python3.5 -// -L\"/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu\" -lpython3.5 - -std::string PythonInclude_path = ""; -std::string PythonLib_path = ""; -std::string PythonLibName = ""; - -void PythonSetEnvirenment() { - // ------------------------------- - // Python cmd: python3 -c "import sys; print(sys.path)" - // Python includes -> /usr/include/python3.5 - // Python Libs -> - // /usr/lib/python3.5/config-3.5m-x86_64-linux-gnu python lib name -> - // python3.5 - // ------------------------------- - - // TODO: if thos var are empty, then get python paths by cmd. - - std::string buffer = " -I\"" + PythonInclude_path + "\" "; - - add_extra_arg_to_compiler(buffer); - - buffer = " -L\"" + PythonLib_path + "\" -l" + PythonLibName + " "; - - add_extra_arg_to_linker(buffer); -} - -// Headers ****************************************************** - -// Core -std::string CHECK_CALL_FUN_ARG( - bool CALL_FUN_GLOBAL, - std::string CALL_WIN_OR_CLASS, // win1/class1 { fun1(int a) } | win2 { - // fun2{ عدد b; fun1(b) } } ==> win1 - std::string CALL_FUN, // win1 { fun1(int a) } | win2 { fun2{ عدد b; fun1(b) - // } } ==> fun1 - int CALL_IS_CLASS, // 0 = non class, 1 constructor, 2 = الدالة member, ل - // Message when new obj - std::string FROM_WIN_OR_CLASS, // win1 { fun1(int a) } | win2 { fun2{ عدد - // b; fun1(b) } } ==> win2 - std::string FROM_FUN, // win1 { fun1(int a) } | win2 { fun2{ عدد b; fun1(b) - // } } ==> fun2 - std::string SYNTAX[2048], int SYNTAX_LONG, CLASS_TOKEN *o_tokens); - -// Parser -void SetNewVar(bool IsGlobal, std::string TempNS, std::string TmpFunction, - std::string VarName, std::string VarDataType, bool IsConstant, - bool IsArray, int Line, CLASS_TOKEN *o_tokens); - -// void parser_NewWindowWeb(std::string Token[2048], CLASS_TOKEN *o_tokens); - -// Lexer -void AlifLexerParser(std::string file, std::string target, bool is_first_file, - bool is_predefined); - -// Log ********************************************************** - -void clean_str_json(std::string &s) { - boost::algorithm::replace_all(s, "\r", ""); - boost::algorithm::replace_all(s, "\n", ""); - boost::algorithm::trim(s); - - if (ERROR_AS_JSON64) { - // boost::beast::detail::base64::encode((void *)s.c_str(), (void - // *)s.c_str(), s.length()); size_t len = 0; _base64_encode((const - // unsigned char *) s.c_str(), s.length(), &len); - s = base64_encode(s); - boost::algorithm::replace_all(s, "\r", ""); // remove \r on windows - boost::algorithm::replace_all(s, "\n", ""); // remove \n - boost::algorithm::replace_all(s, "\\n", ""); // skip auto 72 char break - } else { - boost::algorithm::replace_all(s, "\\", "\\\\"); - boost::algorithm::replace_all(s, "\"", "\\\""); - } -} - -void ALIF_ERROR(std::string ERROR_DESCRIPTION) { - cout << endl << ERROR_DESCRIPTION << endl << endl; - - boost::nowide::ofstream file; - - if (ERROR_AS_JSON) { - clean_str_json(ERROR_DESCRIPTION); - - ERROR_DESCRIPTION = "{\"file\":\"\",\"line\":\"0\",\"msg\":\"" + - ERROR_DESCRIPTION + "\"}"; - } - - file.open(PATH_FULL_LOG, ios::app); - file << ERROR_DESCRIPTION; - file.close(); - - AlifExitFailure(); -} - -void DEBUG_MESSAGE(std::string MESSAGE, CLASS_TOKEN *o_tokens) { - LOG_MESSAGE_FULL.append(MESSAGE); - - if (DEBUG_PRINT_ON_SCREEN) { - cout << MESSAGE; - } -} - -void LogMessage(std::string MESSAGE) { - LOG_MESSAGE_FULL.append(MESSAGE); - - if (DEBUG_PRINT_ON_SCREEN) { - cout << MESSAGE; - } -} - -void PATH_FULL_LOG_SAVE() { - boost::nowide::ofstream file; - - file.open(PATH_FULL_LOG); - file << LOG_MESSAGE_FULL; - file.close(); -} - -void ErrorCode(std::string error_message, CLASS_TOKEN *o_tokens) { - if (DEBUG) - DEBUG_MESSAGE("\n ----------- ERROR --------------------------------- \n", - o_tokens); - if (DEBUG) DEBUG_MESSAGE("Namespace : " + TheNamespace + " \n", o_tokens); - if (DEBUG) DEBUG_MESSAGE("Class : " + TheClass + " \n", o_tokens); - if (DEBUG) DEBUG_MESSAGE("Fun : " + TheFunction + " \n\n", o_tokens); - - std::string error_file = o_tokens->PATH_FULL_SOURCE; - std::string error_line = - o_tokens->Line > 0 ? boost::lexical_cast(o_tokens->Line) - : "0"; - - std::string ERR_MSG; - - if (ERROR_AS_JSON) { - // JSON Format - clean_str_json(error_message); - clean_str_json(error_file); - - ERR_MSG = "{\"file\":\"" + error_file + "\",\"line\":\"" + error_line + - "\",\"msg\":\"" + error_message + "\"}"; - } else { - ERR_MSG = " الملف : " + error_file + "\n"; - ERR_MSG.append(" السطر : " + error_line + "\n"); - ERR_MSG.append("\n الخطأ : " + error_message); - } - - if (ERROR_PRINT_ON_SCREEN) - cout << "---| Alif Debug |--------------" << endl - << ERR_MSG << endl - << "------------------------" << endl; - - LOG_MESSAGE_FULL.append(ERR_MSG); - - PATH_FULL_LOG_SAVE(); - - AlifExitFailure(); -} - -// Core ********************************************************* - -// New - -void str_arr_remove_elem(std::string *arr, int to_remove, int len) { - for (int i = to_remove; i < len; ++i) { - arr[i] = arr[i + 1]; - } - - arr[len] = "\0"; -} - -void err(std::string des) { - std::cout << "[!] Error" << std::endl << des << std::endl; - - // IDE must redirect output to a log file. - // no more log file like Alif v2 series. - - // boost::nowide::ofstream file; - // file.open (PATH_FULL_LOG, ios::app); - // file << des; - // file.close(); - - AlifExitFailure(); -} - -std::string get_path(std::string str) { return ""; } - -bool is_file_exists(std::string f) { - // std::cout << "is_file_exists(" << f << ");" << std::endl; - - boost::nowide::ifstream infile(f); - return infile.good(); -} - -void file_embed(std::string file_path, std::string &var, - CLASS_TOKEN *o_tokens) { - // This function can be completely be replaced in c++20 by - // This function basically read a file and update ref by the file - // content (const string). - - if (!is_file_exists(file_path)) - ErrorCode("ملف غير موجود : ' " + file_path + " ' ", o_tokens); - - boost::nowide::ifstream rBuffer(file_path); - stringstream buf; - buf << rBuffer.rdbuf(); - rBuffer.close(); - - var.clear(); - // var.append(buf.str()); - var = buf.str(); -} - -// Old - -int Generated_ID = 10000; -int ID_GENERATOR() { - // return rand() % 10 + 10000; - return Generated_ID++; -} - -bool replace(std::string &str, const std::string &from, const std::string &to) { - size_t start_pos = str.find(from); - - if (start_pos == std::string::npos) return false; - - str.replace(start_pos, from.length(), to); - - return true; -} - -bool replace_end(std::string &str, const std::string &from, - const std::string &to) { - size_t start_pos = str.rfind(from); - - if (start_pos == std::string::npos) return false; - - str.replace(start_pos, from.length(), to); - - return true; -} - -std::string substr_utf8(std::string originalString, int Position, int MaxLen) { - std::string resultString_start = originalString; - const char *aStr_start = originalString.c_str(); - - int len = 0; - int byteCount = 0; - - if (Position > 0) { - while (*aStr_start) { - if ((*aStr_start & 0xc0) != 0x80) { - len += 1; - } - - if (len > Position) { - resultString_start = resultString_start.substr(byteCount); - break; - } - - byteCount++; - - aStr_start++; - } - } - - if (MaxLen == 0) { - return resultString_start; - } else { - // Initialization - len = 0; - byteCount = 0; - - std::string resultString = resultString_start; - - const char *aStr = resultString_start.c_str(); - - while (*aStr) { - if ((*aStr & 0xc0) != 0x80) { - len += 1; - } - - if (len > MaxLen) { - resultString = resultString.substr(0, byteCount); - break; - } - - byteCount++; - aStr++; - } - - return resultString; - } -} - -std::string IntToString(int INT_VAL) { - // Int --> String - - stringstream STRING_STREAM_BUFFER; - STRING_STREAM_BUFFER << INT_VAL; - std::string STRING_BUFFER = STRING_STREAM_BUFFER.str(); - return STRING_BUFFER; -} - -std::string CONVERT_STRING_ARRAY_TO_STRING(std::string STRING_ARRAY_VAL[1024], - int LONG) { - // std::string[123] --> String - stringstream STRING_STREAM_BUFFER; - - if (LONG < 1) return ""; - - for (int p = 0; p <= LONG; p++) { - STRING_STREAM_BUFFER << STRING_ARRAY_VAL[p]; - } - - std::string STRING_BUFFER = STRING_STREAM_BUFFER.str(); - return STRING_BUFFER; -} - -std::string CONVERT_WCHAT_T_TO_STRING(wchar_t *WCHART_T_VAL) { - // wchar_t --> String - - // const wstring W_STRING_BUFFER (WCHART_T_VAL); - // const std::string STRING_BUFFER (W_STRING_BUFFER.begin(), - // W_STRING_BUFFER.end()); return STRING_BUFFER; - - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - return converterX.to_bytes(WCHART_T_VAL); -} - -std::string CONVERT_CHAR_TO_STRING(char *CHART_VAL) { - // Char --> String - std::string STRING_BUFFER(CHART_VAL); - return STRING_BUFFER; -} - -std::wstring s_to_ws(const std::string &str) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - - return converterX.from_bytes(str); -} - -std::string ws_to_s(const std::wstring &wstr) { - using convert_typeX = std::codecvt_utf8; - std::wstring_convert converterX; - - return converterX.to_bytes(wstr); -} - -// ----------------------------------------------------------- -// Bse64 -// ----------------------------------------------------------- - -// https://github.com/ReneNyffenegger/cpp-base64/blob/master/base64.cpp - -static const std::string base64_chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; - -static inline bool is_base64(unsigned char c) { - return (isalnum(c) || (c == '+') || (c == '/')); -} - -// const std::string s = "..."; -// std::string encoded = base64_encode(reinterpret_cast(s.c_str()), s.length()); std::string decoded = base64_decode(encoded); - -std::string base64_encode(unsigned char const *bytes_to_encode, - unsigned int in_len) { - std::string ret; - int i = 0; - int j = 0; - unsigned char char_array_3[3]; - unsigned char char_array_4[4]; - - while (in_len--) { - char_array_3[i++] = *(bytes_to_encode++); - if (i == 3) { - char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; - char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + - ((char_array_3[1] & 0xf0) >> 4); - char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + - ((char_array_3[2] & 0xc0) >> 6); - char_array_4[3] = char_array_3[2] & 0x3f; - - for (i = 0; (i < 4); i++) ret += base64_chars[char_array_4[i]]; - i = 0; - } - } - - if (i) { - for (j = i; j < 3; j++) char_array_3[j] = '\0'; - - char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; - char_array_4[1] = - ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); - char_array_4[2] = - ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); - - for (j = 0; (j < i + 1); j++) ret += base64_chars[char_array_4[j]]; - - while ((i++ < 3)) ret += '='; - } - - return ret; -} - -/* -std::string base64_decode(std::string const& encoded_string) { -size_t in_len = encoded_string.size(); -int i = 0; -int j = 0; -int in_ = 0; -unsigned char char_array_4[4], char_array_3[3]; -std::string ret; - -while (in_len-- && ( encoded_string[in_] != '=') && -is_base64(encoded_string[in_])) { char_array_4[i++] = encoded_string[in_]; -in_++; if (i ==4) { for (i = 0; i <4; i++) char_array_4[i] = -base64_chars.find(char_array_4[i]) & 0xff; - - char_array_3[0] = ( char_array_4[0] << 2 ) + ((char_array_4[1] & -0x30) >> 4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + -((char_array_4[2] & 0x3c) >> 2); char_array_3[2] = ((char_array_4[2] & 0x3) << -6) + char_array_4[3]; - - for (i = 0; (i < 3); i++) - ret += char_array_3[i]; - i = 0; - } -} - -if (i) { - for (j = 0; j < i; j++) - char_array_4[j] = base64_chars.find(char_array_4[j]) & 0xff; - - char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> -4); char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) ->> 2); - - for (j = 0; (j < i - 1); j++) ret += char_array_3[j]; -} - -return ret; -} -*/ - -// ----------------------------------------------------------- -// CPP Set Variables Name -// ----------------------------------------------------------- - -static std::map ID; // abc[var] = V1000 -static std::map Global_ID; // abc[var] = G_V1000 -static std::map Control_ID; // abc[var] = C_V1000 -static std::map Obj_ID; // abc[var] = OBJ_V1000 -static std::map - GlobalObj_ID; // abc[var] = G_OBJ_V1000 - -void SET_OBJ_C_NAME(std::string VAR) { - if (Obj_ID[VAR] == "") Obj_ID[VAR] = "OBJ_" + IntToString(ID_GENERATOR()); -} - -void SET_GLOBAL_OBJ_C_NAME(std::string VAR) { - if (GlobalObj_ID[VAR] == "") - GlobalObj_ID[VAR] = "G_OBJ_" + IntToString(ID_GENERATOR()); -} - -void SET_C_NAME(std::string VAR) { - if (ID[VAR] == "") ID[VAR] = "V_" + IntToString(ID_GENERATOR()); -} - -void SET_GLOBAL_C_NAME(std::string VAR) { - if (Global_ID[VAR] == "") - Global_ID[VAR] = "G_V_" + IntToString(ID_GENERATOR()); -} - -void SET_CONTROL_C_NAME(std::string VAR) { - if (Control_ID[VAR] == "") - Control_ID[VAR] = "C_V_" + IntToString(ID_GENERATOR()); -} - -bool IsInArray_v(const std::string &value, - const std::vector &array) { - return std::find(array.begin(), array.end(), value) != array.end(); -} - -bool IsDataType(const std::string &value) { - return IsInArray_v(value, DataType_v); -} - -// ----------------------------------------------------------- -// Get UTF8 Total Leng -// ----------------------------------------------------------- - -int CharCount_utf8(std::string LINE8, CLASS_TOKEN *o_tokens) { - // ------------------------------------------------------ - // check ل invalid utf-8 - // ل a simple yes/no check, - // there is also utf8::is_valid function - // ------------------------------------------------------ - - std::string::iterator LINE_END_IT = - utf8::find_invalid(LINE8.begin(), LINE8.end()); - - if (LINE_END_IT != LINE8.end()) { - ALIF_ERROR("ERROR : Invalid UTF-8 encoding at line " + - IntToString(o_tokens->TOTAL_LINES)); - } - - // ------------------------------------------------------ - // تحويل line UTF8 إلى UTF32 ل fix character size - // is needed إلى count chars in line - // ------------------------------------------------------ - - // vector LINE32; - std::string LINE32; - utf8::utf8to32(LINE8.begin(), LINE_END_IT, back_inserter(LINE32)); - - // ------------------------------------------------------ - // Count chars - // ------------------------------------------------------ - - int LINE_LEN = LINE32.length(); - int LINE_UNIT = 0; - int CHAR_COUNT32 = 0; - const char *LINE_C_STR = LINE32.c_str(); - - while (LINE_UNIT < LINE_LEN) { - LINE_UNIT += mblen(&LINE_C_STR[LINE_UNIT], LINE_LEN - LINE_UNIT); - CHAR_COUNT32 += 1; - } - - return CHAR_COUNT32; -} - -// ==================================================== - -std::string GET_REAL_LINE_MID(int START, int TOKEN_POSITION, - CLASS_TOKEN *o_tokens) { - if (DEBUG) - DEBUG_MESSAGE( - "REAL_LINE : |" + o_tokens->REAL_LINE[o_tokens->Line] + "| \n", - o_tokens); - if (DEBUG) DEBUG_MESSAGE("START : " + IntToString(START) + " \n", o_tokens); - if (DEBUG) - DEBUG_MESSAGE("TOKEN_POSITION : " + IntToString(TOKEN_POSITION) + " \n", - o_tokens); - if (DEBUG) - DEBUG_MESSAGE( - "REAL_TOKEN_POSITION : " + - IntToString(o_tokens->REAL_TOKEN_POSITION[std::make_pair( - o_tokens->Line, TOKEN_POSITION)]) + - " \n", - o_tokens); - - if (START < 0 || TOKEN_POSITION < 1) // Exception ! - return o_tokens->REAL_LINE[o_tokens->Line]; - - std::string BUFFER; - - BUFFER = substr_utf8(o_tokens->REAL_LINE[o_tokens->Line], START, - o_tokens->REAL_TOKEN_POSITION[std::make_pair( - o_tokens->Line, TOKEN_POSITION)]); - - if (BUFFER.empty()) - return o_tokens->REAL_LINE[o_tokens->Line]; // Empty, So tray to return - // full real line ! - else - return BUFFER; // Return the SubStr requested. -} - -// ==================================================== - -bool IsValidStringFormat(std::string STRING, CLASS_TOKEN *o_tokens) { - if (substr_utf8(STRING, 0, 1) != "\"") return false; - - if (substr_utf8(STRING, (CharCount_utf8(STRING, o_tokens) - 1), 1) != "\"") - return false; - - return true; -} - -/* -bool IsValidStringFormatOrStringVar(std::string STRING, CLASS_TOKEN *o_tokens){ - - // TODO : We need add support for global class var, global var. - - if (L_VAR_IS_SET[std::make_pair(TheNamespace + TheFunction, STRING)] || - L_VAR_IS_SET[std::make_pair(TheClass + TheFunction, STRING)]){ - - std::string CLASS_OR_WIN; - if (IsInsideClass) - CLASS_OR_WIN = TheClass; - else - CLASS_OR_WIN = TheNamespace; - - if(L_VAR_TYPE[std::make_pair(CLASS_OR_WIN + TheFunction, -STRING)] != "نص") return false; - } - else { - - if (substr_utf8(STRING, 0, 1) != "\"") - return false; - - if (substr_utf8(STRING, (CharCount_utf8(STRING, o_tokens) - 1), -1) != "\"") return false; - } - - return true; -} -*/ - -// ==================================================== - -std::string REMOVE_DOUBLE_SPACE(std::string LINE_BUFFER, - CLASS_TOKEN *o_tokens) { - std::string Char; - std::string BUFFER; - - bool INSIDE = false; - bool VALID_CHAR = false; - bool LAST_IS_SPACE = false; - - // Remove Extra Spaces - // and Trim line end. - for (int I = 0; I < CharCount_utf8(LINE_BUFFER, o_tokens); I++) { - Char = substr_utf8(LINE_BUFFER, I, 1); - - if (Char == "\"") { - INSIDE = !INSIDE; - BUFFER.append("\""); - } else if (Char == "\xEF\xBB\xBF") // BOM Signe in first char of file - { - if (DEBUG) DEBUG_MESSAGE("[BOM]", o_tokens); // LOG - } - // else if (Char == "\u202E") // RIGHT-TO-LEFT OVERRIDE singe, إلى force - // RTL - // { - // if(DEBUG) - // DEBUG_MESSAGE("[RTL]", o_tokens); // LOG - // } - else if (Char == " " || Char == "\t") { - if (INSIDE) { - BUFFER.append(Char); - } else { - if (VALID_CHAR) { - if (!LAST_IS_SPACE) { - BUFFER.append(" "); - LAST_IS_SPACE = true; - } - } - } - } else { - VALID_CHAR = true; - LAST_IS_SPACE = false; - BUFFER.append(Char); - } - } - - // Trim line end. - for (int D = CharCount_utf8(BUFFER, o_tokens); D > 0; D--) { - Char = substr_utf8(BUFFER, (D - 1), 1); - - if (Char != " " && Char != "\t") { - BUFFER = substr_utf8(BUFFER, 0, D); - break; - } - } - - return BUFFER; -} - -// ==================================================== - -bool IsValidDigit(std::string DIGIT, bool FLOAT, CLASS_TOKEN *o_tokens) { - int I = 0; - int TOTAL_CHAR = CharCount_utf8(DIGIT, o_tokens); - std::string Char; - bool First = true; - bool DECIMAL = false; - - // 100 --> TRUE - // -100 --> TRUE - // -10.25 --> TRUE - // -10,25 --> TRUE - // -10،25 --> TRUE - - if (CharCount_utf8(DIGIT, o_tokens) > 1 && - (substr_utf8(DIGIT, 0, 1) == "-" || substr_utf8(DIGIT, 0, 1) == "+")) { - I = 1; - } - - while (I < TOTAL_CHAR) { - Char = substr_utf8(DIGIT, I, 1); - - if (Char == "." || Char == "," || Char == "،") { - if (First) { - return false; // .123 - } - - if (I == (TOTAL_CHAR - 1)) { - return false; // 123. - } - - if (!FLOAT) { - return false; // 12.3, but need integer not float. - } - - if (DECIMAL) { - return false; // 1.2.3 - } - - DECIMAL = true; - } else if (Char != "0" && Char != "1" && Char != "2" && Char != "3" && - Char != "4" && Char != "5" && Char != "6" && Char != "7" && - Char != "8" && Char != "9") { - return false; - } - - I++; - First = false; - } - - return true; -} - -// ==================================================== - -bool CAN_ADD_OPERATION_HERE(std::string TOKEN_LAST) { - // = 1 + 2 * (3 / 4 - 5) + 6 - // IF - - /* - if (IS_IF_SYNTAX) - { - if ((TOKEN_LAST == "=") || - (TOKEN_LAST == "+") || - (TOKEN_LAST == "-") || - (TOKEN_LAST == "*") || - (TOKEN_LAST == "/") || - - (TOKEN_LAST != "<") || - (TOKEN_LAST != ">") || - (TOKEN_LAST != "و") || - (TOKEN_LAST != "أو") || - - (TOKEN_LAST == "(")) - return false; - } - else - { - */ - if ((TOKEN_LAST == "=") || (TOKEN_LAST == "+") || (TOKEN_LAST == "-") || - (TOKEN_LAST == "*") || (TOKEN_LAST == "/") || (TOKEN_LAST == "(")) - return false; - - //} - - return true; -} - -bool CAN_ADD_VAR_HERE(std::string TOKEN_LAST) { - // str / عدد = متغير + متغير * (var / متغير - var) - - /* - if (IS_IF_SYNTAX) - { - if ((TOKEN_LAST != "+") && - (TOKEN_LAST != "-") && - (TOKEN_LAST != "*") && - (TOKEN_LAST != "/") && - (TOKEN_LAST != "=") && - - (TOKEN_LAST != "<") && - (TOKEN_LAST != ">") && - (TOKEN_LAST != "و") && - (TOKEN_LAST != "أو") && - - (TOKEN_LAST != "(")) - return false; - } - else - { - */ - if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && - (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && (TOKEN_LAST != "(")) - return false; - - //} - - return true; -} - -// ==================================================== - -bool CAN_ADD_FUN_HERE(std::string TOKEN_LAST) { - // str / عدد = متغير + fun(var) * (fun(var) / fun(var, fun(var), var) - var) - - /* - if (IS_IF_SYNTAX) - { - if ((TOKEN_LAST != "+") && - (TOKEN_LAST != "-") && - (TOKEN_LAST != "*") && - (TOKEN_LAST != "/") && - (TOKEN_LAST != "=") && - (TOKEN_LAST != "،") && - (TOKEN_LAST != ",") && - - (TOKEN_LAST != "<") && - (TOKEN_LAST != ">") && - (TOKEN_LAST != "و") && - (TOKEN_LAST != "أو") && - - (TOKEN_LAST != "(")) - return false; - } - */ - - if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && - (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && (TOKEN_LAST != "،") && - (TOKEN_LAST != ",") && (TOKEN_LAST != "(")) - return false; - - return true; -} - -// ==================================================== - -bool CAN_ADD_PARENTHESIS_OPEN_HERE(std::string TOKEN_LAST) { - // = ((1)) + (2 * (3 / (4) - 5) +( 6)) - // IF = (a + s < b * h) او (z + 2) != (x - 7) و (z = x) - - if (IS_IF_SYNTAX) { - if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && - (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && - - (TOKEN_LAST != "<") && (TOKEN_LAST != ">") && (TOKEN_LAST != "و") && - (TOKEN_LAST != "أو") && - - (TOKEN_LAST != "(")) - return true; - } else { - if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && - (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && (TOKEN_LAST != "(")) - return false; - } - - return true; -} - -// ==================================================== - -std::string IsValidVar_Type = "عادم"; - -bool IsValidVar(std::string Var, CLASS_TOKEN *o_tokens) { - IsValidVar_Type = "عادم"; - - if (Var == "") { - return false; - } else if (Var == "صحيح" || Var == "خطأ") { - IsValidVar_Type = "منطق"; - return true; - } else if (IsValidStringFormat(Var, o_tokens)) { - // STRING - - IsValidVar_Type = "نص"; - return true; - } else if (IsValidDigit(Var, true, o_tokens)) { - // DIGIT - - IsValidVar_Type = "عدد"; - return true; - } else if ((substr_utf8(Var, 0, 1) == "_" && - G_VAR_IS_SET[( - substr_utf8(Var, 1, CharCount_utf8(Var, o_tokens)))])) { - // Global متغير _ - - IsValidVar_Type = - G_VAR_TYPE[substr_utf8(Var, 1, CharCount_utf8(Var, o_tokens))]; - return true; - } else if (L_VAR_IS_SET[std::make_pair(TheNamespace + TheFunction, Var)]) { - // Local Var - - IsValidVar_Type = - L_VAR_TYPE[std::make_pair(TheNamespace + TheFunction, Var)]; - return true; - } else if (L_VAR_IS_SET[std::make_pair(TheClass + TheFunction, Var)]) { - // Class Local Var - - IsValidVar_Type = - L_VAR_TYPE[std::make_pair(TheClass + TheFunction, Var)]; - return true; - } else if (G_VAR_IS_SET[(Var)]) { - // Global Var - - IsValidVar_Type = G_VAR_TYPE[Var]; - return true; - } else if (CLASS_G_VAR_IS_SET[std::make_pair(TheClass, Var)] && - IsInsideClass) { - // Class Global Var - - IsValidVar_Type = CLASS_G_VAR_TYPE[std::make_pair(TheClass, Var)]; - return true; - } else if (G_FUN_IS_SET[(Var)]) { - // Global Function - - IsValidVar_Type = G_FUN_TYPE[Var]; - return true; - } else if (L_FUN_IS_SET[std::make_pair(TheNamespace, Var)]) { - // Local Function - IsValidVar_Type = L_FUN_TYPE[std::make_pair(TheNamespace, Var)]; - - return true; - } else if (L_FUN_IS_SET[std::make_pair(TheClass, Var)]) { - // Class Local Function - - IsValidVar_Type = L_FUN_TYPE[std::make_pair(TheClass, Var)]; - return true; - } - // else if (OBJ_IS_SET[std::make_pair("", Var)]){ - // - // // Global OBJ - // - // IsValidVar_Type = "OBJ"; - // return true; - // } - - // else if (CONTROL_WIN_IS_SET[Var]){ - // // namespace: (By UI) - // IsValidVar_Type = "عادم"; - // return true; - // } - - else if (namespace_is_set[Var]) { - // namespace: (By Code) - - IsValidVar_Type = "عادم"; - return true; - } - - // else if (CONTROL_IS_SET[std::make_pair(TheNamespace, Var)]){ - // // Control: - // IsValidVar_Type = "عادم"; - // return true; - // } - - else - return false; -} - -// ==================================================== - -bool CAN_ADD_PARENTHESIS_CLOSE_HERE(std::string TOKEN_LAST) { - // = ((1)) + (2 * (3 / (4) - 5) + ( 6)) + () - - if (TOKEN_LAST == "(") // إلى avoid ... () ... - return false; - - if ((TOKEN_LAST == "=") || (TOKEN_LAST == "+") || (TOKEN_LAST == "-") || - (TOKEN_LAST == "*") || (TOKEN_LAST == "/")) - return false; - - return true; -} - -// ==================================================== - -bool CAN_ADD_DIGIT_HERE(std::string TOKEN_LAST) { - // = 1 + 2 * (3 / 4 - 5) + 6 - - /* - if (IS_IF_SYNTAX) - { - if ((TOKEN_LAST != "+") && - (TOKEN_LAST != "-") && - (TOKEN_LAST != "*") && - (TOKEN_LAST != "/") && - (TOKEN_LAST != "=") && - - (TOKEN_LAST != "<") && - (TOKEN_LAST != ">") && - (TOKEN_LAST != "و") && - (TOKEN_LAST != "أو") && - - (TOKEN_LAST != "(")) - return false; - } - else - { - */ - if ((TOKEN_LAST != "+") && (TOKEN_LAST != "-") && (TOKEN_LAST != "*") && - (TOKEN_LAST != "/") && (TOKEN_LAST != "=") && (TOKEN_LAST != "(")) - return false; - //} - - return true; -} - -// ==================================================== - -std::string remove_quote(std::string STRING, CLASS_TOKEN *o_tokens) { - std::string MESSAGE_BUFFER; - - if (CharCount_utf8(STRING, o_tokens) < 3) // "" Emty std::string - return ""; // 3 is the minimum msg, "a" - - MESSAGE_BUFFER = substr_utf8(STRING, 1, CharCount_utf8(STRING, o_tokens)); - MESSAGE_BUFFER = substr_utf8( - MESSAGE_BUFFER, 0, (CharCount_utf8(MESSAGE_BUFFER, o_tokens) - 1)); - - return MESSAGE_BUFFER; -} - -// ==================================================== - -void CheckForSameGlobalID(std::string Name, CLASS_TOKEN *o_tokens) { - // check if same name with any already global declaration - - if (OBJ_IS_SET[std::make_pair("", Name)]) { - // same name with Global Obj - ErrorCode( - "تشابه في الاسم مع كائن عام ثم إنشائه مسبقا، المرجو تغيير الاسم : " - "' " + - Name + " ' ", - o_tokens); - } else if (CLASS_IS_SET[Name]) { - // same name with Class - ErrorCode( - "تشابه في الاسم مع صنف ثم إنشائه مسبقا، المرجو تغيير الاسم : ' " + - Name + " ' ", - o_tokens); - } else if (G_VAR_IS_SET[(Name)] && G_VAR_TYPE[(Name)] == "عدد") { - // same name with Global INT - ErrorCode( - "تشابه في الاسم مع متغير عددي ثم إنشائه مسبقا، المرجو تغيير " - "الاسم : ' " + - Name + " ' ", - o_tokens); - } else if (G_VAR_IS_SET[(Name)] && G_VAR_TYPE[(Name)] == "نص") { - // same name with Global STRING - ErrorCode( - "تشابه في الاسم مع متغير نصي ثم إنشائه مسبقا، المرجو تغيير الاسم : " - "' " + - Name + " ' ", - o_tokens); - } else if (G_VAR_IS_SET[(Name)] && G_VAR_TYPE[(Name)] == "منطق") { - // same name with Global BOOL - ErrorCode( - "تشابه في الاسم مع متغير منطقي ثم إنشائه مسبقا، المرجو تغيير " - "الاسم : ' " + - Name + " ' ", - o_tokens); - } else if (G_FUN_IS_SET[(Name)]) { - // same name with Global Function - ErrorCode( - "تشابه في الاسم مع دالة عامة ثم إنشائها مسبقا، المرجو تغيير " - "الاسم : ' " + - Name + " ' ", - o_tokens); - } - - else if (namespace_is_set[Name]) // || CONTROL_WIN_IS_SET[Name] - { - // same name with Namespace - ErrorCode( - "تشابه في الاسم مع مجال ثم إنشائها مسبقا، المرجو تغيير الاسم : ' " + - Name + " ' ", - o_tokens); - } -} - -bool IsValidName(std::string Name, CLASS_TOKEN *o_tokens) { - std::string Char; - bool First = true; - - for (int I = 0; I <= CharCount_utf8(Name, o_tokens); I++) { - Char = substr_utf8(Name, I, 1); - - if (Char == "_" || // Allow, Example : ABC_XZ1 - Char == "0" || Char == "1" || Char == "2" || Char == "3" || - Char == "4" || Char == "5" || Char == "5" || Char == "6" || - Char == "8" || Char == "9" || - - Char == "۰" || // 0, Zero In Arabic, ITS NOT A DOT! - Char == "۱" || // 1 - Char == "۲" || // 2 - Char == "۳" || // 3 - Char == "۴" || // 4 - Char == "۵" || // 5 - Char == "۶" || // 6 - Char == "۷" || // 7 - Char == "۸" || // 8 - Char == "۹") // 9 - { - if (First) { - ErrorCode( - "أول حرف في الإسم يجب أن يكون حرفا، و ليس رقم أو إشارة : " - "' " + - Char + " ' ", - o_tokens); - return false; - } - } else if (Char == "." || // Allow DOT in متغير names ABC.DEF - Char == "," || Char == "،" || // اشارة ، - Char == "{" || Char == "}" || Char == "|" || Char == "~" || - // Char == "_" || Allow AB_C - Char == "$" || Char == "#" || Char == ":" || Char == "!" || - Char == ";" || Char == "?" || Char == "'" || Char == "-" || - Char == "/" || Char == "=" || Char == "\\" || Char == "^" || - Char == "\"" || Char == "%" || Char == ")" || Char == "(" || - Char == "*" || Char == "+" || Char == "<" || Char == ">" || - Char == "@" || Char == "[" || Char == "]" || Char == "&" || - Char == " " || // Space - Char == " " || // Tab - Char == "") { - if (Char == " ") { - if (!IS_CONTROL_FUNCTION_NAME) { - ErrorCode("حرف غير مقبول : ' " + Char + " ' داخل ' " + - Name + " ' ", - o_tokens); - return false; // Exception ! - } - - IS_CONTROL_FUNCTION_NAME = false; - return true; - } - - ErrorCode("حرف غير مقبول : ' " + Char + " ' داخل ' " + Name + " ' ", - o_tokens); - return false; - } - - First = false; - } // End char loop. - - for (int i = 0; i <= ALIF_RESERVED_TOTAL; i++) { - if (ALIF_RESERVED[i] == Name) { - // if (Name == "رئيسية" && IsInsideClass) - // continue; - - ErrorCode("عفوا، هذا الاسم محجوز في لغة ألف : ' " + Name + " ' ", - o_tokens); - } - } - - IS_CONTROL_FUNCTION_NAME = false; - return true; -} - -// ==================================================== - -void ADD_FUN(bool GLOBAL, std::string NS_Name, std::string FUN_NAME, - std::string TYPE, int Line, CLASS_TOKEN *o_tokens) { - if (!IsValidName(FUN_NAME, o_tokens)) - ErrorCode("اسم غير مقبول : ' " + FUN_NAME + " ' ", o_tokens); - - // if same name as Namespace ! - if (NS_Name == FUN_NAME) - ErrorCode("تشابه في الاسم بين الدالة و المجال ' " + FUN_NAME + " ' ", - o_tokens); - - if (GLOBAL) { - // if already exist global fun - if (G_FUN_IS_SET[(FUN_NAME)]) { - ErrorCode("الدالة العامه ' " + FUN_NAME + - " ' تم انشاؤها مسبقا في السطر : " + - G_FUN_AT_LINE[(FUN_NAME)], - o_tokens); - } - - // if already any other type of global var exist - CheckForSameGlobalID(FUN_NAME, o_tokens); - - G_FUN_TYPE[(FUN_NAME)] = TYPE; - G_FUN_IS_SET[(FUN_NAME)] = true; - G_FUN_AT_LINE[(FUN_NAME)] = IntToString(Line); - - Global_FunctionNames[Global_TotalFucntion] = FUN_NAME; - Global_TotalFucntion++; - - if (TYPE == "عادم") RETURN_FUN[std::make_pair("", FUN_NAME)] = "OK"; - - // *** Generate Code *** - SET_GLOBAL_C_NAME(FUN_NAME); - // *** *** *** *** *** *** - } else { - // if already exist local fun - if (L_FUN_IS_SET[std::make_pair(NS_Name, FUN_NAME)]) { - ErrorCode("الدالة ' " + FUN_NAME + - " ' تم انشاؤها مسبقا في السطر : " + - L_FUN_AT_LINE[std::make_pair(NS_Name, FUN_NAME)], - o_tokens); - } - - L_FUN_TYPE[std::make_pair(NS_Name, FUN_NAME)] = TYPE; - L_FUN_IS_SET[std::make_pair(NS_Name, FUN_NAME)] = true; - L_FUN_AT_LINE[std::make_pair(NS_Name, FUN_NAME)] = IntToString(Line); - - if (TYPE == "عادم") - RETURN_FUN[std::make_pair(NS_Name, FUN_NAME)] = "OK"; - - // *** Generate Code *** - SET_C_NAME(FUN_NAME); - // *** *** *** *** *** *** - } -} - -void SetNewVar(bool IsGlobal, std::string TempNS, std::string TmpFunction, - std::string VarName, std::string VarDataType, bool IsConstant, - bool IsArray, int Line, CLASS_TOKEN *o_tokens) { - if (!IsValidName(VarName, o_tokens)) - ErrorCode("اسم غير مقبول : ' " + VarName + " ' ", o_tokens); - - if (TmpFunction == VarName) - ErrorCode("تشابه في الاسم بين المتغير و الدالة ' " + VarName + " ' ", - o_tokens); - - if (IsGlobal) { - if (G_VAR_IS_SET[(VarName)]) - ErrorCode( - "المتغير العام ' " + VarName + - " ' تم انشاؤه مسبقا في السطر : " + G_VAR_AT_LINE[(VarName)], - o_tokens); - - CheckForSameGlobalID(VarName, o_tokens); - - G_VAR_TYPE[(VarName)] = VarDataType; - G_VAR_IS_SET[(VarName)] = true; - G_VAR_AT_LINE[(VarName)] = IntToString(Line); - G_VAR_IS_CONST[(VarName)] = IsConstant; - G_VAR_IS_ARRAY[(VarName)] = IsArray; - G_VAR_NAMES[G_VAR_TOTAL] = VarName; - G_VAR_TOTAL++; - - // *** Generate Code *** - SET_GLOBAL_C_NAME(VarName); - // *** *** *** *** *** *** - } else { - if (L_VAR_IS_SET[std::make_pair(TempNS + TmpFunction, VarName)]) { - ErrorCode("المتغير ' " + VarName + - " ' تم انشاؤه مسبقا في السطر : " + - L_VAR_AT_LINE[std::make_pair(TempNS + TmpFunction, - VarName)], - o_tokens); - } - - L_VAR_TYPE[std::make_pair(TempNS + TmpFunction, VarName)] = VarDataType; - L_VAR_IS_SET[std::make_pair(TempNS + TmpFunction, VarName)] = true; - L_VAR_AT_LINE[std::make_pair(TempNS + TmpFunction, VarName)] = - IntToString(Line); - L_VAR_IS_CONST[std::make_pair(TempNS + TmpFunction, VarName)] = - IsConstant; - L_VAR_IS_ARRAY[std::make_pair(TempNS + TmpFunction, VarName)] = IsArray; - - // *** Generate Code *** - SET_C_NAME(VarName); - // *** *** *** *** *** *** - } -} - -void SetNewVarClass(bool IsGlobal, bool IsPrivate, std::string ClassName, - std::string FunctionName, std::string VarName, - std::string VarDataType, bool IsConstant, bool IsArray, - int Line, CLASS_TOKEN *o_tokens) { - if (!IsValidName(VarName, o_tokens)) - ErrorCode("اسم غير مقبول : ' " + VarName + " ' ", o_tokens); - - if (!IsGlobal && IsPrivate) - ErrorCode("يجب استخدام ' خاص ' خارج الدالة", o_tokens); - - if (ClassName == VarName) - ErrorCode("تشابه في الاسم بين المتغير و الصنف ' " + VarName + " ' ", - o_tokens); - - if (IsGlobal) { - if (CLASS_G_VAR_IS_SET[std::make_pair(ClassName, VarName)]) { - ErrorCode( - "المتغير العام ' " + VarName + - " ' تم انشاؤه مسبقا في السطر : " + - CLASS_G_VAR_AT_LINE[std::make_pair(ClassName, VarName)], - o_tokens); - } - - /* - if (G_VAR_IS_SET[(VarName)]) - { - ErrorCode("المتغير العام ' " + VarName + " ' تم انشاؤه مسبقا في - السطر : " + CLASS_G_VAR_AT_LINE[std::make_pair(ClassName, VarName)], - o_tokens); - } - */ - - CLASS_G_VAR_TYPE[std::make_pair(ClassName, VarName)] = VarDataType; - CLASS_G_VAR_IS_SET[std::make_pair(ClassName, VarName)] = true; - CLASS_G_VAR_AT_LINE[std::make_pair(ClassName, VarName)] = - IntToString(Line); - CLASS_G_VAR_PRIVATE[std::make_pair(ClassName, VarName)] = IsPrivate; - CLASS_G_VAR_IS_CONST[std::make_pair(ClassName, VarName)] = IsConstant; - CLASS_G_VAR_IS_ARRAY[std::make_pair(ClassName, VarName)] = IsArray; - - // *** Generate Code *** - SET_GLOBAL_C_NAME(VarName); - // *** *** *** *** *** *** - } else { - if (L_VAR_IS_SET[std::make_pair(ClassName + FunctionName, VarName)]) { - ErrorCode("المتغير ' " + VarName + - " ' تم انشاؤه مسبقا في السطر : " + - L_VAR_AT_LINE[std::make_pair(ClassName + FunctionName, - VarName)], - o_tokens); - } - - L_VAR_TYPE[std::make_pair(ClassName + FunctionName, VarName)] = - VarDataType; - L_VAR_IS_SET[std::make_pair(ClassName + FunctionName, VarName)] = true; - L_VAR_AT_LINE[std::make_pair(ClassName + FunctionName, VarName)] = - IntToString(Line); - L_VAR_IS_CONST[std::make_pair(ClassName + FunctionName, VarName)] = - IsConstant; - L_VAR_IS_ARRAY[std::make_pair(ClassName + FunctionName, VarName)] = - IsArray; - - // *** Generate Code *** - SET_C_NAME(VarName); - // *** *** *** *** *** *** - } -} - -std::string GetSyntaxDataType(std::string Token[1024], int Position, - CLASS_TOKEN *o_tokens) { - // Token[Position] -> '=' - - if (IsValidVar(Token[Position + 1], o_tokens)) return IsValidVar_Type; - - return {}; -} - -void ADD_FUN_CLASS(bool PRIVATE, std::string CLASS_NAME, std::string FUN_NAME, - std::string TYPE, int Line, CLASS_TOKEN *o_tokens) { - if (!IsValidName(FUN_NAME, o_tokens)) - ErrorCode("اسم غير مقبول : ' " + FUN_NAME + " ' ", o_tokens); - - // if already exist class fun - if (CLASS_FUN_IS_SET[std::make_pair(CLASS_NAME, FUN_NAME)]) { - ErrorCode("الصنف الدالة ' " + FUN_NAME + - " ' تم انشاؤها مسبقا في السطر : " + - CLASS_FUN_AT_LINE[std::make_pair(CLASS_NAME, FUN_NAME)], - o_tokens); - } - - // if already same Generated_ID with global class var. - if (CLASS_G_VAR_IS_SET[std::make_pair(CLASS_NAME, FUN_NAME)]) { - ErrorCode( - "تشابه في الاسم مع متغير ' " + FUN_NAME + " ' في السطر : " + - CLASS_G_VAR_AT_LINE[std::make_pair(CLASS_NAME, FUN_NAME)] + " ", - o_tokens); - } - // else - // if(DEBUG)DEBUG_MESSAGE("---C " + CLASS_NAME + " :F " + FUN_NAME + " - // E---", o_tokens); // DEBUG - - // if same name as class ! - if (CLASS_NAME == FUN_NAME) - ErrorCode( - "تشابه في الاسم بين الدالة و الصنف ' " + FUN_NAME + - " '، على العموم إن كنت تقصد دالة بناء الصنف استخدم التعريف ' " - "بناء '", - o_tokens); - - CLASS_FUN_TYPE[std::make_pair(CLASS_NAME, FUN_NAME)] = TYPE; - CLASS_FUN_IS_SET[std::make_pair(CLASS_NAME, FUN_NAME)] = true; - CLASS_FUN_AT_LINE[std::make_pair(CLASS_NAME, FUN_NAME)] = IntToString(Line); - CLASS_FUN_PRIVATE[std::make_pair(CLASS_NAME, FUN_NAME)] = PRIVATE; - - if (TYPE == "عادم") RETURN_FUN[std::make_pair(CLASS_NAME, FUN_NAME)] = "OK"; - - // *** Generate Code *** - SET_C_NAME(FUN_NAME); - // *** *** *** *** *** *** -} - -// ==================================================== - -// Here, was void ADD_VAR() / void ADD_VAR_CLASS() -// Now, we use NewVar.cpp - -// ==================================================== - -std::string C_LAST_ARG; - -std::string CHECK_NEW_FUN_SYNTAX( - bool GLOBAL, std::string SYNTAX[1024], int SYNTAX_LONG, - std::string TempNS, // fun1 { a = b + namespace:fun2(x) + z } - std::string TmpFunction, // fun1 { a = b + namespace:fun2(x) + z } - CLASS_TOKEN *o_tokens) { - // function (int a, نص b) - - // SYNTAX : عدد | SYNTAX[3] : std::string - // SYNTAX[1] : a | SYNTAX[4] : b - // SYNTAX[2] : , | SYNTAX[5] : ) - - int TYPE = 0, VAR = 1, COMMA = 2; - - std::string CPP_CODE; - NEW_FUNCTION_ARG = ""; - - for (int p = 0; p <= SYNTAX_LONG; p += 3) { - if (!o_tokens->TOKENS_PREDEFINED) { - // Tokens not predifined, so we need only to set ARGs - - if (SYNTAX[TYPE] != "عدد" && SYNTAX[TYPE] != "نص" && - SYNTAX[TYPE] != "منطق" && SYNTAX[TYPE] != "مؤشر_دالة") { - ErrorCode("نوع غير مقبول ' " + SYNTAX[TYPE] + " ' ", o_tokens); - } - - if (!IsValidName(SYNTAX[VAR], o_tokens)) - ErrorCode("اسم غير مقبول ' " + SYNTAX[VAR] + " ' ", o_tokens); - - if (L_VAR_IS_SET[std::make_pair( - TempNS + TmpFunction, - SYNTAX[VAR])]) // الدالة (int a, نص a) - ErrorCode("متغير محلي موجود مسبقا ' " + SYNTAX[VAR] + " ' ", - o_tokens); - - if (SYNTAX[COMMA] != "،" && SYNTAX[COMMA] != "," && - SYNTAX[COMMA] != ")") - ErrorCode("فاصله غير صحيحه ' " + SYNTAX[COMMA] + " ' ", - o_tokens); - - if (SYNTAX[COMMA] == ")" && COMMA < SYNTAX_LONG) - ErrorCode("غير مكتمل ' " + IntToString(SYNTAX_LONG) + " ' ", - o_tokens); - - // if(DEBUG)DEBUG_MESSAGE("[" + SYNTAX[TYPE] + "|" + SYNTAX[VAR] + - // "]", o_tokens); // DEBUG - - // add always-local (bcs this var is in arg..) VAR to fun - SetNewVar(false, TempNS, TmpFunction, SYNTAX[VAR], SYNTAX[TYPE], - false, false, o_tokens->Line, o_tokens); - - // add local ARG-VAR as ARGUMENT to fun - if (GLOBAL) { - G_FUN_ARG_TYPE[std::make_pair( - TmpFunction, G_FUN_ARG_TOTAL[TmpFunction])] = SYNTAX[TYPE]; - G_FUN_ARG_TOTAL[TmpFunction]++; - } else { - L_FUN_ARG_TYPE[std::make_pair( - TempNS + TmpFunction, - L_FUN_ARG_TOTAL[std::make_pair(TempNS, TmpFunction)])] = - SYNTAX[TYPE]; - L_FUN_ARG_TOTAL[std::make_pair(TempNS, TmpFunction)]++; - } - - TYPE += 3, VAR += 3, COMMA += 3; // For ARG non-predifined loop - } else { - // Tokens already predifined, so we need show log, and return C++ - // code - - if (SYNTAX[TYPE] == "عدد") { - if (DEBUG) - DEBUG_MESSAGE("[INT " + SYNTAX[VAR] + "]", - o_tokens); // DEBUG - - // *** Generate Code *** - // always need pointer to one elem array - CPP_CODE.append(" double " + ID[SYNTAX[VAR]] + " "); - NEW_FUNCTION_ARG.append(" double " + ID[SYNTAX[VAR]] + " "); - // *** *** *** *** *** *** - } else if (SYNTAX[TYPE] == "نص") { - if (DEBUG) - DEBUG_MESSAGE("[STRING " + SYNTAX[VAR] + "]", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" std::string " + ID[SYNTAX[VAR]] + " "); - NEW_FUNCTION_ARG.append(" std::string " + ID[SYNTAX[VAR]] + - " "); - // *** *** *** *** *** *** - } else if (SYNTAX[TYPE] == "منطق") { - if (DEBUG) - DEBUG_MESSAGE("[BOOL " + SYNTAX[VAR] + "]", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" bool " + ID[SYNTAX[VAR]] + " "); - NEW_FUNCTION_ARG.append(" bool " + ID[SYNTAX[VAR]] + " "); - // *** *** *** *** *** *** - } else if (SYNTAX[TYPE] == "مؤشر_دالة") { - if (DEBUG) - DEBUG_MESSAGE("[POINTER " + SYNTAX[VAR] + "]", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" void(* " + ID[SYNTAX[VAR]] + " )() "); - NEW_FUNCTION_ARG.append(" void(* " + ID[SYNTAX[VAR]] + " )() "); - // *** *** *** *** *** *** - } else { - // Exception ! - ErrorCode("نوع غير مقبول ' " + SYNTAX[TYPE] + " ' ", o_tokens); - } - - TYPE += 3, VAR += 3, - COMMA += 3; // For ARG predifined / C++ loop, and need by comma - - // *** Generate Code *** - if (COMMA <= SYNTAX_LONG) { - CPP_CODE.append(" , "); - NEW_FUNCTION_ARG.append(" , "); - } - // *** *** *** *** *** *** - } - } - - // if(DEBUG)DEBUG_MESSAGE("[NS: "+ TempNS +"|Fun: " + TmpFunction + - // "|Looocal: " + IntToString(L_FUN_ARG_TOTAL[std::make_pair(TempNS, - // TmpFunction)]) + - // "|Glooobal: " + IntToString(G_FUN_ARG_TOTAL[TmpFunction]) + "]", - // o_tokens); - // // DEBUG - - if (o_tokens->TOKENS_PREDEFINED) - return CPP_CODE; - else - return ""; -} - -// ==================================================== - -std::string CheckForSyntax( - std::string OBJECTIF_TYPE, // OBJECTIF_TYPE - bool - ACCEPT_REF_WIN_WIDGET, // Accept Using Reference إلى namespace:Controls - bool ACCEPT_REF_WIN_FUN, // Accept Using Reference إلى namespace:Function - bool ACCEPT_REF_GLOBAL_FUN, // Accept Using Reference إلى Global Functions - bool ACCEPT_REF_LOCAL_FUN, // Accept Using Reference إلى Local Functions - bool ACCEPT_REF_GLOBAL_VAR, // Accept Using Reference إلى Global VAR - bool ACCEPT_REF_LOCAL_VAR, // Accept Using Reference إلى Local VAR - bool ACCEPT_STR_TO_INT, // Accept Convertion من نص إلى Int - bool ACCEPT_INT_TO_STRING, // Accept Convertion من عدد إلى String - std::string SYNTAX[1024], // SYNTAX[] std::string - int SYNTAX_LONG, // SYNTAX_LONG int - std::string - TMP_NAMESPACE_OR_CLASS, // a = b + namespace:fun(2+2) + class:fun(x) - std::string TmpFunction, // a = b + win/class:fun(2+2) - CLASS_TOKEN *o_tokens) { - // Note : WX Crash if On creating using reference إلى Controls, BUT OK ل - // Functions. - - // SYNTAX = '=' - // SYNTAX[1] = ... - - // TmpFunction : = a + b + TMP_FUN_NAME(X, Y, - // Z) - // + - // ... TMP_NAMESPACE_OR_CLASS : إلى get Generated_ID of tmp - // الدالة name OBJECTIF_TYPE : INT.ToString or STRING.ToInt - - std::string CPP_CODE; - - if (SYNTAX[0] != "=") { - ErrorCode("بناء غير صحيح : علة : " + - CONVERT_STRING_ARRAY_TO_STRING(SYNTAX, SYNTAX_LONG), - o_tokens); - } - - // Clear Syntax Array, needfor C++ Code _س_ - // for (int p = 0; p <= SYNTAX_LONG; p++) - // TMP_SYNTAX[p].clear(); // SYNTAX[p] = ""; SYNTAX[p] = 0; - - for (int p = 1; p <= SYNTAX_LONG; p++) { - // ---------------------- - // _س_ - // ---------------------- - - if (SYNTAX[p] == "_س_") { - // xyz = _س_ ...C++...@ Alif @...C++... _س_ - - if (DEBUG) - DEBUG_MESSAGE(" {_س_ Syntax START} ", o_tokens); // DEBUG - - bool C_FOUND = false; - - for (int z = p + 1; z <= SYNTAX_LONG; z++) { - if (SYNTAX[z] == "_س_") // End C++ Code - { - if (DEBUG) - DEBUG_MESSAGE(" {_س_ Syntax END} ", o_tokens); // DEBUG - C_FOUND = true; - p = z; - break; - } else if (SYNTAX[z] == "@") // @ Start ... - { - // xyz = ...C++...@ Alif @...C++... - - if (DEBUG) DEBUG_MESSAGE(" {Syntax@} ", o_tokens); // DEBUG - - std::string TempToken[1024]; - TempToken[0] = "="; // CheckForSyntax() Need this. - int TempTokenCount = 1; // CheckForSyntax() Need this. - - bool AT_FOUND = false; - - for (int c = z + 1; c < SYNTAX_LONG; c++) { - if (SYNTAX[c] == "@") { - z = c; - AT_FOUND = true; - break; - } - - TempToken[TempTokenCount] = SYNTAX[c]; - TempTokenCount++; - } - - if (!AT_FOUND) - ErrorCode("نهايه شفرة غير موجود داخل البناء ' @ '", - o_tokens); - - std::string SYNTAX_BUFFER = CheckForSyntax( - "C++", // OBJECTIF_TYPE - true, // Accept Using Reference إلى namespace:Controls - true, // Accept Using Reference إلى namespace:Function - true, // Accept Using Reference إلى Global Functions - true, // Accept Using Reference إلى Local Functions - true, // Accept Using Reference إلى Global VAR - true, // Accept Using Reference إلى Local VAR - true, // Accept Convertion من نص إلى Int - true, // Accept Convertion من عدد إلى String - TempToken, // SYNTAX[] std::string - (TempTokenCount - 1), // SYNTAX_LONG int - TheNamespace, // TMP_WINDOW_NAME - TheFunction, // TMP_FUNCTION_NAME - o_tokens); - - if (DEBUG) DEBUG_MESSAGE(" {Syntax@} ", o_tokens); // DEBUG - - // *** C++ *** - CPP_CODE.append(" " + SYNTAX_BUFFER + " "); - // *** *** *** *** *** *** - - // @ End. - } else if (SYNTAX[z] != "") { - CPP_CODE.append(SYNTAX[z]); - if (DEBUG) - DEBUG_MESSAGE(" {" + SYNTAX[z] + "} ", - o_tokens); // DEBUG - } - } - - if (C_FOUND) - continue; // Point إلى next بعد _س_ - else - ErrorCode("نهايه شفرة غير موجود داخل البناء ' _س_ '", o_tokens); - } - - // ---------------------- - // OPERATION - // ---------------------- - - if (SYNTAX[p] == "+" || SYNTAX[p] == "-" || SYNTAX[p] == "*" || - SYNTAX[p] == "/") { - if (p > 0) { - if (!CAN_ADD_OPERATION_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة عملية هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - } - - if (p >= SYNTAX_LONG) { - if (DEBUG) - DEBUG_MESSAGE("######################", o_tokens); // DEBUG - for (int p = 1; p <= SYNTAX_LONG; p++) - if (DEBUG) - DEBUG_MESSAGE("[" + SYNTAX[p] + "] ", - o_tokens); // DEBUG - ErrorCode("لا يمكن الإنتهاء بعملية ' " + SYNTAX[p] + " ' ", - o_tokens); - } - - if (OBJECTIF_TYPE == - "نص") // only acceptable operation in نص is '+' - { - if (SYNTAX[p] != "+") - ErrorCode( - "لا يمكن إضافة عملية داخل نص ' " + SYNTAX[p] + " ' ", - o_tokens); - } - - if (OBJECTIF_TYPE == "منطق") - ErrorCode( - "لا يمكن أجراء عملية في متغير منطقي ' " + SYNTAX[p] + " ' ", - o_tokens); - - if (substr_utf8(SYNTAX[p - 1], 0, 1) == "\"" && - substr_utf8(SYNTAX[p + 1], 0, 1) == "\"") // "test" + "hello" - ErrorCode("لا يمكن إضافة نص إلى نص ' " + SYNTAX[p - 1] + " " + - SYNTAX[p] + " " + SYNTAX[p + 1] + " ' ", - o_tokens); - - if (DEBUG) - DEBUG_MESSAGE("[OPERATION " + SYNTAX[p] + "] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + SYNTAX[p] + " "); - // *** *** *** *** *** *** - } - - // ---------------------- - // قوس OPEN - // ---------------------- - - else if (SYNTAX[p] == "(") { - if (p > 0) - if (!CAN_ADD_PARENTHESIS_OPEN_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة قوس مفتوح هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - - ALIF_PARENTHESIS_STATUS++; - - if (DEBUG) - DEBUG_MESSAGE("[PARENTHESIS Open (] ", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" ( "); - // *** *** *** *** *** *** - } - - // ---------------------- - // قوس CLOSE - // ---------------------- - - else if (SYNTAX[p] == ")") { - if (ALIF_PARENTHESIS_STATUS < 1) - ErrorCode("غلق قوس ليس مفتوحا ' " + SYNTAX[p] + " ' ", - o_tokens); - - if (p > 0) - if (!CAN_ADD_PARENTHESIS_CLOSE_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة غلق قوس هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - - ALIF_PARENTHESIS_STATUS--; - - if (DEBUG) - DEBUG_MESSAGE("[PARENTHESIS CLOSE )] ", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" ) "); - // *** *** *** *** *** *** - } - - // ---------------------- - // Local VARIABLE INT - // ---------------------- - - else if (L_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, - SYNTAX[p])] == "عدد") { - if (p > 0) - if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - - if (OBJECTIF_TYPE == "عدد") { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-INT (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "نص") { - if (ACCEPT_INT_TO_STRING) { - if (DEBUG) - DEBUG_MESSAGE( - "[LOCAL-INT (" + SYNTAX[p] + ").ToString] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" alifcore_IntToString(" + ID[SYNTAX[p]] + - ") "); - // *** *** *** *** *** *** - } else { - ErrorCode( - "لا يمكن تحويل عدد إلى نص : ' " + SYNTAX[p] + " ' ", - o_tokens); - } - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE("[C++ Local INT (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + - " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } - - // ----------------------------------- - // Local VARIABLE STRING - // ----------------------------------- - - else if (L_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, - SYNTAX[p])] == "نص") { - if (p > 0) - if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - - if (OBJECTIF_TYPE == "عدد") { - // if(DEBUG)DEBUG_MESSAGE("[LOCAL-STRING (" + SYNTAX[p] + - // ").ToInt] ", o_tokens); // DEBUG - ErrorCode("لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "نص") { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-STRING (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE("[C++ Local STRING (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + - " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } - - // ----------------------------------- - // Local VARIABLE Bool - // ----------------------------------- - - else if (L_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, - SYNTAX[p])] == "منطق") { - // if (p != 1) - //{ - // ErrorCode("أمر غير معروف ' " + SYNTAX[p] + " ' ", o_tokens); - //} - - if (SYNTAX[p + 1] != "") { - // bool A = B + wrong - ErrorCode("أمر غير معروف ' " + SYNTAX[p + 1] + - " '، على العموم لا يمكن أجراء أية عملية على " - "متغير منطقي ", - o_tokens); - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE("[C++ Local Bool (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - - continue; - } else if (OBJECTIF_TYPE != "منطق") { - ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + " ' " + - SYNTAX[p] + " ' ", - o_tokens); - } - // else - //{ - // ErrorCode("علة : استثناء في متغير منطقي ' " + SYNTAX[p] + " ' ", - // o_tokens); - //} - - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-BOOL ' " + SYNTAX[p] + " '] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } - - // ----------------------------------- - // Local Func Void Pointer - // ----------------------------------- - - else if (L_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, - SYNTAX[p])] == "مؤشر_دالة") { - if (p > 0) - if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - - if (OBJECTIF_TYPE == "عدد") { - ErrorCode( - "لا يمكن تحويل مؤشر_دالة إلى عدد ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "نص") { - ErrorCode( - "لا يمكن تحويل مؤشر_دالة إلى نص ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "مؤشر_دالة") { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-POINTER-FUNC (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE( - "[C++ Local POINTER-FUNC (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + - " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } - - // ---------------------- - // Global VARIABLE (all type) - // Global VARIABLE without _ - // ---------------------- - - else if (substr_utf8(SYNTAX[p], 0, 1) == "_" || - G_VAR_IS_SET[(SYNTAX[p])]) { - if (p > 0) - if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - - std::string G_VAR_WITHOUT_; - - if (G_VAR_IS_SET[(SYNTAX[p])]) - G_VAR_WITHOUT_ = SYNTAX[p]; - else - G_VAR_WITHOUT_ = substr_utf8( - SYNTAX[p], 1, CharCount_utf8(SYNTAX[p], o_tokens)); - - if (!G_VAR_IS_SET[(G_VAR_WITHOUT_)]) - ErrorCode("ليس متغير عام ' " + SYNTAX[p] + " ' ", o_tokens); - - if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "عدد") { - if (OBJECTIF_TYPE == "عدد") { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-INT (" + G_VAR_WITHOUT_ + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "نص") { - if (ACCEPT_INT_TO_STRING) { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-INT (" + G_VAR_WITHOUT_ + - ").ToString] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" alifcore_IntToString(" + - Global_ID[G_VAR_WITHOUT_] + ") "); - // *** *** *** *** *** *** - } else { - ErrorCode( - "لا يمكن تحويل عدد إلى نص : ' " + SYNTAX[p] + " ' ", - o_tokens); - } - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE( - "[C++ Global عدد (" + G_VAR_WITHOUT_ + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } else if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "نص") { - if (OBJECTIF_TYPE == "عدد") { - if (ACCEPT_INT_TO_STRING) // or ACCEPT_STR_TO_INT !! - { - // if(DEBUG)DEBUG_MESSAGE("[GLOBAL-STRING (" + - // G_VAR_WITHOUT_ + - // ").ToInt] ", o_tokens); // DEBUG - ErrorCode("لا يمكن تحويل نص إلى عدد ' " + - G_VAR_WITHOUT_ + " ' ", - o_tokens); - } else { - ErrorCode( - "لا يمكن تحويل عدد إلى نص : ' " + SYNTAX[p] + " ' ", - o_tokens); - } - } else if (OBJECTIF_TYPE == "نص") { - if (DEBUG) - DEBUG_MESSAGE( - "[GLOBAL-STRING (" + G_VAR_WITHOUT_ + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE( - "[C++ Global نص (" + G_VAR_WITHOUT_ + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } else if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "منطق") { - if (OBJECTIF_TYPE != "منطق" && OBJECTIF_TYPE != "C++") { - ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + - " ' " + G_VAR_WITHOUT_ + " ' ", - o_tokens); - } - - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-BOOL ' " + G_VAR_WITHOUT_ + " '] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[G_VAR_WITHOUT_] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المتغير العام غير معروف ' " + - G_VAR_TYPE[(G_VAR_WITHOUT_)] + " -> " + - G_VAR_WITHOUT_ + " ' ", - o_tokens); - } - } - - // ----------------------------------- - // True / False - // ----------------------------------- - - else if (SYNTAX[p] == "صحيح") { - if (p != 1) - ErrorCode("لا يمكن وضع ( منطق ) هنا ' " + SYNTAX[p] + " ' ", - o_tokens); - - if (SYNTAX[p + 1] != "") { - // bool A = TRUE + wrong - ErrorCode("أمر غير معروف ' " + SYNTAX[p + 1] + - " '، على العموم لا يمكن أجراء أية عملية على " - "متغير منطقي ", - o_tokens); - } - - if (OBJECTIF_TYPE == "منطق") { - if (DEBUG) DEBUG_MESSAGE("[TRUE] ", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" true "); - // *** *** *** *** *** *** - } else { - ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + " ' " + - SYNTAX[p] + " ' ", - o_tokens); - } - } else if (SYNTAX[p] == "خطأ") { - if (p != 1) - ErrorCode("لا يمكن وضع ( منطق ) هنا ' " + SYNTAX[p] + " ' ", - o_tokens); - - if (SYNTAX[p + 1] != "") { - // bool A = FALSE + wrong - ErrorCode("أمر غير معروف ' " + SYNTAX[p + 1] + - " '، على العموم لا يمكن أجراء أية عملية على " - "متغير منطقي ", - o_tokens); - } - - if (OBJECTIF_TYPE == "منطق") { - if (DEBUG) DEBUG_MESSAGE("[FALSE] ", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" false "); - // *** *** *** *** *** *** - } else { - ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + " ' " + - SYNTAX[p] + " ' ", - o_tokens); - } - } - - // ----------------------------------- - // New Line سطر - // ----------------------------------- - - else if (SYNTAX[p] == "سطر") { - if (p > 0) - if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة سطر جديد هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - - if (OBJECTIF_TYPE == "عدد") { - // if(DEBUG)DEBUG_MESSAGE("[LOCAL-STRING (" + SYNTAX[p] + - // ").ToInt] ", o_tokens); // DEBUG - ErrorCode( - "لا يمكن تحويل سطر جديد إلى عدد ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "نص") { - if (DEBUG) DEBUG_MESSAGE("[NewLine] ", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" ALIFCORE_NEW_LINE "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "منطق") { - ErrorCode( - "لا يمكن تحويل سطر جديد إلى منطق ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) DEBUG_MESSAGE("[C++_NewLine] ", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" (\"\n\") "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + - " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } - - // ---------------------- - // Class Global/Local Obj - // ---------------------- - - else if (OBJ_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, - SYNTAX[p])] || - OBJ_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, - SYNTAX[p])] || - OBJ_IS_SET[std::make_pair("", SYNTAX[p])]) { - // a = obj:mem + c - // b = obj:mem_func(a, b) + c - - if (p > 0) - if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة كائن هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - - // if (SYNTAX[p + 1] != ":") - // ErrorCode("يجب إضافة ':' بعد ' " + SYNTAX[p] + " ' ", o_tokens); - // if (SYNTAX[p + 2] == "") - // ErrorCode("يجب إضافة إسم منتمي للصنف بعد ' " + SYNTAX[p] + " : ' - // ", o_tokens); - - if (SYNTAX[p + 1] != ":") - ErrorCode("يجب وضع نقطتين ':' بين الكائن و المنتمي، أي بعد ' " + - SYNTAX[p] + " ' ", - o_tokens); - if (SYNTAX[p + 2] == "بناء") - ErrorCode( - "لا يمكن استدعاء دالة ' بناء() '، هته الدالة تستدعى بشكل " - "آلي " - "عند إنشاء الكائن", - o_tokens); - if (SYNTAX[p + 2] == "هدم") - ErrorCode( - "لا يمكن استدعاء دالة ' هدم() '، هته الدالة تستدعى بشكل " - "آلي " - "عند الحاجة إلى تدمير هذا الكائن", - o_tokens); - if (SYNTAX[p + 2] == "") - ErrorCode("يجب وضع اسم المنتمي بعد ' " + SYNTAX[p] + ":' ", - o_tokens); - - // C++, allow create Obj on global, global-class, local, but using - // it only on func. - std::string OBJ_ID; - bool IS_GLOBAL_OBJ = false; - if (OBJ_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS + TmpFunction, - SYNTAX[p])]) { - // Local Obj. - // Namespace -> Func -> Obj. Or - // Class -> Func -> Obj. - OBJ_ID = TMP_NAMESPACE_OR_CLASS + TmpFunction; - } else if (OBJ_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, - SYNTAX[p])] && - TMP_NAMESPACE_OR_CLASS != "") { - // Global Class Obj. - // Class -> Obj. - OBJ_ID = TMP_NAMESPACE_OR_CLASS; - } else { - // Global Obj. - // Global-Area -> Obj. - OBJ_ID = ""; - IS_GLOBAL_OBJ = true; - } - - std::string TK_CLASS = OBJ_CLASS[std::make_pair(OBJ_ID, SYNTAX[p])]; - - if (!CLASS_G_VAR_IS_SET[std::make_pair(TK_CLASS, SYNTAX[p + 2])] && - !CLASS_FUN_IS_SET[std::make_pair(TK_CLASS, SYNTAX[p + 2])]) - ErrorCode("الصنف ' " + TK_CLASS + - " ' ليس فيه أي منتمي معرف باسم ' " + - SYNTAX[p + 2] + " ' ", - o_tokens); - - std::string MEMBER_TYPE; - - if (CLASS_G_VAR_IS_SET[std::make_pair(TK_CLASS, SYNTAX[p + 2])]) { - // متغير member - - // a = obj : mem + c - - if (CLASS_G_VAR_PRIVATE[std::make_pair(TK_CLASS, - SYNTAX[p + 2])]) - ErrorCode("لا يمكن استدعاء المتغير ' " + SYNTAX[p + 2] + - " ' المنتمي للصنف ' " + TK_CLASS + - " ' لأنه من نوع ' خاص ' ", - o_tokens); - - MEMBER_TYPE = - CLASS_G_VAR_TYPE[std::make_pair(TK_CLASS, SYNTAX[p + 2])]; - - if (MEMBER_TYPE == "عادم") - ErrorCode("لا يمكن إضافة منتمي عادم ' " + SYNTAX[p] + - " : " + SYNTAX[p + 2] + " ' ", - o_tokens); - - if (MEMBER_TYPE == "عدد") { - if (OBJECTIF_TYPE == "عدد") { - if (IS_GLOBAL_OBJ) { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(INT)] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + - "." + Global_ID[SYNTAX[p + 2]] + - " "); - // *** *** *** *** *** *** - } else { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(INT)] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + "." + - Global_ID[SYNTAX[p + 2]] + " "); - // *** *** *** *** *** *** - } - } else if (OBJECTIF_TYPE == "نص") { - if (IS_GLOBAL_OBJ) { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(INT).ToString] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" alifcore_IntToString(" + - GlobalObj_ID[SYNTAX[p]] + "." + - Global_ID[SYNTAX[p + 2]] + ") "); - // *** *** *** *** *** *** - } else { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(INT).ToString] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" alifcore_IntToString(" + - Obj_ID[SYNTAX[p]] + "." + - Global_ID[SYNTAX[p + 2]] + ") "); - // *** *** *** *** *** *** - } - } else if (OBJECTIF_TYPE == "منطق") { - ErrorCode("لا يمكن تحويل عدد إلى منطق ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + " ' ", - o_tokens); - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + - " ' ", - o_tokens); - } - } else if (MEMBER_TYPE == "نص") { - if (OBJECTIF_TYPE == "عدد") { - ErrorCode( - "لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "نص") { - if (IS_GLOBAL_OBJ) { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(STRING)] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + - "." + Global_ID[SYNTAX[p + 2]] + - " "); - // *** *** *** *** *** *** - } else { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(STRING)] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + "." + - Global_ID[SYNTAX[p + 2]] + " "); - // *** *** *** *** *** *** - } - } else if (OBJECTIF_TYPE == "منطق") { - ErrorCode("لا يمكن تحويل نص إلى منطق ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + " ' ", - o_tokens); - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + - " ' ", - o_tokens); - } - } else if (MEMBER_TYPE == "منطق") { - if (OBJECTIF_TYPE != "منطق") { - ErrorCode("لا يمكن تحويل منتمي منطق إلى " + - OBJECTIF_TYPE + " ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "منطق") { - if (IS_GLOBAL_OBJ) { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(BOOL)] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + - "." + Global_ID[SYNTAX[p + 2]] + - " "); - // *** *** *** *** *** *** - } else { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(BOOL)] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + "." + - Global_ID[SYNTAX[p + 2]] + " "); - // *** *** *** *** *** *** - } - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + - " ' ", - o_tokens); - } - } else { - ErrorCode("علة : نوع المنتمي غير معروف ' " + MEMBER_TYPE + - " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - - p += 2; // point إلى next token بعد obj:mem - } else if (CLASS_FUN_IS_SET[std::make_pair(TK_CLASS, - SYNTAX[p + 2])]) { - // Function member - - // b = obj : memf (a, b) - - if (CLASS_FUN_PRIVATE[std::make_pair(TK_CLASS, SYNTAX[p + 2])]) - ErrorCode("الدالة منتمي ' " + SYNTAX[p + 2] + - " ' داخل الصنف ' " + TK_CLASS + " ' خاص ", - o_tokens); - - if (CLASS_FUN_TYPE[std::make_pair(TK_CLASS, SYNTAX[p + 2])] == - "عادم") - ErrorCode("لا يمكن إضافة منتمي عادم ' " + SYNTAX[p] + - " : " + SYNTAX[p + 2] + " ' داخل الصنف ' " + - TK_CLASS + " ' ", - o_tokens); - - if (SYNTAX[p + 3] != "(") - ErrorCode("يجب إضافة '(' بعد ' " + SYNTAX[p] + ":" + - SYNTAX[p + 2] + " ' ", - o_tokens); - - MEMBER_TYPE = - CLASS_FUN_TYPE[std::make_pair(TK_CLASS, SYNTAX[p + 2])]; - - int TMP_FUN_LONG = p + 4; // a + b + 'p'obj : memf (a, b) + c - int OPEN_PARENTIZE = 0; - - while (TMP_FUN_LONG <= SYNTAX_LONG) { - if (SYNTAX[TMP_FUN_LONG] == - "(") // مفتوح inside الدالة args : fun( a + (b)) - OPEN_PARENTIZE++; - else if (SYNTAX[TMP_FUN_LONG] == ")" && - OPEN_PARENTIZE > 0) // Close inside الدالة args - OPEN_PARENTIZE--; - else if (SYNTAX[TMP_FUN_LONG] == ")" && - OPEN_PARENTIZE < 1) // Close final الدالة call - { - if (TMP_FUN_LONG < SYNTAX_LONG) { - // a = fun( a + (b)) + 123 - // str / عدد = متغير + (fun(var)) * (fun(var) / - // fun(var, fun(var), var) - var) - - if ((SYNTAX[TMP_FUN_LONG + 1] != "+") && - (SYNTAX[TMP_FUN_LONG + 1] != "-") && - (SYNTAX[TMP_FUN_LONG + 1] != "*") && - (SYNTAX[TMP_FUN_LONG + 1] != "/") && - (SYNTAX[TMP_FUN_LONG + 1] != "،") && - (SYNTAX[TMP_FUN_LONG + 1] != ",") && - (SYNTAX[TMP_FUN_LONG + 1] != ")")) { - ErrorCode("نص غير معروف بعد نداء ' " + - SYNTAX[p] + " : " + - SYNTAX[p + 2] + "()' : ' " + - SYNTAX[TMP_FUN_LONG + 1] + " ' ", - o_tokens); - } - } else if (TMP_FUN_LONG == SYNTAX_LONG) { - // a = obj:fun( a + (b)) - if (SYNTAX[TMP_FUN_LONG] != ")" || - SYNTAX[SYNTAX_LONG] != ")") // double check! - ErrorCode("يجب إنهاء نداء الدالة ' " + - SYNTAX[p] + " : " + - SYNTAX[p + 2] + - "()' بالإشارة ')' ", - o_tokens); - } - - break; - } - - TMP_FUN_LONG++; - } - - if (SYNTAX[TMP_FUN_LONG] != ")") // Double check! - ErrorCode("يجب إنهاء نداء الدالة ' " + SYNTAX[p] + " : " + - SYNTAX[p + 2] + "()' بالإشارة ')' ", - o_tokens); - - std::string TempToken[1024]; - int TempTokenCount = 0; - for (int i = p + 4; i <= TMP_FUN_LONG; i++) { - if (SYNTAX[i] != "") { - TempToken[TempTokenCount] = SYNTAX[i]; - TempTokenCount++; - } - } - - if (MEMBER_TYPE == "عدد") { - if (OBJECTIF_TYPE == "عدد") { - if (IS_GLOBAL_OBJ) { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(Func-INT) (", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + - ".ClassFUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } else { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(Func-INT) (", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + - ".ClassFUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } - - CPP_CODE.append(CHECK_CALL_FUN_ARG( - false, TK_CLASS, SYNTAX[p + 2], - 2, // 2 = الدالة member - TheNamespace, TheFunction, TempToken, - (TempTokenCount - 1), o_tokens)); - - if (DEBUG) DEBUG_MESSAGE(")] ", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" ) "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "نص") { - if (IS_GLOBAL_OBJ) { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(Func-INT) (", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" alifcore_IntToString(" + - GlobalObj_ID[SYNTAX[p]] + - ".ClassFUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } else { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(Func-INT) (", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append( - " alifcore_IntToString(" + Obj_ID[SYNTAX[p]] + - ".ClassFUNCTION_" + ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } - - CPP_CODE.append(CHECK_CALL_FUN_ARG( - false, TK_CLASS, SYNTAX[p + 2], - 2, // 2 = الدالة member - TheNamespace, TheFunction, TempToken, - (TempTokenCount - 1), o_tokens)); - - if (DEBUG) - DEBUG_MESSAGE(").IntFunToString] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" )) "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + - " : " + SYNTAX[p + 2] + "()' ", - o_tokens); - } - } else if (MEMBER_TYPE == "نص") { - if (OBJECTIF_TYPE == "عدد") { - ErrorCode("لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + - " : " + SYNTAX[p + 2] + "()' ", - o_tokens); - } else if (OBJECTIF_TYPE == "نص") { - if (IS_GLOBAL_OBJ) { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(Func-STRING) (", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + - ".ClassFUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } else { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(Func-STRING) (", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + - ".ClassFUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } - - CPP_CODE.append(CHECK_CALL_FUN_ARG( - false, TK_CLASS, SYNTAX[p + 2], - 2, // 2 = الدالة member - TheNamespace, TheFunction, TempToken, - (TempTokenCount - 1), o_tokens)); - - if (DEBUG) DEBUG_MESSAGE(")] ", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" ) "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + - " : " + SYNTAX[p + 2] + "()' ", - o_tokens); - } - } else if (MEMBER_TYPE == "منطق") { - if (OBJECTIF_TYPE != "منطق") { - ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + - " ' " + SYNTAX[p] + " : " + - SYNTAX[p + 2] + "()' ", - o_tokens); - } else if (OBJECTIF_TYPE == "منطق") { - if (IS_GLOBAL_OBJ) { - if (DEBUG) - DEBUG_MESSAGE("[GLOBAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(Func-BOOL) (", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + GlobalObj_ID[SYNTAX[p]] + - ".ClassFUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } else { - if (DEBUG) - DEBUG_MESSAGE("[LOCAL-OBJ ' " + SYNTAX[p] + - " ':'" + SYNTAX[p + 2] + - " '(Func-BOOL) (", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Obj_ID[SYNTAX[p]] + - ".ClassFUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } - - CPP_CODE.append(CHECK_CALL_FUN_ARG( - false, TK_CLASS, SYNTAX[p + 2], - 2, // 2 = الدالة member - TheNamespace, TheFunction, TempToken, - (TempTokenCount - 1), o_tokens)); - - if (DEBUG) DEBUG_MESSAGE(")] ", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" ) "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + - " : " + SYNTAX[p + 2] + "()' ", - o_tokens); - } - } else { - ErrorCode("علة : نوع المنتمي غير معروف ' " + MEMBER_TYPE + - " -> " + SYNTAX[p] + " : " + SYNTAX[p + 2] + - "()' ", - o_tokens); - } - - p = TMP_FUN_LONG; // point إلى next token بعد fun(...) - } - } - - // ---------------------- - // Class Global VARIABLE - // ---------------------- - - // class - // g1 = 123 - // g2 = g1<-- - - else if (CLASS_G_VAR_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, - SYNTAX[p])] && - IsInsideClass) { - // Class Global area - - if (p > 0) - if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة متغير هنا ' " + SYNTAX[p - 1] + - " " + SYNTAX[p] + " ' ", - o_tokens); - - if (CLASS_G_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS, - SYNTAX[p])] == "عدد") { - if (OBJECTIF_TYPE == "عدد") { - if (DEBUG) - DEBUG_MESSAGE("[CLASS-GLOBAL-INT (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "نص") { - if (ACCEPT_INT_TO_STRING) { - if (DEBUG) - DEBUG_MESSAGE("[CLASS-GLOBAL-INT (" + SYNTAX[p] + - ").ToString] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" alifcore_IntToString(" + - Global_ID[SYNTAX[p]] + ") "); - // *** *** *** *** *** *** - } else { - ErrorCode( - "لا يمكن تحويل عدد إلى نص : ' " + SYNTAX[p] + " ' ", - o_tokens); - } - } else if (OBJECTIF_TYPE == "منطق") { - ErrorCode( - "لا يمكن تحويل عدد إلى منطق : ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE( - "[C++ CLASS-GLOBAL-INT (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } else if (CLASS_G_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS, - SYNTAX[p])] == "نص") { - if (OBJECTIF_TYPE == "عدد") { - // if(DEBUG)DEBUG_MESSAGE("[GLOBAL-STRING (" + SYNTAX[p] + - // ").ToInt] - // ", o_tokens); // DEBUG - ErrorCode("لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "نص") { - if (DEBUG) - DEBUG_MESSAGE( - "[CLASS-GLOBAL-STRING (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "منطق") { - ErrorCode( - "لا يمكن تحويل نص إلى منطق : ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE( - "[C++ CLASS-GLOBAL-STRING (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } else if (CLASS_G_VAR_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS, - SYNTAX[p])] == "منطق") { - if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE( - "[C++ CLASS-GLOBAL-BOOL (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE != "منطق") { - ErrorCode("لا يمكن تحويل منطق إلى " + OBJECTIF_TYPE + - " ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "منطق") { - if (DEBUG) - DEBUG_MESSAGE( - "[CLASS-GLOBAL-BOOL (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + Global_ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } else { - ErrorCode( - "علة : نوع المتغير العام غير معروف ' " + SYNTAX[p] + " ' ", - o_tokens); - } - } - - // ---------------------- - // Global VARIABLE without _ - // ---------------------- - - // g1 = 123 - // g2 = _g1 + 'g1' <-- - - /* - else if (G_VAR_IS_SET[(SYNTAX[p])]) - { - ... - } - */ - - // ----------------------------------- - // TXT - // ----------------------------------- - - else if (substr_utf8(SYNTAX[p], 0, 1) == "\"") { - if (p > 0) - if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة نص هنا ' " + SYNTAX[p - 1] + " " + - SYNTAX[p] + " ' ", - o_tokens); - - if (!IsValidStringFormat(SYNTAX[p], o_tokens)) - ErrorCode("ليس بنص صحيح ' " + SYNTAX[p] + " ' ", o_tokens); - - if (OBJECTIF_TYPE == "عدد") { - // if(DEBUG)DEBUG_MESSAGE("[STRING_MSG (" + SYNTAX[p] + - // ").ToInt] ", o_tokens); // DEBUG - ErrorCode("لا يمكن تحويل نص إلى عدد ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "نص") { - if (DEBUG) - DEBUG_MESSAGE("[STRING_MSG (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" (" + SYNTAX[p] + ") "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "منطق") { - ErrorCode("لا يمكن تحويل نص إلى منطق ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE("[C++ نص (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" (" + SYNTAX[p] + ") "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + - " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } - - // ----------------------------------- - // DIGIT - // ----------------------------------- - - else if (IsValidDigit(SYNTAX[p], true, o_tokens)) { - if (p > 0) - if (!CAN_ADD_DIGIT_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن إضافة رقم هنا ' " + SYNTAX[p - 1] + " " + - SYNTAX[p] + " ' ", - o_tokens); - - if (OBJECTIF_TYPE == "عدد") { - if (DEBUG) - DEBUG_MESSAGE("[DIGIT " + SYNTAX[p] + "] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + SYNTAX[p] + " "); - // *** *** *** *** *** *** - } else if (OBJECTIF_TYPE == "نص") { - if (ACCEPT_INT_TO_STRING) { - if (DEBUG) - DEBUG_MESSAGE("[DIGIT (" + SYNTAX[p] + ").ToString] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" alifcore_IntToString(" + SYNTAX[p] + - ") "); - // *** *** *** *** *** *** - } else { - ErrorCode( - "لا يمكن تحويل رقم إلى نص : ' " + SYNTAX[p] + " '", - o_tokens); - } - } else if (OBJECTIF_TYPE == "منطق") { - ErrorCode("لا يمكن تحويل رقم إلى منطق ' " + SYNTAX[p] + " ' ", - o_tokens); - } else if (OBJECTIF_TYPE == "C++") { - if (DEBUG) - DEBUG_MESSAGE("[C++ رقم (" + SYNTAX[p] + ")] ", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" " + SYNTAX[p] + " "); - // *** *** *** *** *** *** - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + OBJECTIF_TYPE + - " -> " + SYNTAX[p] + " ' ", - o_tokens); - } - } - - // ----------------------------------- - // Function / Class-Function - // ----------------------------------- - - else if (CLASS_FUN_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, - SYNTAX[p])] || - G_FUN_IS_SET[(SYNTAX[p])] || - L_FUN_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, - SYNTAX[p])]) // call الدالة (a, b) - { - if (p > 0) - if (!CAN_ADD_VAR_HERE(SYNTAX[p - 1])) - ErrorCode("لا يمكن وضع دالة هنا ' " + SYNTAX[p - 1] + " " + - SYNTAX[p] + " ' ", - o_tokens); - - if (!IsInsideFunction) - ErrorCode("يجب مناداة على الدالة من داخل دالة ' " + SYNTAX[p] + - "()' ", - o_tokens); - - if (OBJECTIF_TYPE == "مؤشر_دالة") { - // ... function_name -> to an pointer-func - - std::string FUN_TYPE; - bool IS_LOCAL_FUN = false; - IS_LOCAL_FUN = L_FUN_IS_SET[std::make_pair( - TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; - - if (IS_LOCAL_FUN) { - FUN_TYPE = L_FUN_TYPE[std::make_pair(TMP_NAMESPACE_OR_CLASS, - SYNTAX[p])]; - if (DEBUG) - DEBUG_MESSAGE("[REFERENCE-OF-LOCAL-FUNCTION-" + - FUN_TYPE + " ' " + SYNTAX[p] + " ']", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" NS_" + ID[TheNamespace] + "::FUNCTION_" + - ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } else { - FUN_TYPE = G_FUN_TYPE[(SYNTAX[p])]; - if (DEBUG) - DEBUG_MESSAGE("[REFERENCE-OF-GLOBAL-FUNCTION-" + - FUN_TYPE + " ' " + SYNTAX[p] + " ']", - o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" FUNCTION_" + Global_ID[SYNTAX[p]] + " "); - // *** *** *** *** *** *** - } - } else { - // ... function_name(...) -> to an anythings except pointers - - if (SYNTAX[p + 1] == "") - ErrorCode("يجب اضافه '(' بعد ' " + SYNTAX[p] + " ' ", - o_tokens); - - if (SYNTAX[p + 1] != "(") - ErrorCode("أمر غير معروف ' " + SYNTAX[p + 1] + " ' ", - o_tokens); - - // bool ThisIsClassFunction = false; - // if (CLASS_FUN_IS_SET[std::make_pair(TMP_NAMESPACE_OR_CLASS, - // SYNTAX[p])]) - // ThisIsClassFunction = true; - - // if(ThisIsClassFunction) - // ErrorCode("_TEST_TEST_TEST_' " + SYNTAX[p + 1] + " ' ", - // o_tokens); - - int TMP_FUN_LONG = p + 2; // a + b + 'p'fun ( c + (1 * 2) ) + c - int OPEN_PARENTIZE = 0; - - while (TMP_FUN_LONG <= SYNTAX_LONG) { - if (SYNTAX[TMP_FUN_LONG] == - "(") // مفتوح inside الدالة args : fun( a + (b)) - OPEN_PARENTIZE++; - else if (SYNTAX[TMP_FUN_LONG] == ")" && - OPEN_PARENTIZE > 0) // Close inside الدالة args - OPEN_PARENTIZE--; - else if (SYNTAX[TMP_FUN_LONG] == ")" && - OPEN_PARENTIZE < 1) // Close final الدالة call - { - if (TMP_FUN_LONG < SYNTAX_LONG) { - // a = fun( a + (b)) + 123 - // str / عدد = متغير + (fun(var)) * (fun(var) / - // fun(var, fun(var), var) - var) - - if ((SYNTAX[TMP_FUN_LONG + 1] != "+") && - (SYNTAX[TMP_FUN_LONG + 1] != "-") && - (SYNTAX[TMP_FUN_LONG + 1] != "*") && - (SYNTAX[TMP_FUN_LONG + 1] != "/") && - (SYNTAX[TMP_FUN_LONG + 1] != "،") && - (SYNTAX[TMP_FUN_LONG + 1] != ",") && - (SYNTAX[TMP_FUN_LONG + 1] != ")")) { - ErrorCode("نص غير معروف بعد نداء ' " + - SYNTAX[p] + "()' : ' " + - SYNTAX[TMP_FUN_LONG + 1] + " ' ", - o_tokens); - } - } else if (TMP_FUN_LONG == SYNTAX_LONG) { - // a = fun( a + (b)) - if (SYNTAX[TMP_FUN_LONG] != ")") // double check! - ErrorCode("يجب إنهاء نداء الدالة ' " + - SYNTAX[p] + "()' بالإشارة ')' ", - o_tokens); - } - - break; - } - - TMP_FUN_LONG++; - } - - if (SYNTAX[TMP_FUN_LONG] != ")") // Double check! - ErrorCode("يجب إنهاء نداء الدالة ' " + SYNTAX[p] + - "()' بالإشارة ')' ", - o_tokens); - // ErrorCode("===== |" + SYNTAX[TMP_FUN_LONG - 1] + "| =====", - // o_tokens); - - std::string TempToken[1024]; - int TempTokenCount = 0; - for (int i = p + 2; i <= TMP_FUN_LONG; i++) { - if (SYNTAX[i] != "") { - TempToken[TempTokenCount] = SYNTAX[i]; - TempTokenCount++; - } - } - - bool IS_LOCAL_FUN = false; - if (IsInsideClass) { - IS_LOCAL_FUN = CLASS_FUN_IS_SET[std::make_pair( - TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; - } else { - IS_LOCAL_FUN = L_FUN_IS_SET[std::make_pair( - TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; - } - - std::string FUN_TYPE; - - if (IS_LOCAL_FUN) { - if (IsInsideClass) { - FUN_TYPE = CLASS_FUN_TYPE[std::make_pair( - TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; - } else { - FUN_TYPE = L_FUN_TYPE[std::make_pair( - TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; - } - - if (FUN_TYPE == "عادم") - ErrorCode( - "الدالة المحلية ' " + SYNTAX[p] + - "()' من نوع عادم, لدى لا يمكن تحويلها إلى " + - OBJECTIF_TYPE, - o_tokens); - } else { - FUN_TYPE = G_FUN_TYPE[(SYNTAX[p])]; - - if (FUN_TYPE == "عادم") - ErrorCode( - "الدالة العامة ' " + SYNTAX[p] + - "()' من نوع عادم, لدى لا يمكن تحويل إلى " + - OBJECTIF_TYPE, - o_tokens); - } - - std::string CG_BUFFER; - - if (OBJECTIF_TYPE == "عدد") { - if (FUN_TYPE == "عدد") { - if (IS_LOCAL_FUN) { - // Call a local fun int - - if (DEBUG) - DEBUG_MESSAGE("[CALL-LOCAL-FUNCTION-INT ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - if (IsInsideClass) { - CG_BUFFER.append(" ClassFUNCTION_" + - ID[SYNTAX[p]] + "( "); - } else { - CG_BUFFER.append(" NS_" + ID[TheNamespace] + - "::FUNCTION_" + ID[SYNTAX[p]] + - "( "); - } - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, - TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, - (TempTokenCount - 1), o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) "); - // *** *** *** *** *** *** - } else { - // Call a Global fun int - - if (DEBUG) - DEBUG_MESSAGE("[CALL-GLOBAL-FUNCTION-INT ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" FUNCTION_" + - Global_ID[SYNTAX[p]] + "( "); - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, - TheFunction, TempToken, (TempTokenCount - 1), - o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) "); - // *** *** *** *** *** *** - } - } else if (FUN_TYPE == "نص") { - if (IS_LOCAL_FUN) - ErrorCode("لا يمكن تحويل الدالة المحلية ' " + - SYNTAX[p] + "()' من نص إلى عدد ", - o_tokens); - else - ErrorCode("لا يمكن تحويل الدالة العامة ' " + - SYNTAX[p] + "()' من نص إلى عدد ", - o_tokens); - } else if (FUN_TYPE == "منطق") { - if (IS_LOCAL_FUN) - ErrorCode("لا يمكن تحويل الدالة المحلية ' " + - SYNTAX[p] + "()' من منطق إلى عدد ", - o_tokens); - else - ErrorCode("لا يمكن تحويل الدالة العامة ' " + - SYNTAX[p] + "()' من منطق إلى عدد ", - o_tokens); - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " [" + FUN_TYPE + "] " + - " [" + TMP_NAMESPACE_OR_CLASS + "] " + - SYNTAX[p] + "()' ", - o_tokens); - } - } else if (OBJECTIF_TYPE == "نص") { - if (FUN_TYPE == "عدد") { - if (IS_LOCAL_FUN) { - // Call a local fun int.ToString - - if (DEBUG) - DEBUG_MESSAGE( - "[CALL-LOCAL-FUNCTION-INT.ToString ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CG_BUFFER.append( - " alifcore_IntToString( OBJ_CLASS_WINDOW_" + - ID[TheNamespace] + "::FUNCTION_" + - ID[SYNTAX[p]] + "( "); - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, - TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, - (TempTokenCount - 1), o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) ) "); - // *** *** *** *** *** *** - } else { - // Call a Global fun int.ToString - - if (DEBUG) - DEBUG_MESSAGE( - "[CALL-GLOBAL-FUNCTION-INT.ToString ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CG_BUFFER.append( - " alifcore_IntToString( FUNCTION_" + - Global_ID[SYNTAX[p]] + "( "); - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, - TheFunction, TempToken, (TempTokenCount - 1), - o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) ) "); - // *** *** *** *** *** *** - } - } else if (FUN_TYPE == "نص") { - if (IS_LOCAL_FUN) { - // Call a local fun std::string - - if (DEBUG) - DEBUG_MESSAGE("[CALL-LOCAL-FUNCTION-STRING ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" NS_" + ID[TheNamespace] + - "::FUNCTION_" + ID[SYNTAX[p]] + - "( "); - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, - TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, - (TempTokenCount - 1), o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) "); - // *** *** *** *** *** *** - - if (DEBUG) DEBUG_MESSAGE(") ", o_tokens); // DEBUG - } else { - // Call a Global fun int - - if (DEBUG) - DEBUG_MESSAGE( - "[CALL-GLOBAL-FUNCTION-STRING ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" FUNCTION_" + - Global_ID[SYNTAX[p]] + "( "); - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, - TheFunction, TempToken, (TempTokenCount - 1), - o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) "); - // *** *** *** *** *** *** - } - } else if (FUN_TYPE == "منطق") { - if (IS_LOCAL_FUN) - ErrorCode("لا يمكن تحويل الدالة المحلية ' " + - SYNTAX[p] + "()' من منطق إلى نص ", - o_tokens); - else - ErrorCode("لا يمكن تحويل الدالة العامة ' " + - SYNTAX[p] + "()' من منطق إلى نص ", - o_tokens); - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + - "()' ", - o_tokens); - } - } else if (OBJECTIF_TYPE == "منطق") { - if (FUN_TYPE == "عدد") { - if (IS_LOCAL_FUN) - ErrorCode("لا يمكن تحويل الدالة المحلية ' " + - SYNTAX[p] + "()' من عدد إلى منطق ", - o_tokens); - else - ErrorCode("لا يمكن تحويل الدالة العامة ' " + - SYNTAX[p] + "()' من عدد إلى منطق ", - o_tokens); - } else if (FUN_TYPE == "نص") { - if (IS_LOCAL_FUN) - ErrorCode("لا يمكن تحويل الدالة المحلية ' " + - SYNTAX[p] + "()' من نص إلى منطق ", - o_tokens); - else - ErrorCode("لا يمكن تحويل الدالة العامة ' " + - SYNTAX[p] + "()' من نص إلى منطق ", - o_tokens); - } else if (FUN_TYPE == "منطق") { - if (IS_LOCAL_FUN) { - // Call a local fun bool - - if (DEBUG) - DEBUG_MESSAGE("[CALL-LOCAL-FUNCTION-BOOL ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" NS_" + ID[TheNamespace] + - "::FUNCTION_" + ID[SYNTAX[p]] + - "( "); - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, - TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, - (TempTokenCount - 1), o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) "); - // *** *** *** *** *** *** - } else { - // Call a Global fun bool - - if (DEBUG) - DEBUG_MESSAGE("[CALL-GLOBAL-FUNCTION-BOOL ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" FUNCTION_" + - Global_ID[SYNTAX[p]] + "( "); - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, - TheFunction, TempToken, (TempTokenCount - 1), - o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) "); - // *** *** *** *** *** *** - } - } else { - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + SYNTAX[p] + - "()' ", - o_tokens); - } - } else if (OBJECTIF_TYPE == "C++") { - // xType: We igiore type of function.. this is C++ targed - // user must take care of this!. - - if (IS_LOCAL_FUN) { - // Call a local fun xType - - if (DEBUG) - DEBUG_MESSAGE("[C++ CALL-LOCAL-FUNCTION-xType ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" NS_" + ID[TheNamespace] + - "::FUNCTION_" + ID[SYNTAX[p]] + "( "); - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - false, TMP_NAMESPACE_OR_CLASS, SYNTAX[p], 0, - TMP_NAMESPACE_OR_CLASS, TheFunction, TempToken, - (TempTokenCount - 1), o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) "); - // *** *** *** *** *** *** - } else { - // Call a Global fun xType - - if (DEBUG) - DEBUG_MESSAGE("[C++ CALL-GLOBAL-FUNCTION-xType ' " + - SYNTAX[p] + " '] (", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" FUNCTION_" + Global_ID[SYNTAX[p]] + - "( "); - // *** *** *** *** *** *** - - CG_BUFFER.append(CHECK_CALL_FUN_ARG( - true, "", SYNTAX[p], 0, TMP_NAMESPACE_OR_CLASS, - TheFunction, TempToken, (TempTokenCount - 1), - o_tokens)); - - // *** Generate Code *** - // Buffer - CG_BUFFER.append(" ) "); - // *** *** *** *** *** *** - } - } - - // *** Generate Code *** - CPP_CODE.append(" " + CG_BUFFER + " "); - // *** *** *** *** *** *** - - p = TMP_FUN_LONG; // point to next token after fun(...) - } - } - - // ----------------------------------- - // : (Operator between members) v3 - // ----------------------------------- - - else if (namespace_is_set[SYNTAX[p]] || SYNTAX[p + 1] == ":") { - // abc = namespace:local_func(a, b) | namespace:my_func(a, b) - // abc = namespace:local_var | namespace:my_var - - string CTR_WIN; - string CTR_CONTROL; - string CTR_OPTION; - string CTR_OPTION_TYPE; - string CTR_OPTION_CPP_END; - // int CTR_ARG; - int CTR_LAST_TOKEN_NUMBER = 0; - - if (namespace_is_set[SYNTAX[p]]) { - // abc = namespace:local_func(a, b) | namespace:my_func(a, - // b) abc = namespace:local_var | namespace:my_var - - // namespace_name : local_func ( - //... ) p +1 +2 - //+3 - - if (SYNTAX[p + 1] != ":") - ErrorCode("يجب اضافه ' : ' بعد ' " + SYNTAX[p] + " ' ", - o_tokens); - - if (SYNTAX[p + 2] == "") - ErrorCode( - "يجب اضافه عضو تابع ل ' " + SYNTAX[p] + " ' بعد ':' ", - o_tokens); - - if (SYNTAX[p + 3] == "") - ErrorCode("يجب اضافه ':' أو '()' بعد ' " + SYNTAX[p] + " " + - SYNTAX[p + 1] + " " + SYNTAX[p + 2] + " ' ", - o_tokens); - - if (SYNTAX[p + 3] != "(" && SYNTAX[p + 3] != ":") - ErrorCode("أمر غير معروف ' " + SYNTAX[p + 3] + - " ', يجب اضافه ':' أو '()' ", - o_tokens); - - if (SYNTAX[p + 3] == "(") { - if (L_FUN_IS_SET[std::make_pair(SYNTAX[p], - SYNTAX[p + 2])]) { - // --------------------------------------------------------------------------------- - // namespace : member_function () - // --------------------------------------------------------------------------------- - - // abc = namespace:local_func(a, b) | - // namespace:my_func(a, b) - - if (SYNTAX[p + 3] != "(") - ErrorCode("من اجل نداء الدالة ' " + SYNTAX[p + 2] + - " ' يجب اضافه '()' بعد ' " + - SYNTAX[p] + " " + SYNTAX[p + 1] + - " " + SYNTAX[p + 2] + " ' ", - o_tokens); - - std::string FUN_TYPE; - std::string CPP_END; - - FUN_TYPE = L_FUN_TYPE[std::make_pair( - TMP_NAMESPACE_OR_CLASS, SYNTAX[p])]; - - if (FUN_TYPE == "عادم") - ErrorCode("الدالة المحلية ' " + SYNTAX[p] + - "()' من نوع عادم, لدى لا يمكن " - "تحويلها إلى " + - OBJECTIF_TYPE, - o_tokens); - - if (OBJECTIF_TYPE == "عدد") { - if (FUN_TYPE == "عدد") { - if (DEBUG) - DEBUG_MESSAGE("[NS'" + SYNTAX[p] + - " ':LOCAL_INT_FUNC'" + - SYNTAX[p + 2] + " '( ", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CPP_END = " "; - CPP_CODE.append(" NS_" + ID[SYNTAX[p]] + - "::FUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } else { - ErrorCode("لا يمكن تحويل الدالة المحلية ' " + - SYNTAX[p + 2] + "()' من " + - FUN_TYPE + " إلى عدد ", - o_tokens); - } - } else if (OBJECTIF_TYPE == "نص") { - if (FUN_TYPE == "نص") { - if (DEBUG) - DEBUG_MESSAGE("[NS'" + SYNTAX[p] + - " ':LOCAL_STRING_FUNC'" + - SYNTAX[p + 2] + " '( ", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CPP_END = " "; - CPP_CODE.append(" NS_" + ID[SYNTAX[p]] + - "::FUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } else if (FUN_TYPE == "عدد") { - if (DEBUG) - DEBUG_MESSAGE("[NS'" + SYNTAX[p] + - " ':LOCAL_INT_FUNC'" + - SYNTAX[p + 2] + - " '().ToString( ", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CPP_END = " ) "; - CPP_CODE.append( - " alifcore_IntToString( OBJ_CLASS_WINDOW_" + - ID[SYNTAX[p]] + "::FUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } else { - ErrorCode("لا يمكن تحويل الدالة المحلية ' " + - SYNTAX[p + 2] + "()' من " + - FUN_TYPE + " إلى نص ", - o_tokens); - } - } else if (OBJECTIF_TYPE == "منطق") { - if (FUN_TYPE == "منطق") { - if (DEBUG) - DEBUG_MESSAGE("[NS'" + SYNTAX[p] + - " ':LOCAL_BOOL_FUNC'" + - SYNTAX[p + 2] + " '( ", - o_tokens); // DEBUG - - // *** Generate Code *** - // Buffer - CPP_END = " "; - CPP_CODE.append(" NS_" + ID[SYNTAX[p]] + - "::FUNCTION_" + - ID[SYNTAX[p + 2]] + "( "); - // *** *** *** *** *** *** - } else { - ErrorCode("لا يمكن تحويل الدالة المحلية ' " + - SYNTAX[p + 2] + "()' من " + - FUN_TYPE + " إلى منطق ", - o_tokens); - } - } else - ErrorCode("علة : نوع المستهدف غير معروف ' " + - OBJECTIF_TYPE + " -> " + - SYNTAX[p + 2] + " ' ", - o_tokens); - - // abc = (p)namespace:local_func(a, b) + x + y - - int TMP_FUN_LONG = p + 4; - int OPEN_PARENTIZE = 0; - - // Get Local Function Args - while (TMP_FUN_LONG <= SYNTAX_LONG) { - if (SYNTAX[TMP_FUN_LONG] == - "(") // مفتوح inside الدالة args : fun( a + - // (b)) - OPEN_PARENTIZE++; - else if (SYNTAX[TMP_FUN_LONG] == ")" && - OPEN_PARENTIZE > - 0) // Close inside الدالة args - OPEN_PARENTIZE--; - else if (SYNTAX[TMP_FUN_LONG] == ")" && - OPEN_PARENTIZE < - 1) // Close final الدالة call - { - if (TMP_FUN_LONG < SYNTAX_LONG) { - // abc = fun( a + (b)) + 123 - // abc = x + (fun(var)) * (fun(var) / - // fun(var, fun(var), var) - // - var) - - if ((SYNTAX[TMP_FUN_LONG + 1] != "+") && - (SYNTAX[TMP_FUN_LONG + 1] != "-") && - (SYNTAX[TMP_FUN_LONG + 1] != "*") && - (SYNTAX[TMP_FUN_LONG + 1] != "/") && - (SYNTAX[TMP_FUN_LONG + 1] != "،") && - (SYNTAX[TMP_FUN_LONG + 1] != ",") && - (SYNTAX[TMP_FUN_LONG + 1] != ")")) { - ErrorCode("نص غير معروف بعد نداء ' " + - SYNTAX[p + 2] + - "()' : ' " + - SYNTAX[TMP_FUN_LONG + 1] + - " ' ", - o_tokens); - } - } else if (TMP_FUN_LONG == SYNTAX_LONG) { - // a = fun( a + (b)) - if (SYNTAX[TMP_FUN_LONG] != ")" || - SYNTAX[SYNTAX_LONG] != - ")") // double check! - ErrorCode("يجب إنهاء نداء الدالة ' " + - SYNTAX[p + 2] + - "()' بالإشارة ')' ", - o_tokens); - } - - break; - } - - TMP_FUN_LONG++; - } - - if (SYNTAX[TMP_FUN_LONG] != ")") // Double check! - ErrorCode("يجب إنهاء نداء الدالة ' " + - SYNTAX[p + 2] + "()' بالإشارة ')' ", - o_tokens); - - std::string TempToken[1024]; - int TempTokenCount = 0; - for (int i = p + 4; i <= TMP_FUN_LONG; i++) { - if (SYNTAX[i] != "") { - TempToken[TempTokenCount] = SYNTAX[i]; - TempTokenCount++; - } - } - - // Check local fun Args : fun (a + c, 2 * (b - 1)) - CPP_CODE.append(CHECK_CALL_FUN_ARG( - false, SYNTAX[p], SYNTAX[p + 2], 0, TheNamespace, - TheFunction, TempToken, (TempTokenCount - 1), - o_tokens)); - - if (DEBUG) DEBUG_MESSAGE(")] \n\n", o_tokens); // DEBUG - - // *** Generate Code *** - CPP_CODE.append(" ) " + CPP_END + " "); - // *** *** *** *** *** *** - - // Point to last token of full func call - p = TMP_FUN_LONG; - - continue; - } - - // TODO: Add support for local var - // if (L_VAR_IS_SET[...]) <-- abc[namespace][var] = local - // var already set ? - - else - ErrorCode("النافذة ' " + SYNTAX[p] + - " ' لا تحتوي على دالة محليه بإسم ' " + - SYNTAX[p + 2] + " ' ", - o_tokens); - - // Exception! - continue; - } else { - // Exception ! - ErrorCode("يجب اضافه ':' أو '()' بعد ' " + SYNTAX[p] + " " + - SYNTAX[p + 1] + " " + SYNTAX[p + 2] + " ' ", - o_tokens); - } - } else { - // Exception ! - ErrorCode("أمر غير معروف ' " + SYNTAX[p] + - " ', كان من المتوقع أن يكون إسم مجال", - o_tokens); - } - - // Point to last token of full namespace:member. - p = CTR_LAST_TOKEN_NUMBER; - } - - // ----------------------------------- - // ERROR - // ----------------------------------- - - else { - // أو - if (SYNTAX[p] == "او" || SYNTAX[p] == "ٱو" || SYNTAX[p] == "آو" || - SYNTAX[p] == "والا" || SYNTAX[p] == "وإلا" || - SYNTAX[p] == "وألا") { - ErrorCode("بناء الجملة غير مفهوم : ' " + SYNTAX[p] + - " '، هل تقصد ' أو ' ؟ ", - o_tokens); - } else { - if (DEBUG) - DEBUG_MESSAGE("\nTMP_NAMESPACE_OR_CLASS --> '" + - TMP_NAMESPACE_OR_CLASS + "'\n ", - o_tokens); // DEBUG - if (DEBUG) - DEBUG_MESSAGE("TmpFunction --> '" + TmpFunction + "'\n ", - o_tokens); // DEBUG - if (DEBUG) - DEBUG_MESSAGE("SYNTAX[p] --> '" + SYNTAX[p] + "'\n ", - o_tokens); // DEBUG - - ErrorCode("بناء الجملة غير مفهوم : ' " + SYNTAX[p] + " ' ", - o_tokens); - } - } - } - - if (ALIF_PARENTHESIS_STATUS > 0 && !IS_IF_SYNTAX) - ErrorCode("غلق قوس مفقود ')' ", o_tokens); - - IS_IF_SYNTAX = false; - - return CPP_CODE; -} - -// ==================================================== - -std::string CHECK_CALL_FUN_ARG( - bool CALL_FUN_GLOBAL, - std::string CALL_WIN_OR_CLASS, // win1/class1 { fun1(int a) } | win2 { - // fun2{ عدد b; fun1(b) } } ==> win1 - std::string CALL_FUN, // win1 { fun1(int a) } | win2 { fun2{ عدد b; fun1(b) - // } } ==> fun1 - int CALL_IS_CLASS, // 0 = non class, 1 constructor, 2 = الدالة member, ل - // Message when new obj - std::string FROM_WIN_OR_CLASS, // win1 { fun1(int a) } | win2 { fun2{ عدد - // b; fun1(b) } } ==> win2 - std::string FROM_FUN, // win1 { fun1(int a) } | win2 { fun2{ عدد b; fun1(b) - // } } ==> fun2 - std::string SYNTAX[1024], int SYNTAX_LONG, CLASS_TOKEN *o_tokens) { - // SYNTAX[] : 1+1, b*2, ("test" + s) ) - // G_FUN_ARG_TYPE : INT, INT, STRING - - int CURRENT_ARG_NUMBER = 0; - - int p = 0; - std::string ARG[1024]; - int ARG_LONG = 1; - - ARG[0] = "="; - - int CALL_ARG_TOTAL = 0; - - std::string CPP_CODE; - - if (CALL_FUN_GLOBAL) { - // Call Global Fun - - CALL_ARG_TOTAL = G_FUN_ARG_TOTAL[CALL_FUN]; - - // check args - if (CALL_ARG_TOTAL > 0 && SYNTAX_LONG < 1) - ErrorCode("الدالة العامة ' " + CALL_FUN + "()' تأخد " + - IntToString(CALL_ARG_TOTAL) + " خاصية", - o_tokens); - - // الدالة العامة () without args - if (CALL_ARG_TOTAL == 0 && SYNTAX_LONG == 0) return ""; - } else { - // Call Local Fun - - CALL_ARG_TOTAL = - L_FUN_ARG_TOTAL[std::make_pair(CALL_WIN_OR_CLASS, CALL_FUN)]; - - // check args - if (CALL_ARG_TOTAL > 0 && SYNTAX_LONG < 1) - ErrorCode("الدالة المحلية ' " + CALL_FUN + "()' تأخد " + - IntToString(CALL_ARG_TOTAL) + " خاصية", - o_tokens); - - // الدالة المحلية () without args - if (CALL_ARG_TOTAL == 0 && SYNTAX_LONG == 0) return ""; - } - - // الدالة (int a, عدد b) with args - while (p <= SYNTAX_LONG) // using while is bcs need 'if p < - // G_FUN_ARG_TOTAL' بعد while finish - { - // if(DEBUG)DEBUG_MESSAGE("\n --[" + SYNTAX[p] + "|" + - // G_FUN_ARG_TYPE[std::make_pair(CALL_FUN, p)] + "]-- \n", o_tokens); // - // DEBUG - - if (SYNTAX[p] != "," && SYNTAX[p] != "،" && p < SYNTAX_LONG) { - if (DEBUG) - DEBUG_MESSAGE("-[ New ARG: " + SYNTAX[p] + " ]-", - o_tokens); // DEBUG - - ARG[ARG_LONG] = SYNTAX[p]; - ARG_LONG++; - } else { - // if(DEBUG)DEBUG_MESSAGE("-[" + - // CONVERT_STRING_ARRAY_TO_STRING(ARG,ARG_LONG) + "]-", o_tokens); - // // DEBUG ErrorCode("|G_FUN_ARG_TYPE TmpFunction: " + TmpFunction - // + " p : " - // + IntToString(p) + "|", o_tokens ); - - if (ARG_LONG < 2) // الدالة ( , ...) ['0'] =, [1] 'user arg', [2] - // null ل incrumentation - ErrorCode("إحدى الخصائص فارغة", o_tokens); - - if (CALL_FUN_GLOBAL) { - // نداء a الدالة العامة ( ... check ARG n ...) - - // الدالة (a,a,a) ل (a,a) - if ((CURRENT_ARG_NUMBER + 1) > CALL_ARG_TOTAL) - ErrorCode("خصائص أكثر من الازم، الدالة العامة ' " + - CALL_FUN + "()' تأخد فقط " + - IntToString(CALL_ARG_TOTAL) + " خاصية ", - o_tokens); - - // Current خاصية OBJECTIF_TYPE - CPP_CODE.append(CheckForSyntax( - G_FUN_ARG_TYPE[std::make_pair(CALL_FUN, - CURRENT_ARG_NUMBER)], - true, // Accept Using Reference إلى namespace:Controls - true, // Accept Using Reference إلى namespace:Function - true, // Accept Using Reference إلى Global Functions - true, // Accept Using Reference إلى Local Functions - true, // Accept Using Reference إلى Global VAR - true, // Accept Using Reference إلى Local VAR - false, // Accept Convertion من نص إلى Int - true, // Accept Convertion من عدد إلى String - ARG, // SYNTAX[] std::string - (ARG_LONG - 1), // SYNTAX_LONG int - FROM_WIN_OR_CLASS, // TMP_WINDOW_NAME - FROM_FUN, // TMP_FUNCTION_NAME - o_tokens)); - } else { - // نداء a الدالة المحلية ( ... check ARG n ...) - - // الدالة (a,a,a) ل (a,a) - if ((CURRENT_ARG_NUMBER + 1) > CALL_ARG_TOTAL) { - if (CALL_IS_CLASS == 1) // constructor - ErrorCode("خصائص أكثر من ألازم، دالة بناء الصنف ' " + - CALL_WIN_OR_CLASS + " ' تأخد فقط " + - IntToString(CALL_ARG_TOTAL) + " خاصية ", - o_tokens); - else if (CALL_IS_CLASS == 2) // الدالة member - ErrorCode("خصائص أكثر من ألازم، الدالة ' " + CALL_FUN + - " ' المنتمية للصنف ' " + - CALL_WIN_OR_CLASS + " ' تأخد فقط " + - IntToString(CALL_ARG_TOTAL) + " خاصية ", - o_tokens); - else - ErrorCode("خصائص أكثر من ألازم، الدالة ' " + CALL_FUN + - " ' تأخد فقط " + - IntToString(CALL_ARG_TOTAL) + " خاصية ", - o_tokens); - } - - // if(DEBUG)DEBUG_MESSAGE("-[ " + - // CONVERT_STRING_ARRAY_TO_STRING(ARG, ARG_LONG) + " ]-", - // o_tokens); // DEBUG ErrorCode(" Yep! ", o_tokens); - - // Current خاصية OBJECTIF_TYPE - CPP_CODE.append(CheckForSyntax( - L_FUN_ARG_TYPE[std::make_pair(CALL_WIN_OR_CLASS + CALL_FUN, - CURRENT_ARG_NUMBER)], - true, // Accept Using Reference إلى namespace:Controls - true, // Accept Using Reference إلى namespace:Function - true, // Accept Using Reference إلى Global Functions - true, // Accept Using Reference إلى Local Functions - true, // Accept Using Reference إلى Global VAR - true, // Accept Using Reference إلى Local VAR - false, // Accept Convertion من نص إلى Int - true, // Accept Convertion من عدد إلى String - ARG, // SYNTAX[] std::string - (ARG_LONG - 1), // SYNTAX_LONG int - FROM_WIN_OR_CLASS, // TMP_WINDOW_NAME - FROM_FUN, // TMP_FUNCTION_NAME - o_tokens)); - } - - ARG[0] = "="; - ARG_LONG = 1; // Point إلى next arg writed بالإشارة user - CURRENT_ARG_NUMBER++; // Point إلى next يدعى الدالة arg - - if (CURRENT_ARG_NUMBER < CALL_ARG_TOTAL) { - if (DEBUG) DEBUG_MESSAGE(", ", o_tokens); // DEBUG - CPP_CODE.append(" , "); - } - } - - p++; - } - - if (CALL_FUN_GLOBAL) { - // الدالة (a,a,a) ل (a,a) - if (CURRENT_ARG_NUMBER < CALL_ARG_TOTAL) - ErrorCode("خصائص قليلة, الدالة العامة ' " + CALL_FUN + "()' تأخد " + - IntToString(CALL_ARG_TOTAL) + - " خاصية، ثم إنشاء فقط " + - IntToString(CURRENT_ARG_NUMBER) + " خاصية ", - o_tokens); - } else { - // الدالة (a,a,a) ل (a,a) - if (CURRENT_ARG_NUMBER < CALL_ARG_TOTAL) { - if (CALL_IS_CLASS == 1) // constructor - ErrorCode("خصائص قليلة, دالة بناء الصنف ' " + - CALL_WIN_OR_CLASS + "()' تأخد " + - IntToString(CALL_ARG_TOTAL) + - " خاصية، ثم إنشاء فقط " + - IntToString(CURRENT_ARG_NUMBER) + " خاصية ", - o_tokens); - else if (CALL_IS_CLASS == 2) // الدالة member - ErrorCode("خصائص قليلة, الدالة منتمي ' " + CALL_FUN + - " ' داخل الصنف ' " + CALL_WIN_OR_CLASS + - "()' تأخد " + IntToString(CALL_ARG_TOTAL) + - " خاصية، ثم إنشاء فقط " + - IntToString(CURRENT_ARG_NUMBER) + " خاصية ", - o_tokens); - else - ErrorCode("خصائص قليلة, الدالة المحلية ' " + CALL_FUN + - "()' تأخد " + IntToString(CALL_ARG_TOTAL) + - " خاصية، ثم إنشاء فقط " + - IntToString(CURRENT_ARG_NUMBER) + " خاصية ", - o_tokens); - } - } - - return CPP_CODE; -} - -// ==================================================== - -void FINAL_CURRENT_FILE_CODE_CHECKING(CLASS_TOKEN *o_tokens) { - // if(DEBUG)DEBUG_MESSAGE("FINAL_CURRENT_FILE_CODE_CHECKING()... \n", - // o_tokens); // DEBUG - - // Function() - if (IsInsideFunction) - ErrorCode("يجب إغلاق الدالة : " + TheFunction, o_tokens); - - // Namespace() - if (IsInsideNamespace && TheNamespace != "") - ErrorCode("يجب إغلاق النافذة : " + TheNamespace, o_tokens); - - // Class() - if (IsInsideClass) ErrorCode("يجب إغلاق الصنف : " + TheClass, o_tokens); - - // IF - if (ALIF_IF_STATUS > 0) - ErrorCode( - "مازال هناك " + IntToString(ALIF_IF_STATUS) + " شروط مازالت مفتوحه", - o_tokens); - - // WHILE - if (ALIF_LOOP_STATUS > 0) - ErrorCode("مازال هناك " + IntToString(ALIF_LOOP_STATUS) + - " كلما مازالت مفتوحه", - o_tokens); - - // #Alif - if (!ALIF_FLAG_FILE[o_tokens->PATH_FULL_SOURCE]) - ErrorCode( - "يجب الإعلان عن علم ألف اولا، المرجو اضافة ' #ألف ' في الأعلى", - o_tokens); -} - -// ==================================================== - -void FINAL_APPLICATION_CODE_CHECKING(CLASS_TOKEN *o_tokens, bool FIRST_FILE) { - if (FIRST_FILE) { - if (DEBUG) - DEBUG_MESSAGE("\n ----------- FINAL CHECK ---------- \n", - o_tokens); // DEBUG - - // #Alif - if (!ALIF_FLAG_FILE[o_tokens->PATH_FULL_SOURCE]) - ErrorCode( - "يجب الإعلان عن علم ألف اولا، المرجو اضافة ' #ألف ' في الأعلى", - o_tokens); - - // Main - if (!script.main.is_set) - ErrorCode( - "يجب إنشاء الدالة الرئيسية، لأنها تعتبر المدخل الرئيسي لهذا " - "التطبيق.", - o_tokens); - } -} - -// Setup ******************************************************** - -#ifdef _WIN32 - -std::string GET_WORKING_PATH_WIN32() { - char working_directory[MAX_PATH + 1]; - GetCurrentDirectoryA(sizeof(working_directory), - working_directory); // **** win32 specific **** - return working_directory; -} - -#elif __APPLE__ - -#include -#define GetCurrentDir getcwd - -#else - -#include -#define GetCurrentDir getcwd - -#endif - -std::string GET_WORKING_PATH() { - // https://msdn.microsoft.com/en-us/library/sf98bd4y.aspx - - char *buffer; - - if ((buffer = GetCurrentDir(NULL, 0)) == NULL) { - return NULL; - } else { - // printf( "%s \nLength: %d\n", buffer, strnlen(buffer) ); - // free(buffer); - - return buffer; - } -} - -std::string GET_PATH_WITHOUT_FILE(std::string PATH) { - // In: /abc/def/test.xx - // Out: /abc/def/ - -#ifdef _WIN32 - int POSITION = PATH.find_last_of("\\/"); -#else - int POSITION = PATH.find_last_of("//"); -#endif - - if (POSITION < 1) // To avoid ABC/DEF/ or Relative Path - { - return ""; - } else { -#ifdef _WIN32 - return PATH.substr(0, PATH.find_last_of("\\/")); -#else - return PATH.substr(0, PATH.find_last_of("//")); -#endif - } -} - -bool is_path(std::string PATH_OR_FILE) { - // 'myfile.x' --> false. - // '/abc/test/myfile.x' --> true. - -#ifdef _WIN32 - int POSITION = PATH_OR_FILE.find_last_of("\\/"); -#else - int POSITION = PATH_OR_FILE.find_last_of("//"); -#endif - - if (POSITION < 1) - return false; - else - return true; -} - -std::string GET_PATH_WITHOUT_LAST_SEPARATION(std::string PATH) { - // In : '/abc/test/folder/' - // Out : '/abc/test/folder' - - std::string Last_Char = PATH.substr(PATH.length() - 1); // PATH.back() - -#ifdef _WIN32 - if (Last_Char == "\\") - return PATH.substr(0, PATH.length() - 1); - else - return PATH; -#else - if (Last_Char == "/") - return PATH.substr(0, PATH.length() - 1); - else - return PATH; -#endif -} - -int Temp_File_Rand() { - srand(time(NULL)); - return rand() % 10 + 1000; -} - -/* -bool CHECK_FOLDER_EXISTE(std::string PATH) -{ - #ifdef _WIN32 - // - #else - struct stat info; - - if( stat( PATH, &info ) != 0 ) - return false; // cannot access - else if( info.st_mode & S_IFDIR ) - return true; // is a directory - else - return false; // is no directory - #endif -} -*/ - -bool CHECK_SETUP() // std::string ARGV_0, std::string OUTPUT) -{ - if (DEBUG) - RANDOM = "0000"; - else - RANDOM = IntToString(Temp_File_Rand()); - -#ifdef _WIN32 - - // ------------------- - // Get Absolute Path - // ------------------- - - TCHAR WIN32_PATH_BUFFER[MAX_PATH]; - - if (!GetModuleFileNameW(NULL, WIN32_PATH_BUFFER, MAX_PATH)) { - ALIF_ERROR( - "Sorry, Can't get Absolut Path from Win API \n" - "Please add the path where 'alif.exe' existe, for example : \n\n" - "alif [source.alif] [output.exe] [logfile.txt] " - "-workpath=C:\\Alif "); - } - - wstring WIN32_PATH_BUFFER_W(&WIN32_PATH_BUFFER[0]); - - // PATH_ABSOLUTE = std::string(WIN32_PATH_BUFFER_W.begin(), - // WIN32_PATH_BUFFER_W.end()); - PATH_ABSOLUTE = ws_to_s(WIN32_PATH_BUFFER_W); - - PATH_ABSOLUTE = PATH_ABSOLUTE.substr(0, PATH_ABSOLUTE.find_last_of("\\/")); - - // ------------------- - // Get Working Path - // ------------------- - - if (PATH_WORKING.empty()) { - PATH_WORKING = GET_WORKING_PATH_WIN32(); - - if (PATH_WORKING == PATH_ABSOLUTE) { - // Tray a seconde solution ! - PATH_WORKING = GET_PATH_WITHOUT_FILE(PATH_FULL_ALIF); - } - } - - // ------------------- - // Get Temp Path - // ------------------- - - // C:\Users\Me\AppData\Local\Temp - - ostringstream TEMP_BUFFER; - TEMP_BUFFER << getenv("Temp"); - PATH_TEMP = TEMP_BUFFER.str(); - - // ------------------- - // Other Path - // ------------------- - - cc_path_full = PATH_ABSOLUTE + "\\gcc\\bin\\x86_64-w64-mingw32-g++.exe"; - PATH_FULL_CPP = PATH_TEMP + "\\alifcompiler_" + RANDOM + ".cpp"; - PATH_FULL_OBJ = PATH_TEMP + "\\alifcompiler_" + RANDOM + ".o"; - PATH_FULL_RC = PATH_TEMP + "\\alifcompiler_" + RANDOM + ".rc"; - PATH_FULL_ICO = PATH_ABSOLUTE + "\\aliflib\\alif.ico"; - - // PATH_FULL_LIB_SETTING = PATH_ABSOLUTE + "\\aliflib\\aliflib.inf"; - -#elif __APPLE__ - - // Mac OS X - - // alif_1.0-1.pkg - // /usr/local/bin/alif - // /Library/Application - // Support/Aliflang/Alif_Compiler/aliflib/aliflib.inf - // /Library/Application - // Support/Aliflang/Alif_Compiler/linux_alif_version.inf - // /Library/Application - // Support/Aliflang/Alif_Compiler/Alif_Arabic_Programming_Language - // /Library/Application Support/Aliflang/Alif_Compiler/alif.icns - // /Library/Application Support/Aliflang/Alif_Compiler/Info.plist - - // alifstudio_1.0-1.pkg - // /Applications/Alif Studio.app - // /Library/Application - // Support/Aliflang/Alif_Studio/linux_alifstudio_version.inf - // /Library/Application Support/Aliflang/Alif_Studio/alifstudio.png - // /Library/Application Support/Aliflang/Alif_Studio/mupdate - - // ------------------- - // Get Absolute Path - // ------------------- - - PATH_ABSOLUTE = XSTR(INSTALL_PREFIX) "/bin"; - - // ------------------- - // Get Working Path - // ------------------- - - if (PATH_WORKING.empty()) { - PATH_WORKING = GET_WORKING_PATH(); - - if (PATH_WORKING == PATH_ABSOLUTE) { - // Tray a seconde solution ! - PATH_WORKING = GET_PATH_WITHOUT_FILE(PATH_FULL_ALIF); - } - } - - // ------------------- - // Get Temp Path - // ------------------- - - PATH_TEMP = getenv("TMPDIR"); - - // ------------------- - // Other Path - // ------------------- - - PATH_FULL_BIN_TMP = PATH_TEMP + "/alifcompiler_bin_" + RANDOM; - - cc_path_full = "clang++"; - PATH_FULL_CPP = PATH_TEMP + "/alifcompiler_" + RANDOM + ".cpp"; - PATH_FULL_OBJ = PATH_TEMP + "/alifcompiler_" + RANDOM + ".o"; - PATH_FULL_RC = ""; - PATH_FULL_ICO = - "/Library/Application Support/Aliflang/Alif_Compiler/alif.icns"; - - PATH_FULL_LIB_SETTING = - "/Library/Application " - "Support/Aliflang/Alif_Compiler/aliflib/aliflib.inf"; - - // PATH_FULL_PLIST = "/Library/Application - // Support/Aliflang/Alif_Compiler/Info.plist"; - -#else - - // Linux - - // aliflang_1.0-1.deb - // /usr/local/bin/alif.bin - // /usr/local/lib/aliflib/aliflib.inf - // /usr/local/share/aliflang/copyright - // /usr/local/share/aliflang/linux_alif_version.inf - // /usr/local/share/aliflang/Alif_Arabic_Programming_Language - - // alifstudio_1.0-1.deb - // /usr/local/bin/alifstudio.bin - // /usr/local/bin/mupdate.bin - // /usr/local/share/alifstudio/copyright - // /usr/local/share/alifstudio/linux_alifstudio_version.inf - // /usr/share/alifstudio/alifstudio.ico - // /usr/share/alifstudio/alifstudio.png - // /usr/share/applications/'Alif Studio' - - // ------------------- - // Get Absolute Path - // ------------------- - - PATH_ABSOLUTE = XSTR(INSTALL_PREFIX) "/bin"; - - // ------------------- - // Get Working Path - // ------------------- - - if (PATH_WORKING.empty()) { - PATH_WORKING = GET_WORKING_PATH(); - - if (PATH_WORKING == PATH_ABSOLUTE) { - // Tray a seconde solution ! - PATH_WORKING = GET_PATH_WITHOUT_FILE(PATH_FULL_ALIF); - } - } - - // ------------------- - // Get Temp Path - // ------------------- - using namespace boost::filesystem; - path path = temp_directory_path() / unique_path(); - create_directories(path); - PATH_TEMP = path.string(); - - // ------------------- - // Other Path - // ------------------- - - cc_path_full = "g++"; - PATH_FULL_CPP = PATH_TEMP + "/alifcompiler_" + RANDOM + ".cpp"; - PATH_FULL_OBJ = PATH_TEMP + "/alifcompiler_" + RANDOM + ".o"; - PATH_FULL_RC = ""; - PATH_FULL_ICO = ""; - - // PATH_FULL_LIB_SETTING = "/usr/local/lib/aliflib/aliflib.inf"; - -#endif - - // TODO: check installation.. - // trim all var.. - // check gcc installation.. return false; - // tray create file to check for errors.. - // if mac, be sure PATH_FULL_BIN end with ".app" - - if (PATH_FULL_BIN == PATH_FULL_LOG) { - ALIF_ERROR("ERROR: The binary file and the log are the same."); - } - - if (PATH_WORKING.empty()) { - ALIF_ERROR("ERROR: Can't get Working Path. \n"); - return false; - } - - // Fix GNU LD Bug. - if (PATH_FULL_BIN.find("Windows") != std::string::npos) { - ALIF_ERROR( - "ERROR: Alif can't run from a path contain the word 'Windows', " - "because of a GNU LD Bug. \nPath: " + - PATH_FULL_BIN + - "\nPlease rename the folder 'Windows' to samthing else and tray " - "again. \n"); - return false; - } - - /* - cout << "PATH_ABSOLUTE : " << PATH_ABSOLUTE << endl; - cout << "PATH_WORKING : " << PATH_WORKING << endl << endl; - cout << "PATH_FULL_ALIF : " << PATH_FULL_ALIF << endl; - cout << "PATH_FULL_BIN : " << PATH_FULL_BIN << endl; - cout << "PATH_FULL_LOG : " << PATH_FULL_LOG << endl << endl; - cout << "cc_path_full : " << cc_path_full << endl; - cout << "PATH_FULL_CPP : " << PATH_FULL_CPP << endl; - cout << "PATH_FULL_OBJ : " << PATH_FULL_OBJ << endl; - cout << "PATH_FULL_RC : " << PATH_FULL_RC << endl; - cout << "PATH_FULL_ICO : " << PATH_FULL_ICO << endl << endl; - #if __APPLE__ - cout << "PATH_FULL_BIN_TMP : " << PATH_FULL_BIN_TMP << endl; - cout << "PATH_FULL_PLIST : " << PATH_FULL_PLIST << endl; - #endif - AlifExitFailure(); - */ - - return true; -} - -// Generator **************************************************** - -// Alif 3 -std::string code_core; -std::string code_stack; -std::string code; -std::string code_entry_point; - -enum code_t : unsigned short { STACK, CODE, ENTRY_POINT }; - -void code_add(code_t type, std::string c) { - if (type == STACK) code_stack.append(c); - if (type == CODE) code.append(c); - if (type == ENTRY_POINT) code_entry_point.append(c); -} - -// - - - - - - - - - - - - - - - - - - - -// General (Old) -std::string CPP_ID_DECLARATION; -std::string CPP_GLOBAL; -std::string CPP_OBJ_DECLARATION; -// std::string CPP_FUN; -std::string CPP_GLOBAL_FUN; -std::string CPP_CLASS; - -// Namespace -std::map, std::string>CPP_WINDOW; // [window][option] = value - -// Platformes - -// PC Console -std::string CODE_GENERATOR_GET_PC_CONSOLE() { return ""; } - -// PC GUI - -// ---------------------------------- -// C++ Add Code to the current Function -// ---------------------------------- - -void cpp_AddScript(std::string FUN, std::string NEW_CODE) { - // code.append(NEW_CODE); - - // if (IsInsideClass) - // CPP_CLASS.append(NEW_CODE); - // else - // CPP_GLOBAL_FUN.append(NEW_CODE); - - if (IsInsideClass) { - // Local Class Function - CPP_CLASS.append(NEW_CODE); - } else { - // Local Namespace Function - // Local Namespace Main Function - - if (FUN != "رئيسية") { - // Normal Function - CPP_GLOBAL_FUN.append(NEW_CODE); - } else { - // Main Function - // CBUFER = CPP_WINDOW[std::make_pair(TheNamespace, "LOAD")]; - // CPP_WINDOW[std::make_pair(TheNamespace, "LOAD")] = CBUFER + - // NEW_CODE; - - code_entry_point.append(NEW_CODE); - } - } -} - -// ---------------------------------- -// WinX Load() -// ---------------------------------- - -std::string CG_WINX_LOAD() { - std::string CODE; - std::string BUFFER; - - for (int i = 1; i <= Namespace_Total; i++) { - BUFFER = R"( - - // ======================================================================== - // ------------------------------------------------ - // Namespace X )" + - ID[Namespace_Total_Names[i]] + R"( Load() - // ------------------------------------------------ - - void WINDOW_LOAD_)" + - ID[Namespace_Total_Names[i]] + R"(() - { - )" + - CPP_WINDOW[std::make_pair(Namespace_Total_Names[i], "LOAD")] + - R"( - } - // ======================================================================== - - )"; - - CODE.append(BUFFER); - } - - return CODE; -} - -// ---------------------------------- -// C++ CODE INITIALIZATION -// ---------------------------------- - -void CG_INITIALIZATION() { - //رئيسية - - SET_C_NAME("رئيسية"); - SET_CONTROL_C_NAME("AlifUIWeb"); - - // x = افصول - // y = ارتوب - CPP_WINDOW[std::make_pair("رئيسية", "نص")] = " (رئيسية) مجال بدون عنوان"; -#ifdef __APPLE__ - CPP_WINDOW[std::make_pair("رئيسية", "افصول")] = "10"; - CPP_WINDOW[std::make_pair("رئيسية", "ارتوب")] = - "25"; // Because the macOS task-bar is on top screen. -#else - CPP_WINDOW[std::make_pair("رئيسية", "افصول")] = "0"; - CPP_WINDOW[std::make_pair("رئيسية", "ارتوب")] = "0"; -#endif - CPP_WINDOW[std::make_pair("رئيسية", "عرض")] = "400"; - CPP_WINDOW[std::make_pair("رئيسية", "ارتفاع")] = "400"; - - CPP_WINDOW[std::make_pair("رئيسية", "شكل")] = - "wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | " - "wxCLIP_CHILDREN"; - // wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | - // wxCLIP_CHILDREN) wxMAXIMIZE_BOX - - Namespace_Total = 0; - Namespace_Total_Names[0] = "رئيسية"; - L_FUN_TYPE[std::make_pair("رئيسية", "رئيسية")] = "عادم"; -} - -// ---------------------------------- -// C++ CODE INITIALIZATION -// ---------------------------------- - - - -// ----------------------------------------------------------- -// C++ CODE -// ----------------------------------------------------------- - -// TODO: So, when tray GetValue() of control of destroyed Win -// the app not continue the fucntion... so, solution is be sure -// the windows is constructed before control:GetValue() [ MyControl:نص ] - -// // ------------------------------------------------ -// // Generated by Alif Compiler )" + VERSION + R"( -// // www.aliflang.org -// // ------------------------------------------------ - -std::string CODE_GENERATOR_GET_PC_GUI() { - return R"( - /* - Generated by Alif Compiler v)" + - VERSION + R"( - www.aliflang.org - */ - - // --[ Core ] ------------------------------------- - )" + - code_core + R"( - - // ++++++++++++++++++++++++++++++++++++++++++++++++ - // Alif 2.x - // - // --[ CPP_ID_DECLARATION ]------------------------ - )" + - CPP_ID_DECLARATION + R"( - // --[ CPP_GLOBAL ]-------------------------------- - )" + - CPP_GLOBAL + R"( - // --[ CPP_OBJ_DECLARATION ]----------------------- - )" + - CPP_OBJ_DECLARATION + R"( - // --[ CPP_WINDOW[][FUN_DECLARATION] ]------------- - )" + - CPP_WINDOW[std::make_pair("", "FUN_DECLARATION")] + R"( - // --[ CPP_WINDOW[][LOAD] ]------------------------ - )" + - CPP_WINDOW[std::make_pair("", "LOAD")] + R"( - // --[ CPP_WINDOW[رئيسية][FUN_DECLARATION] ]------ - )" + - CPP_WINDOW[std::make_pair("رئيسية", "FUN_DECLARATION")] + R"( - // --[ CPP_WINDOW[رئيسية][LOAD] ]----------------- - )" + - CPP_WINDOW[std::make_pair("رئيسية", "LOAD")] + R"( - // --[ CPP_CLASS ]--------------------------------- - )" + - CPP_CLASS + R"( - // --[ CPP_FUN ]----------------------------------- - // CPP_FUN - // --[ CPP_GLOBAL_FUN ]---------------------------- - )" + - CPP_GLOBAL_FUN + R"( - // ++++++++++++++++++++++++++++++++++++++++++++++++ - - // --[ Stack ] ------------------------------------ - )" + - code_stack + R"( - - // --[ Code ] ------------------------------------- - )" + - code + R"( - - // --[ Entry point ] ------------------------------ - void _alif_main(){ - - alifcore_initialization(); - - )" + - code_entry_point + R"( - - } - - #ifdef _WIN32 - int wmain(int argc, wchar_t* argv[]) { _alif_main(); return 0;} - int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow) { _alif_main(); return 0;} - #elif __APPLE__ - int main(int argc, char** argv) { _alif_main(); return 0;} - #else - int main(int argc, char** argv) { _alif_main(); return 0;} - #endif - - // ------------------------------------------------ - // Generated by Alif Compiler v)" + - VERSION + R"( - // www.aliflang.org - // ------------------------------------------------ - )"; -} - -// Phone Android -std::string CODE_GENERATOR_GET_PHONE_ANDROID() { return ""; } - -void set_input_file(std::string file) { - boost::filesystem::path p(file); - - std::string p_buf = p.parent_path().string(); - if (p_buf.empty()) p_buf = boost::filesystem::current_path().string(); - - argument.input.path = p_buf + settings.os.path_sep; - argument.input.filename = p.stem().string(); - argument.input.extension = p.extension().string(); - - // Check root path - if (argument.input.path == settings.os.path_sep) argument.input.path = ""; - - // Check input extention - if (argument.input.extension != ".alif") - err("Unsupported file extention.\n" - "Extention: " + - argument.input.extension + - "\n" - "File: " + - argument.input.path + argument.input.filename + - argument.input.extension); - - argument.input.fullpath = argument.input.path + argument.input.filename + - argument.input.extension; -} - -void set_output_file(std::string file) { - boost::filesystem::path p(file); - - argument.output.path = p.parent_path().string() + settings.os.path_sep; - argument.output.filename = p.stem().string(); - argument.output.extension = p.extension().string(); - - // Check root path - if (argument.output.path == settings.os.path_sep) argument.output.path = ""; - - // Check output extention - if (argument.output.extension == "") - argument.output.extension = settings.os.exe_ext; - else if (argument.output.extension != settings.os.exe_ext) - err("Unsupported output extention.\n" - "Extention: " + - argument.output.extension + - "\n" - "File: " + - argument.output.path + argument.output.filename + - argument.output.extension); - - argument.output.fullpath = argument.output.path + argument.output.filename + - argument.output.extension; -} - -void set_log_file(std::string file) { - boost::filesystem::path p(file); - - argument.log.path = p.parent_path().string() + settings.os.path_sep; - argument.log.filename = p.stem().string(); - argument.log.extension = p.extension().string(); - - // Check root path - if (argument.log.path == settings.os.path_sep) argument.log.path = ""; - - // Check log extention - // if(argument.log.extension == "") - // argument.log.extension = ".log"; - // if(argument.log.extension == "") - // argument.log.extension = settings.os.exe_ext; - // else if(argument.log.extension != settings.os.exe_ext) - // err("Unsupported log extention.\n" - // "Extention: " + argument.log.extension + "\n" - // "File: " + argument.log.path + - // argument.outplogut.filename + argument.log.extension); - - // Check log - if (argument.log.filename == "") err("Log file name is empty."); - - argument.log.fullpath = - argument.log.path + argument.log.filename + argument.log.extension; - - // Empty file - boost::nowide::ofstream ofile(argument.log.fullpath); - if (ofile) { - ofile << ""; - ofile.close(); - } -} - -static const unsigned char base64_table[65] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -unsigned char *_base64_encode(const unsigned char *src, size_t len, - size_t *out_len) { - unsigned char *out, *pos; - const unsigned char *end, *in; - size_t olen; - int line_len; - - olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */ - olen += olen / 72; /* line feeds */ - olen++; /* nul termination */ - if (olen < len) return NULL; /* integer overflow */ - out = (unsigned char *)malloc(olen); - if (out == NULL) return NULL; - - end = src + len; - in = src; - pos = out; - line_len = 0; - while (end - in >= 3) { - *pos++ = base64_table[in[0] >> 2]; - *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)]; - *pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)]; - *pos++ = base64_table[in[2] & 0x3f]; - in += 3; - line_len += 4; - if (line_len >= 72) { - *pos++ = '\n'; - line_len = 0; - } - } - - if (end - in) { - *pos++ = base64_table[in[0] >> 2]; - if (end - in == 1) { - *pos++ = base64_table[(in[0] & 0x03) << 4]; - *pos++ = '='; - } else { - *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)]; - *pos++ = base64_table[(in[1] & 0x0f) << 2]; - } - *pos++ = '='; - line_len += 4; - } - - if (line_len) *pos++ = '\n'; - - *pos = '\0'; - if (out_len) *out_len = pos - out; - return out; -} - -unsigned char *_base64_decode(const unsigned char *src, size_t len, - size_t *out_len) { - unsigned char dtable[256], *out, *pos, block[4], tmp; - size_t i, count, olen; - int pad = 0; - - memset(dtable, 0x80, 256); - for (i = 0; i < sizeof(base64_table) - 1; i++) - dtable[base64_table[i]] = (unsigned char)i; - dtable['='] = 0; - - count = 0; - for (i = 0; i < len; i++) { - if (dtable[src[i]] != 0x80) count++; - } - - if (count == 0 || count % 4) return NULL; - - olen = count / 4 * 3; - pos = out = (unsigned char *)malloc(olen); - if (out == NULL) return NULL; - - count = 0; - for (i = 0; i < len; i++) { - tmp = dtable[src[i]]; - if (tmp == 0x80) continue; - - if (src[i] == '=') pad++; - block[count] = tmp; - count++; - if (count == 4) { - *pos++ = (block[0] << 2) | (block[1] >> 4); - *pos++ = (block[1] << 4) | (block[2] >> 2); - *pos++ = (block[2] << 6) | block[3]; - count = 0; - if (pad) { - if (pad == 1) - pos--; - else if (pad == 2) - pos -= 2; - else { - /* Invalid padding */ - if (out) free(out); - return NULL; - } - break; - } - } - } - - *out_len = pos - out; - return out; -} - -std::string base64_encode(std::string data) { - // Encode - - std::string buf = ""; - size_t len = 0; - unsigned char *pbuf = NULL; - - pbuf = _base64_encode((const unsigned char *)data.c_str(), data.length(), - &len); - buf = reinterpret_cast(pbuf); - // alifcore_trim(buf); - - // alifcore_free(pbuf); - - // std::cout << "Encode: [" << data << "] -> [" << buf << "] (" << len << " - // Bytes) \n"; - - return buf; -} - -std::string base64_decode(std::string data) { - // Decode - - std::string buf = ""; - size_t len = 0; - unsigned char *pbuf = NULL; - - pbuf = _base64_decode((const unsigned char *)data.c_str(), data.length(), - &len); - buf = reinterpret_cast(pbuf); - // alifcore_trim(buf); - - // alifcore_free(pbuf); - - // std::cout << "Decode: [" << data << "] -> [" << buf << "] (" << len << " - // Bytes) \n"; - - return buf; -} diff --git a/src/alif_end.hpp b/src/alif_end.hpp index e0a4982b..ba182fab 100644 --- a/src/alif_end.hpp +++ b/src/alif_end.hpp @@ -21,6 +21,247 @@ . */ -void parser_End(std::string Token[2048], CLASS_TOKEN *o_tokens){ - +void parser_End(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // نهاية + + if (Token[2] == "") + ErrorCode("نهايه من دون تحديد المستهدف", o_tokens); + + if (Token[3] != "") + ErrorCode("أمر غير معروف : ' " + Token[3] + " ' ", o_tokens); + + if (Token[2] == "دالة") + { + if (!IsInsideFunction) + ErrorCode("يجب استعمال نهايه داخل داله", o_tokens); + + if (ALIF_IF_STATUS > 0) + ErrorCode("مازال هناك " + IntToString(ALIF_IF_STATUS) + + " شروط مازالت مفتوحه", + o_tokens); + + if (ALIF_LOOP_STATUS > 0) + ErrorCode("مازال هناك " + IntToString(ALIF_LOOP_STATUS) + + " كلما مازالت مفتوحه", + o_tokens); + + if (IsInsideClass) + { + if (!o_tokens->TOKENS_PREDEFINED) + { + IsInsideFunction = false; // Need by Tokens Predefined + TheFunction = ""; // Need by Tokens Predefined + return; // continue; + } + + if (RETURN_FUN[std::make_pair(TheClass, TheFunction)] == "") + ErrorCode("يجب تعيين إرجاع للدالة ' " + TheFunction + " ' ", o_tokens); + + if (RETURN_FUN[std::make_pair(TheClass, TheFunction)] == "IF") + ErrorCode("لقد عينت إرجاع مشروطه للدالة ' " + TheFunction + " ' ", + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[END CLASS-FUNCTION] {" + TheFunction + "} \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // End Class Func() + CPP_CLASS.append(" \n } \n"); + // *** *** *** *** *** *** + } + else if (!IsInsideNamespace) + { + if (!o_tokens->TOKENS_PREDEFINED) + { + IsInsideFunction = false; // Need by Tokens Predefined + TheFunction = ""; // Need by Tokens Predefined + return; // continue; + } + + if (RETURN_FUN[std::make_pair("", TheFunction)] == "") + ErrorCode("يجب تعيين إرجاع للدالة ' " + TheFunction + " ' ", o_tokens); + + if (RETURN_FUN[std::make_pair("", TheFunction)] == "IF") + ErrorCode("لقد عينت إرجاع مشروطه للدالة ' " + TheFunction + " ' ", + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[END GLOBAL-FUNCTION] {" + TheFunction + "} \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // End Global Func() <-- Alif 2 + CPP_GLOBAL_FUN.append(" \n } \n"); + + // Alif 3 + // if(TheFunction != "رئيسية") + // CPP_GLOBAL_FUN.append(" \n } \n"); + // *** *** *** *** *** *** + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + IsInsideFunction = false; // Need by Tokens Predefined + TheFunction = ""; // Need by Tokens Predefined + return; // continue; + } + + if (RETURN_FUN[std::make_pair(TheNamespace, TheFunction)] == "") + ErrorCode("يجب تعيين إرجاع للدالة ' " + TheFunction + " ' ", o_tokens); + if (RETURN_FUN[std::make_pair(TheNamespace, TheFunction)] == "IF") + ErrorCode("لقد عينت إرجاع مشروطه للدالة ' " + TheFunction + " ' ", + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[END FUNCTION] {" + TheFunction + "} \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // End Local Func() + if (TheFunction != "رئيسية") + CPP_GLOBAL_FUN.append(" \n } \n"); + // *** *** *** *** *** *** + } + + IsInsideFunction = false; + TheFunction = ""; + return; // continue; + } + else if (Token[2] == "إذا") + { + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (ALIF_IF_STATUS < 1) + ErrorCode("بدايه الشرط غير موجود", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[END IF " + IntToString(ALIF_IF_STATUS) + "] \n\n", + o_tokens); // DEBUG + + if (IsInsideClass) + { + // just for fixing this ... + // *** Generate Code *** + CPP_CLASS.append("\n } \n "); + // *** *** *** *** *** *** + } + else if (!IsInsideNamespace) + // global func + CPP_GLOBAL_FUN.append("\n } \n "); + else + // local func + cpp_AddScript(TheFunction, "\n } \n "); + // *** *** *** *** *** *** + + ALIF_IF_STATUS--; + return; // continue; + } + else if (Token[2] == "كلما") + { + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (ALIF_LOOP_STATUS < 1) + ErrorCode("بدايه كلما غير موجود", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[END LOOP " + IntToString(ALIF_LOOP_STATUS) + "] \n\n", + o_tokens); // DEBUG + + if (IsInsideClass) + { + // just for fixing this ... + // *** Generate Code *** + CPP_CLASS.append("\n } \n "); + // *** *** *** *** *** *** + } + else if (!IsInsideNamespace) + // global func + CPP_GLOBAL_FUN.append("\n } \n "); + else + // local func + cpp_AddScript(TheFunction, "\n } \n "); + // *** *** *** *** *** *** + + ALIF_LOOP_STATUS--; + return; // continue; + } + else if (Token[2] == "مجال") + { + if (!IsInsideNamespace) + ErrorCode("يجب ان تكون داخل مجال", o_tokens); + + if (IsInsideFunction) + ErrorCode("يجب اغلاق الدالة : " + TheFunction, o_tokens); + + if (!o_tokens->TOKENS_PREDEFINED) + { + IsInsideNamespace = false; // Need by Tokens Predefined + TheNamespace = ""; // Need by Tokens Predefined + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[END NAMESPACE] {" + TheNamespace + "} \n\n", + o_tokens); // DEBUG + + CPP_GLOBAL_FUN.append("\n }; \n "); // Close the namespace. + + IsInsideNamespace = false; + TheNamespace = ""; + return; // continue; + } + else if (Token[2] == "صنف") + { + if (!IsInsideClass) + ErrorCode("يجب أن تكون داخل صنف", o_tokens); + + if (IsInsideFunction) + ErrorCode("يجب اغلاق الدالة : " + TheFunction, o_tokens); + + if (!o_tokens->TOKENS_PREDEFINED) + { + IsInsideClass = false; // Need by Tokens Predefined + TheClass = ""; // Need by Tokens Predefined + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[END CLASS] {" + TheClass + "} \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + /* + if (!IsInsideFunction) + CPP_GLOBAL.append(" }; \n "); + else + cpp_AddScript(TheFunction, " }; \n "); + */ + CPP_CLASS.append("\n }; \n "); // Close the Class. + CPP_CLASS.append(OBJ_GLOBAL_DECLARATION[TheClass] + + " \n "); // Add all global objs related to this class. + // *** *** *** *** *** *** + + IsInsideClass = false; + OBJ_GLOBAL_DECLARATION[TheClass] = ""; + TheClass = ""; + return; // continue; + } + else + { + if (Token[2] == "ادا" || Token[2] == "إدا" || Token[2] == "أدا" || + Token[2] == "اذا" || Token[2] == "أذا") + { + ErrorCode("أمر غير معروف : ' " + Token[2] + + " '، هل تقصد ' نهاية إذا ' ؟ ", + o_tokens); + } + else + ErrorCode("أمر غير معروف : ' " + Token[2] + " ' ", o_tokens); + + // TODO: More doyo mean ?! + } } diff --git a/src/alif_function.hpp b/src/alif_function.hpp index a7900ca1..7983c075 100644 --- a/src/alif_function.hpp +++ b/src/alif_function.hpp @@ -21,8 +21,7 @@ . */ - -void __parser_Function(std::string Token[2048], CLASS_TOKEN *o_tokens) +void parser_Function(std::string Token[2048], CLASS_TOKEN *o_tokens) { //دالة @@ -1201,70 +1200,3 @@ void __parser_Function(std::string Token[2048], CLASS_TOKEN *o_tokens) } } } - -void parser_Function(std::string Token[2048], CLASS_TOKEN *o_tokens){ - - // دالة - - int FuncPosition = 1; - - // --- Check for errors --------------------------------------- - - if (IsInsideFunction) - ErrorCode("لا يمكن انشاء دالة داخل دالة، الدالة الحالية : " + TheFunction, o_tokens); - - if (Token[FuncPosition + 1] == "") - ErrorCode("يجب اعطاء اسم لهته الدالة الجديدة", o_tokens); - - if (Token[FuncPosition + 2] != "" && Token[FuncPosition + 2] != "(") - ErrorCode("أمر غير معروف : ' " + Token[FuncPosition + 2] + " ' ", o_tokens); - - if (Token[FuncPosition + 1] == "رئيسية"){ - - // دالة رئيسية () - - if (IsInsideNamespace) - ErrorCode("لا يمكن انشاء دالة رئيسية داخل مجال، بل يجب انشائها في المجال " - "العام أو داخل صنف", - o_tokens); - - if (Token[FuncPosition + 2] == "(") - { - if (Token[FuncPosition + 3] == "") - ErrorCode("يجب اغلاق القوس ')' ", o_tokens); - - if (Token[FuncPosition + 3] != ")") - ErrorCode("الدالة الرئيسية لا تقبل الخصائص", o_tokens); - - if (Token[FuncPosition + 4] != "") - ErrorCode("أمر غير معروف : ' " + Token[FuncPosition + 4] + " ' ", o_tokens); - } - - // Set - MAIN_FUN_IS_SET[TheNamespace] = true; // Old v2 - MAIN_FUN_AT_LINE[TheNamespace] = IntToString(o_tokens->Line); // Old v2 - IsInsideFunction = true; // Need by Tokens Predefined - TheFunction = "رئيسية"; // Need by Tokens Predefined - script.main.is_set = true; - script.main.set_at_line = IntToString(o_tokens->Line); - return; - } - - // --- Set current parent --------------------------------------- - - // --- Initializing --------------------------------------------- - - // --- Identify ------------------------------------------------- - - // --- Check ---------------------------------------------------- - - // --- ARGV ----------------------------------------------------- - - // --- Gen. Code ------------------------------------------------ - - // --- Add. Code ------------------------------------------------ - - -} - - diff --git a/src/alif_function_call.hpp b/src/alif_function_call.hpp index 6c7a997c..b569a069 100644 --- a/src/alif_function_call.hpp +++ b/src/alif_function_call.hpp @@ -21,6 +21,181 @@ . */ -void parser_FunctionCall(std::string Token[2048], CLASS_TOKEN *o_tokens){ - +void parser_FunctionCall(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + + // *myfunction(a, b, c..) + + if (!o_tokens->TOKENS_PREDEFINED) + return; + + // --- Check for errors --------------------------------------- + + if (!IsInsideFunction) + ErrorCode("لايمكن مناداة على دالة من خارج دالة '" + Token[1] + "()' ", + o_tokens); + + if (Token[2] == "") + ErrorCode("يجب اضافه '(' بعد اسم الدالة ' " + Token[1] + " ' ", o_tokens); + + if (Token[2] != "(") + ErrorCode("من أجل نداء الدالة العامة ' " + Token[1] + + "() ' يجب إضافة الإشارة ' ( ' قبل ' " + Token[2] + " ' ", + o_tokens); // TODO: Whats is this? + + if (Token[o_tokens->TOTAL[o_tokens->Line] - 1] != ")") + ErrorCode("يجب انهاء السطر بالإشارة ')' ", o_tokens); + + // --- Set current parent --------------------------------------- + + std::string CurrentParent = ""; + + if (IsInsideClass) + CurrentParent = TheClass; + else if (IsInsideNamespace) + CurrentParent = TheNamespace; + + // --- Initializing --------------------------------------------- + + bool CallClassFun = false; + bool CallGlobalFun = false; + std::string FuncParent = ""; + std::string FunName = ""; + std::string FunType = ""; + + // --- Identify ------------------------------------------------- + + if (L_FUN_IS_SET[std::make_pair(CurrentParent, Token[1])]) + { + + // Local + + FuncParent = CurrentParent; + FunName = Token[1]; + FunType = L_FUN_TYPE[std::make_pair(CurrentParent, Token[1])]; + + // Debug + if (DEBUG) + DEBUG_MESSAGE("Call Local-function [" + Token[1] + "] (", o_tokens); + } + else if (CLASS_FUN_IS_SET[std::make_pair(CurrentParent, Token[1])]) + { + + // Local Class + + CallClassFun = true; + FuncParent = CurrentParent; + FunName = Token[1]; + FunType = CLASS_FUN_TYPE[std::make_pair(CurrentParent, Token[1])]; + + // Debug + if (DEBUG) + DEBUG_MESSAGE("Call Class-function [" + Token[1] + "] (", o_tokens); + } + else if (G_FUN_IS_SET[(Token[1])]) + { + + // Global + + CallGlobalFun = true; + FunName = Token[1]; + FunType = G_FUN_TYPE[(Token[1])]; + + // Debug + if (DEBUG) + DEBUG_MESSAGE("Call Global-function [" + Token[1] + "] (", o_tokens); + } + else + { + + // Error + ErrorCode("علة: نوع الدالة غير معروف'" + Token[1] + "' ", o_tokens); + } + + // --- Check ------------------------------------------------- + + // if (IsDataType(FunType)) + // ErrorCode("الدالة المحلية ' " + FunName + "()' من نوع " + FunType + ", + //لذلك أنت بحاجة إلى متغير للحصول على قيمة الرجوع", o_tokens); + + // --- ARGV ------------------------------------------------- + + if (o_tokens->TOTAL[o_tokens->Line] > 3) + { + + TempTokenCount = 0; + for (int p = 3; p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + + // ... [a, b + 2, c(...), d*x)] + + if (Token[p] != "") + { + + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + ScriptSyntaxBuffer = CHECK_CALL_FUN_ARG( + CallGlobalFun, FuncParent, FunName, CallClassFun, CurrentParent, + TheFunction, TempToken, (TempTokenCount - 1), o_tokens); + } + + // DEBUG + if (DEBUG) + DEBUG_MESSAGE(") ", o_tokens); + + // --- Gen. Code ------------------------------------------------- + + if (CallGlobalFun) + { + + // Call a Global func + ScriptBuffer = + " FUNCTION_" + Global_ID[FunName] + "( " + ScriptSyntaxBuffer + "); \n"; + } + else if (CallClassFun) + { + + // Call a Local-Class func + ScriptBuffer = + " ClassFUNCTION_" + ID[FunName] + "(" + ScriptSyntaxBuffer + "); \n"; + } + else + { + + // Call a Local func + ScriptBuffer = " NS_" + ID[TheNamespace] + "::FUNCTION_" + ID[FunName] + + "(" + ScriptSyntaxBuffer + "); \n"; + } + + // --- Add. Code ------------------------------------------------- + + if (IsInsideClass) + { + + // Class + CPP_CLASS.append(ScriptBuffer); + } + else if (IsInsideNamespace) + { + + // Local func + cpp_AddScript(TheFunction, ScriptBuffer); + } + else if (IsInsideFunction) + { + + // Global func + CPP_GLOBAL_FUN.append(ScriptBuffer); + } + else + { + + // Global + // CPP_GLOBAL.append(ScriptBuffer); + + ErrorCode("علة: لايمكن مناداة على دالة في مكان عام", o_tokens); + } } diff --git a/src/alif_function_class.hpp b/src/alif_function_class.hpp index 270fda8b..ddedf86d 100644 --- a/src/alif_function_class.hpp +++ b/src/alif_function_class.hpp @@ -21,6 +21,964 @@ . */ -void parser_FunctionClass(std::string Token[2048], CLASS_TOKEN *o_tokens){ - +void parser_FunctionClass(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // Class -> دالة + + if (IsInsideFunction) + ErrorCode("لا يمكن انشاء دالة داخل دالة، الدالة الحالية : " + TheFunction, + o_tokens); + + int FUN_POS = 1; + + if (Token[1] == "خاص") + FUN_POS = 2; + + if (Token[FUN_POS + 1] == "") + ErrorCode("يجب اعطاء اسم لهته الدالة الجديدة", o_tokens); + + if (Token[FUN_POS + 1] == "رئيسية") + ErrorCode("لايمكن إنشاء دالة رئيسية داخل صنف، هل تقصد ' بناء ' ؟", + o_tokens); + + if (Token[FUN_POS + 1] == "نقر") + ErrorCode("لايمكن إنشاء دالة نقر داخل صنف", o_tokens); + + if (Token[FUN_POS + 1] == "بناء") // Class -> Constrictor + { + if (Token[1] == "خاص") + ErrorCode(" ' دالة بناء الصنف لا يمكن ان تكون من نوع ' خاص", o_tokens); + + if (Token[FUN_POS + 2] != "" && Token[FUN_POS + 2] != "(") + ErrorCode("أمر غير معروف : ' " + Token[FUN_POS + 2] + " ' ", o_tokens); + + if (Token[FUN_POS + 2] == "") + { + // Class -> Constrictor. + + if (!o_tokens->TOKENS_PREDEFINED) + { + if (CLASS_CONSTRICTOR_FUN_IS_SET[TheClass]) + ErrorCode("دالة بناء الصنف تم انشاؤها مسبقا في السطر : " + + CLASS_CONSTRICTOR_FUN_AT_LINE[TheClass], + o_tokens); + + CLASS_CONSTRICTOR_FUN_IS_SET[TheClass] = true; + CLASS_CONSTRICTOR_FUN_AT_LINE[TheClass] = IntToString(o_tokens->Line); + + IsInsideFunction = true; // Need by Tokens Predefined + TheFunction = "بناء"; // Need by Tokens Predefined + + return; // continue; + } + + IsInsideFunction = true; + TheFunction = "بناء"; + + TheFunction_TYPE = "عادم"; + RETURN_FUN[std::make_pair(TheClass, "بناء")] = "OK"; + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION-CONSTRICTOR] [" + Token[FUN_POS + 1] + + "] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> CONSTRICTOR-Func. + CPP_CLASS.append(" public: CLASS_" + Global_ID[TheClass] + "() { \n"); + // *** *** *** *** *** *** + + return; // continue; + } + else if (Token[FUN_POS + 2] == "(") // دالة بناء Class ( ??? + { + if (Token[FUN_POS + 3] == ")") // دالة بناء Class (). + { + if (Token[FUN_POS + 4] != "") + ErrorCode("أمر غير معروف : ' " + Token[FUN_POS + 4] + " ' ", + o_tokens); + + if (!o_tokens->TOKENS_PREDEFINED) + { + if (CLASS_CONSTRICTOR_FUN_IS_SET[TheClass]) + ErrorCode("دالة بناء الصنف تم انشاؤها مسبقا في السطر : " + + CLASS_CONSTRICTOR_FUN_AT_LINE[TheClass], + o_tokens); + + CLASS_CONSTRICTOR_FUN_IS_SET[TheClass] = true; + MAIN_FUN_AT_LINE[TheClass] = IntToString(o_tokens->Line); + + IsInsideFunction = true; // Need by Tokens Predefined + TheFunction = "بناء"; // Need by Tokens Predefined + + return; // continue; + } + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 1]; + + TheFunction_TYPE = "عادم"; + RETURN_FUN[std::make_pair(TheClass, "بناء")] = "OK"; + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION-CONSTRICTOR] [" + Token[FUN_POS + 1] + + "] () \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> CONSTRICTOR-Func () + CPP_CLASS.append(" public: CLASS_" + Global_ID[TheClass] + " () { \n"); + // *** *** *** *** *** *** + + return; // continue; + } + else // دالة بناء Class (...) + { + if (Token[o_tokens->TOTAL[o_tokens->Line] - 1] != ")") + ErrorCode("يجب انهاء السطر بالإشارة ')' ", o_tokens); + + TempTokenCount = 0; + for (int p = (FUN_POS + 3); p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + if (!o_tokens->TOKENS_PREDEFINED) + { + if (CLASS_CONSTRICTOR_FUN_IS_SET[TheClass]) + ErrorCode("دالة بناء الصنف تم انشاؤها مسبقا في السطر : " + + CLASS_CONSTRICTOR_FUN_AT_LINE[TheClass], + o_tokens); + + CLASS_CONSTRICTOR_FUN_IS_SET[TheClass] = true; + MAIN_FUN_AT_LINE[TheClass] = IntToString(o_tokens->Line); + + IsInsideFunction = true; // Need by Tokens Predefined + TheFunction = "بناء"; // Need by Tokens Predefined + + // To Set ARG counter, and ARG as Local Var + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 1], o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION-CONSTRICTOR] [" + Token[FUN_POS + 1] + + "] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> CONSTRICTOR-Func (... + CPP_CLASS.append(" public: CLASS_" + Global_ID[TheClass] + " ( "); + // *** *** *** *** *** *** + + // To Get Log, and C++ Code + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 1], o_tokens); + + if (DEBUG) + DEBUG_MESSAGE(") \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> CONSTRICTOR-Func ...) + CPP_CLASS.append(ScriptSyntaxBuffer + " ) { \n"); + // *** *** *** *** *** *** + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 1]; + + TheFunction_TYPE = "عادم"; + RETURN_FUN[std::make_pair(TheClass, "بناء")] = "OK"; + + return; // continue; + } + } + } + else if (Token[FUN_POS + 1] == "عدد" || Token[FUN_POS + 1] == "نص" || + Token[FUN_POS + 1] == + "منطق") // Class دالة TYPE MyFunctionName (...) + { + if (Token[FUN_POS + 2] == "") + ErrorCode("يجب اعطاء اسم لهته الدالة الجديدة", o_tokens); + + if (Token[FUN_POS + 3] != "" && Token[FUN_POS + 3] != "(") + ErrorCode("أمر غير معروف : ' " + Token[FUN_POS + 3] + " ' ", o_tokens); + + if (Token[FUN_POS + 3] == "") // Class دالة TYPE MyFunctionName + { + if (Token[FUN_POS + 1] == "عدد") + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 2], "عدد", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [FUN_TYPE_INT] [" + + Token[FUN_POS + 2] + "] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private INT-Func + CPP_CLASS.append(" private: double ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + "() { \n"); + // *** *** *** *** *** *** + } + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 2], "عدد", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [FUN_TYPE_INT] [" + + Token[FUN_POS + 2] + "] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> INT-Func + CPP_CLASS.append(" public: double ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + "() { \n"); + // *** *** *** *** *** *** + } + } + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 2]; + TheFunction_TYPE = "عدد"; + return; // continue; + } + else if (Token[FUN_POS + 1] == "نص") + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 2], "نص", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [FUN_TYPE_STRING] [" + + Token[FUN_POS + 2] + "] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private STRING-Func + CPP_CLASS.append(" private: std::string ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + "() { \n"); + // *** *** *** *** *** *** + } + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 2], "نص", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [FUN_TYPE_STRING] [" + + Token[FUN_POS + 2] + "] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> STRING-Func + CPP_CLASS.append(" public: std::string ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + "() { \n"); + // *** *** *** *** *** *** + } + } + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 2]; + TheFunction_TYPE = "نص"; + return; // continue; + } + else if (Token[FUN_POS + 1] == "منطق") + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 2], "منطق", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [FUN_TYPE_BOOL] [" + + Token[FUN_POS + 2] + "] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private BOOL-Func + CPP_CLASS.append(" private: bool ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + "() { \n"); + // *** *** *** *** *** *** + } + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 2], "منطق", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [FUN_TYPE_BOOL] [" + + Token[FUN_POS + 2] + "] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> BOOL-Func + CPP_CLASS.append(" public: bool ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + "() { \n"); + // *** *** *** *** *** *** + } + } + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 2]; + TheFunction_TYPE = "منطق"; + return; // continue; + } + } + else if (Token[FUN_POS + 3] == + "(") // Class دالة TYPE MyFunctionName ( ??? + { + if (Token[FUN_POS + 4] == "") + ErrorCode("سطر غير كامل المرجو اضافة ')' ", o_tokens); + + if (Token[FUN_POS + 4] == ")") // Class دالة TYPE MyFunctionName () + { + if (Token[FUN_POS + 5] != "") + ErrorCode("أمر غير معروف : ' " + Token[FUN_POS + 5] + " ' ", + o_tokens); + + if (Token[FUN_POS + 1] == "عدد") + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 2], "عدد", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [FUN_TYPE_INT] [" + + Token[FUN_POS + 2] + "] () \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private INT-Func () + CPP_CLASS.append(" private: double ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " () { \n"); + // *** *** *** *** *** *** + } + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 2], "عدد", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [FUN_TYPE_INT] [" + + Token[FUN_POS + 2] + "] () \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> INT-Func () + CPP_CLASS.append(" public: double ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " () { \n"); + // *** *** *** *** *** *** + } + } + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 2]; + TheFunction_TYPE = "عدد"; + return; // continue; + } + else if (Token[FUN_POS + 1] == "نص") + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 2], "نص", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [FUN_TYPE_STRING] [" + + Token[FUN_POS + 2] + "] () \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private STRING-Func () + CPP_CLASS.append(" private: std::string ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " () { \n"); + // *** *** *** *** *** *** + } + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 2], "نص", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [FUN_TYPE_STRING] [" + + Token[FUN_POS + 2] + "] () \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> STRING-Func () + CPP_CLASS.append(" public: std::string ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " () { \n"); + // *** *** *** *** *** *** + } + } + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 2]; + TheFunction_TYPE = "نص"; + return; // continue; + } + else if (Token[FUN_POS + 1] == "منطق") + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 2], "منطق", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [FUN_TYPE_BOOL] [" + + Token[FUN_POS + 2] + "] () \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private BOOL-Func () + CPP_CLASS.append(" private: bool ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " () { \n"); + // *** *** *** *** *** *** + } + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 2], "منطق", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [FUN_TYPE_BOOL] [" + + Token[FUN_POS + 2] + "] () \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> BOOL-Func () + CPP_CLASS.append(" public: bool ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " () { \n"); + // *** *** *** *** *** *** + } + } + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 2]; + TheFunction_TYPE = "منطق"; + return; // continue; + } + } + else // Class دالة TYPE MyFunctionName (...) + { + if (Token[o_tokens->TOTAL[o_tokens->Line] - 1] != ")") + ErrorCode("يجب انهاء السطر بالإشارة ')' ", o_tokens); + + TempTokenCount = 0; + for (int p = (FUN_POS + 4); p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + if (Token[FUN_POS + 1] == "عدد") + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 2], "عدد", + o_tokens->Line, o_tokens); + + IsInsideFunction = true; // Need by Tokens Predefined + TheFunction = Token[FUN_POS + 2]; // Need by Tokens Predefined + + // To Set ARG counter, and ARG as Local Var + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 2], o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [FUN_TYPE_INT] [" + + Token[FUN_POS + 2] + "] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private INT-Func (... + CPP_CLASS.append(" private: double ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " ( "); + // *** *** *** *** *** *** + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 2], "عدد", + o_tokens->Line, o_tokens); + + IsInsideFunction = true; // Need by Tokens Predefined + TheFunction = Token[FUN_POS + 2]; // Need by Tokens Predefined + + // To Set ARG counter, and ARG as Local Var + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 2], o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [FUN_TYPE_INT] [" + + Token[FUN_POS + 2] + "] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Public INT-Func (... + CPP_CLASS.append(" public: double ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " ( "); + // *** *** *** *** *** *** + } + + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 2], o_tokens); + + if (DEBUG) + DEBUG_MESSAGE(") \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Pub/Priv INT-Func ...) + CPP_CLASS.append(ScriptSyntaxBuffer + " ) { \n"); + // *** *** *** *** *** *** + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 2]; + TheFunction_TYPE = "عدد"; + return; // continue; + } + else if (Token[FUN_POS + 1] == "نص") + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 2], "نص", + o_tokens->Line, o_tokens); + + IsInsideFunction = true; // Need by Tokens Predefined + TheFunction = Token[FUN_POS + 2]; // Need by Tokens Predefined + + // To Set ARG counter, and ARG as Local Var + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 2], o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [FUN_TYPE_STRING] [" + + Token[FUN_POS + 2] + "] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private STRING-Func (... + CPP_CLASS.append(" private: std::string ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " ( "); + // *** *** *** *** *** *** + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 2], "نص", + o_tokens->Line, o_tokens); + + IsInsideFunction = true; // Need by Tokens Predefined + TheFunction = Token[FUN_POS + 2]; // Need by Tokens Predefined + + // To Set ARG counter, and ARG as Local Var + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 2], o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [FUN_TYPE_STRING] [" + + Token[FUN_POS + 2] + "] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Public STRING-Func (... + CPP_CLASS.append(" public: std::string ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " ( "); + // *** *** *** *** *** *** + } + + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 2], o_tokens); + + if (DEBUG) + DEBUG_MESSAGE(") \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Pub/Priv INT-Func ...) + CPP_CLASS.append(ScriptSyntaxBuffer + " ) { \n"); + // *** *** *** *** *** *** + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 2]; + TheFunction_TYPE = "نص"; + return; // continue; + } + else if (Token[FUN_POS + 1] == "منطق") + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 2], "منطق", + o_tokens->Line, o_tokens); + + IsInsideFunction = true; // Need by Tokens Predefined + TheFunction = Token[FUN_POS + 2]; // Need by Tokens Predefined + + // To Set ARG counter, and ARG as Local Var + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 2], o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [FUN_TYPE_BOOL] [" + + Token[FUN_POS + 2] + "] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private BOOL-Func (... + CPP_CLASS.append(" private: bool ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " ( "); + // *** *** *** *** *** *** + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 2], "منطق", + o_tokens->Line, o_tokens); + + IsInsideFunction = true; // Need by Tokens Predefined + TheFunction = Token[FUN_POS + 2]; // Need by Tokens Predefined + + // To Set ARG counter, and ARG as Local Var + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 2], o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [FUN_TYPE_BOOL] [" + + Token[FUN_POS + 2] + "] (", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Public BOOL-Func (... + CPP_CLASS.append(" public: bool ClassFUNCTION_" + + ID[Token[FUN_POS + 2]] + " ( "); + // *** *** *** *** *** *** + } + + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 2], o_tokens); + + if (DEBUG) + DEBUG_MESSAGE(") \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Pub/Priv BOOL-Func ...) + CPP_CLASS.append(ScriptSyntaxBuffer + " ) { \n"); + // *** *** *** *** *** *** + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 2]; + TheFunction_TYPE = "منطق"; + return; // continue; + } + } + } + } + else // void : Class دالة MyFunctionName (???) // void + { + if (Token[FUN_POS + 2] != "" && Token[FUN_POS + 2] != "(") + ErrorCode("أمر غير معروف : ' " + Token[FUN_POS + 2] + " ' ", o_tokens); + + if (Token[FUN_POS + 2] == "") // دالة MyFunctionName + { + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 1], "عادم", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [" + Token[FUN_POS + 1] + + "] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private Func + CPP_CLASS.append(" private: void ClassFUNCTION_" + + ID[Token[FUN_POS + 1]] + "() { \n"); + // *** *** *** *** *** *** + } + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 1], "عادم", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [" + Token[FUN_POS + 1] + "] \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Func + CPP_CLASS.append(" public: void ClassFUNCTION_" + + ID[Token[FUN_POS + 1]] + "() { \n"); + // *** *** *** *** *** *** + } + } + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 1]; + TheFunction_TYPE = "عادم"; + return; // continue; + } + else if (Token[FUN_POS + 2] == "(") // Class دالة MyFunctionName ( ??? + { + if (Token[FUN_POS + 3] == ")") // Class دالة MyFunctionName () + { + if (Token[FUN_POS + 4] != "") + ErrorCode("أمر غير معروف : ' " + Token[FUN_POS + 4] + " ' ", + o_tokens); + + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 1], "عادم", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [" + + Token[FUN_POS + 1] + "] () \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private Func () + CPP_CLASS.append(" private: void ClassFUNCTION_" + + ID[Token[FUN_POS + 1]] + " () { \n"); + // *** *** *** *** *** *** + } + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 1], "عادم", + o_tokens->Line, o_tokens); + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [" + Token[FUN_POS + 1] + + "] () \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Func () + CPP_CLASS.append(" public: void ClassFUNCTION_" + + ID[Token[FUN_POS + 1]] + " () { \n"); + // *** *** *** *** *** *** + } + } + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 1]; + TheFunction_TYPE = "عادم"; + return; // continue; + } + else // Class دالة MyFunctionName (...) + { + if (Token[o_tokens->TOTAL[o_tokens->Line] - 1] != ")") + ErrorCode("يجب انهاء السطر بالإشارة ')' ", o_tokens); + + TempTokenCount = 0; + for (int p = (FUN_POS + 3); p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(true, TheClass, Token[FUN_POS + 1], "عادم", + o_tokens->Line, o_tokens); + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 1]; + + // To Set ARG counter, and ARG as Local Var + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 1], o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-FUNCTION] [" + Token[FUN_POS + 1] + + "] ( ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Private Func (... + CPP_CLASS.append(" private: void ClassFUNCTION_" + + ID[Token[FUN_POS + 1]] + " ( "); + // *** *** *** *** *** *** + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + ADD_FUN_CLASS(false, TheClass, Token[FUN_POS + 1], "عادم", + o_tokens->Line, o_tokens); + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 1]; + + // To Set ARG counter, and ARG as Local Var + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 1], o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-FUNCTION] [" + Token[FUN_POS + 1] + "] ( ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Public Func (... + CPP_CLASS.append(" public: void ClassFUNCTION_" + + ID[Token[FUN_POS + 1]] + " ( "); + // *** *** *** *** *** *** + } + + ScriptSyntaxBuffer = + CHECK_NEW_FUN_SYNTAX(false, TempToken, (TempTokenCount - 1), + TheClass, Token[FUN_POS + 1], o_tokens); + + if (DEBUG) + DEBUG_MESSAGE(") \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + // Class -> Pub/Priv Func ...) + CPP_CLASS.append(ScriptSyntaxBuffer + " ) { \n"); + // *** *** *** *** *** *** + + IsInsideFunction = true; + TheFunction = Token[FUN_POS + 1]; + TheFunction_TYPE = "عادم"; + return; // continue; + } + } + } } diff --git a/src/alif_if.hpp b/src/alif_if.hpp index d7ec1758..e7920c5b 100644 --- a/src/alif_if.hpp +++ b/src/alif_if.hpp @@ -21,6 +21,456 @@ . */ -void parser_IfOr(std::string Token[2048], CLASS_TOKEN *o_tokens){ - +void parser_IfOr(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // إذا - أو + + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (!IsInsideFunction) + ErrorCode("يجب استعمال الشرط داخل دالة", o_tokens); + + if (Token[1] == "أو" && Token[2] == "") + ErrorCode("شرط غير صحيح، هل تقصد ' وإلا ' ؟ ", o_tokens); + + if (Token[1] == "أو" && Token[2] != "إذا") + ErrorCode("شرط غير صحيح، هل تقصد ' أو إذا " + Token[2] + " ... ' ؟", + o_tokens); + + std::string PART[1024]; + int PART_TOTAL; + + PART[0] = "="; + PART_TOTAL = 0; + + int IF_PARENTISE_POSITION; + IF_PARENTISE_POSITION = 0; + + int Start; + + if (Token[1] == "أو") + { + Start = 3; + + if (ALIF_IF_STATUS < 1) + ErrorCode("لايمكن إستعمال ' أو ' من دون فتح شرط، ربمى تقصد ' إذا ' ", + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[ELSE IF " + IntToString(ALIF_IF_STATUS) + "] ( ", + o_tokens); // DEBUG + + if (IsInsideClass) + { + // just for fixing this ... + // *** Generate Code *** + CPP_CLASS.append("\n } \n else if ( "); + // *** *** *** *** *** *** + } + else if (!IsInsideNamespace) + { + // Global Fun IF + CPP_GLOBAL_FUN.append("\n } \n else if ( "); + } + else + { + // Local Fun IF + cpp_AddScript(TheFunction, "\n } \n else if ( "); + } + // *** *** *** *** *** *** + } + else + { + Start = 2; + + ALIF_IF_STATUS++; + + if (DEBUG) + DEBUG_MESSAGE("[IF " + IntToString(ALIF_IF_STATUS) + "] ( ", + o_tokens); // DEBUG + + if (IsInsideClass) + { + // just for fixing this ... + // *** Generate Code *** + CPP_CLASS.append(" if ( "); + // *** *** *** *** *** *** + } + else if (!IsInsideNamespace) + { + // Global Fun IF + CPP_GLOBAL_FUN.append(" if ( "); + } + else + { + // Local Fun IF + cpp_AddScript(TheFunction, " if ( "); + } + // *** *** *** *** *** *** + } + + std::string OBJECTIF_TYPE = "عادم"; + + // warning: suggest parentheses around comparison in operand of '&' + // [-Wparentheses] + // if (A != B && C != D && X != Z && G != P) + + bool PART_A; + bool PART_B; + + PART_A = false; + PART_B = false; + + std::string PART_A_OBJECTIF_TYPE; + PART_A_OBJECTIF_TYPE = ""; + + std::string IF_SYNTAX_BUFFER; + IF_SYNTAX_BUFFER = ""; + + for (int p = Start; p <= o_tokens->TOTAL[o_tokens->Line]; + p++) // Line loop after إذا /أوإذا + { + if (Token[p] != "") // Token + { + // Condition-part is ready for syntax checking + + if (Token[p] == ">" || Token[p] == "<" || Token[p] == "=" || + Token[p] == "و" || Token[p] == "!" || Token[p] == "أو") + { + // Check if this current condition-part is not empty + if ((PART_TOTAL < 1)) + { + ErrorCode("شرط غير كامل : ' " + GET_REAL_LINE_MID(0, p, o_tokens) + + " ' <-- ", + o_tokens); + } + + std::string CLASS_OR_WIN; + if (IsInsideClass) + CLASS_OR_WIN = TheClass; + else + CLASS_OR_WIN = TheNamespace; + + // Check this condition-part for syntaxt + IS_IF_SYNTAX = true; + IF_SYNTAX_BUFFER.append( + CheckForSyntax(OBJECTIF_TYPE, // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + false, // Accept Convertion from Int To String + PART, // SYNTAX[] std::string + (PART_TOTAL), // SYNTAX_LONG int + CLASS_OR_WIN, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens)); + + // IF X1 < X2 or X3 < X4 + if (!PART_A) + { + PART_A = true; + PART_B = false; + } + else if (!PART_B) + { + PART_A = true; + PART_B = true; + } + else + { + PART_A = true; + PART_B = false; + } + + // After checking the last part, + // now process the if operator + if (Token[p] == ">" && Token[p + 1] == "=") + { + // أكبر أو يساوي + + if (DEBUG) + DEBUG_MESSAGE("[أكبر أو يساوي] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" >= "); + // *** *** *** *** *** *** + + p++; + } + else if (Token[p] == ">") + { + // أكبر + + if (DEBUG) + DEBUG_MESSAGE("[أكبر] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" > "); + // *** *** *** *** *** *** + } + else if (Token[p] == "<" && Token[p + 1] == "=") + { + // أصغر أو يساوي + + if (DEBUG) + DEBUG_MESSAGE("[أصغر أو يساوي] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" <= "); + // *** *** *** *** *** *** + + p++; + } + else if (Token[p] == "<") + { + // أصغر + + if (DEBUG) + DEBUG_MESSAGE("[أصغر] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" < "); + // *** *** *** *** *** *** + } + else if ((Token[p] == "!" && Token[p + 1] == "=") || + (Token[p] == "=" && Token[p + 1] == "!")) + { + // يخالف + + if (DEBUG) + DEBUG_MESSAGE("[يخالف] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" != "); + // *** *** *** *** *** *** + + p++; + } + else if (Token[p] == "=") + { + // يساوي + + if (DEBUG) + DEBUG_MESSAGE("[يساوي] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" == "); + // *** *** *** *** *** *** + } + else if (Token[p] == "و") + { + // و + + if (DEBUG) + DEBUG_MESSAGE("[و] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" && "); + // *** *** *** *** *** *** + } + else if (Token[p] == "أو") + { + // أو + + if (DEBUG) + DEBUG_MESSAGE("[أو] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" || "); + // *** *** *** *** *** *** + } + else + { + ErrorCode("علة : نوع الشرط غير معروف ' " + Token[p] + " ' ", + o_tokens); + } + + // Clear + for (int c = 0; c <= PART_TOTAL; c++) + PART[c] = ""; + + PART[0] = "="; + PART_TOTAL = 0; + OBJECTIF_TYPE = "عادم"; + } + + // Condition-part is not ready for syntax chiking + // so, add tokens. + + else if (Token[p] == "(") // Open + { + IS_IF_SYNTAX = true; + + if (p > 0) + if (!CAN_ADD_PARENTHESIS_OPEN_HERE(Token[p - 1])) + ErrorCode("لا يمكن إضافة قوس مفتوح هنا ' " + Token[p - 1] + " " + + Token[p] + " ' ", + o_tokens); + + IF_PARENTISE_POSITION++; + + PART_TOTAL++; + PART[PART_TOTAL] = Token[p]; + } + else if (Token[p] == ")") // Close + { + IS_IF_SYNTAX = true; + + if (IF_PARENTISE_POSITION < 1) + ErrorCode("غلق قوس ليس مفتوحا ' " + Token[p] + " ' ", o_tokens); + + if (p > 0) + if (!CAN_ADD_PARENTHESIS_CLOSE_HERE(Token[p - 1])) + ErrorCode("لا يمكن إضافة غلق قوس هنا ' " + Token[p - 1] + " " + + Token[p] + " ' ", + o_tokens); + + IF_PARENTISE_POSITION--; + + PART_TOTAL++; + PART[PART_TOTAL] = Token[p]; + } + else + { + if (OBJECTIF_TYPE != "عدد" && OBJECTIF_TYPE != "نص" && + OBJECTIF_TYPE != "منطق") + { + if ((Token[p] != "+") && (Token[p] != "-") && (Token[p] != "*") && + (Token[p] != "\\")) + if (!IsValidVar(Token[p], o_tokens)) + ErrorCode("نوع المتغير غير معروف ' " + Token[p] + " ' ", + o_tokens); + + if (IsValidVar_Type == "عدد") + OBJECTIF_TYPE = "عدد"; + else if (IsValidVar_Type == "نص") + OBJECTIF_TYPE = "نص"; + else if (IsValidVar_Type == "منطق") + OBJECTIF_TYPE = "منطق"; + else + ErrorCode("لايمكن إستعمال هدا المتغير ' " + Token[p] + + " ' لأنه من نوع " + IsValidVar_Type, + o_tokens); + + // IF X1 < X2 or X3 < X4 + if (!PART_A) + { + // A + PART_A_OBJECTIF_TYPE = OBJECTIF_TYPE; + } + else if (!PART_B) + { + // B + if (PART_A_OBJECTIF_TYPE != OBJECTIF_TYPE) + ErrorCode("لايمكن مقارنة نوعين مختلفين : ' " + + GET_REAL_LINE_MID(0, p, o_tokens) + " ' <-- ", + o_tokens); + } + else + { + // A + PART_A_OBJECTIF_TYPE = OBJECTIF_TYPE; + } + } + + PART_TOTAL++; + PART[PART_TOTAL] = Token[p]; + } + } + } + + // Check if the last condition-part is not empty + if ((PART_TOTAL < 1)) + { + ErrorCode("شرط غير كامل في نهاية السطر : " + + GET_REAL_LINE_MID(0, 0, o_tokens) + " <-- ", + o_tokens); + } + + // Part status + if (!PART_A) + { + PART_A = true; + PART_B = false; + } + else if (!PART_B) + { + PART_A = true; + PART_B = true; + } + else + { + PART_A = true; + PART_B = false; + } + + // Check if Part A or B is empty + if (!PART_A || !PART_B) + { + ErrorCode("أحد أطراف الشرط غير موجود : " + + GET_REAL_LINE_MID(0, 0, o_tokens) + " <-- ", + o_tokens); + } + + std::string CLASS_OR_WIN; + if (IsInsideClass) + CLASS_OR_WIN = TheClass; + else + CLASS_OR_WIN = TheNamespace; + + // Check this condition-part for syntaxt + IS_IF_SYNTAX = true; + IF_SYNTAX_BUFFER.append( + CheckForSyntax(OBJECTIF_TYPE, // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + false, // Accept Convertion from Int To String + PART, // SYNTAX[] std::string + (PART_TOTAL), // SYNTAX_LONG int + CLASS_OR_WIN, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens)); + + // Parentise + if (IF_PARENTISE_POSITION < 0) + ErrorCode("هناك " + IntToString(IF_PARENTISE_POSITION) + + " أقواس مغلوقة من دون فتحها، المرجو إزالتها", + o_tokens); + else if (IF_PARENTISE_POSITION > 0) + ErrorCode("بقيت " + IntToString(IF_PARENTISE_POSITION) + + " أقواس مفتوحة، المرجو إغلاقها بالإشارة ' ) '", + o_tokens); + + if (IsInsideClass) + { + // just for fixing this ... + // *** Generate Code *** + CPP_CLASS.append(IF_SYNTAX_BUFFER + " ) { \n"); + // *** *** *** *** *** *** + } + else if (!IsInsideNamespace) + { + // Global Fun IF + CPP_GLOBAL_FUN.append(IF_SYNTAX_BUFFER + " ) { \n"); + } + else + { + // Local Fun IF + cpp_AddScript(TheFunction, IF_SYNTAX_BUFFER + " ) { \n"); + } + // *** *** *** *** *** *** + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; } diff --git a/src/alif_if_else.hpp b/src/alif_if_else.hpp index 4ec8eb1d..8e03cd97 100644 --- a/src/alif_if_else.hpp +++ b/src/alif_if_else.hpp @@ -21,6 +21,72 @@ . */ -void parser_IfElse(std::string Token[2048], CLASS_TOKEN *o_tokens){ - +void parser_IfElse(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // وإلا + + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (!IsInsideFunction) + ErrorCode("يجب استعمال الشرط داخل دالة", o_tokens); + + if (ALIF_IF_STATUS < 1) + ErrorCode("لايمكن إستعمال ' وإلا ' من دون فتح شرط، ربمى تقصد ' إذا ' ", + o_tokens); + + if (Token[2] == "إذا") + ErrorCode("شرط غير صحيح، هل تقصد ' أو إذا ' ؟ ", o_tokens); + + if (Token[2] != "") + ErrorCode( + "أمر غير معروف : ' " + Token[2] + + " '، على العموم إذا كنت تقصد شرط جديد المرجو إستعمال ' إذا ' ", + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[ELSE " + IntToString(ALIF_IF_STATUS) + "] \n\n", + o_tokens); // DEBUG + + // TODO: show error when double Else + // if ... + // else ... + // else ... + // end if + + /* + // *** Generate Code *** + if (!IsInsideNamespace) + { + // Global Fun IF + CPP_GLOBAL_FUN.append("\n } else { \n "); + } + else + { + // Local Fun IF + cpp_AddScript(TheFunction, "\n } else { \n "); + } + // *** *** *** *** *** *** + */ + + if (IsInsideClass) + { + // just for fixing this ... + // *** Generate Code *** + CPP_CLASS.append("\n } else { "); + // *** *** *** *** *** *** + } + else if (!IsInsideNamespace) + { + // Global Fun IF + CPP_GLOBAL_FUN.append("\n } else { "); + } + else + { + // Local Fun IF + cpp_AddScript(TheFunction, "\n } else { "); + } + // *** *** *** *** *** *** + + return; // continue; } diff --git a/src/alif_int.hpp b/src/alif_int.hpp new file mode 100644 index 00000000..f0d17982 --- /dev/null +++ b/src/alif_int.hpp @@ -0,0 +1,387 @@ +/* + The Alif Programming Language + Version 3.x Series + (C)2021 Hassan DRAGA + www.aliflang.org + + This file is part of Alif compiler. + + Alif compiler is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 3, or (at your option) any later + version. + + Alif compiler is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with Alif compiler; see the file COPYING3. If not see + . +*/ + +void parser_Int(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // عدد + + if (!o_tokens->TOKENS_PREDEFINED && IsInsideFunction) + // Ignore Local func var predefinition, + // focus only on Global var predefinition, and Class global var + // predefinition. + return; // continue; + + if (IsInsideNamespace && !IsInsideFunction) + ErrorCode("انشdddام، او داخل " + "دالة ليكون محلي", + o_tokens); + + if (Token[1] == "خاص" && !IsInsideClass) + ErrorCode("يجب استعمال خاصيه ' خاص ' داخل صنف", o_tokens); + + if (Token[1] == "خاص" && IsInsideFunction) + ErrorCode("يجب استعمال خاصيه ' خاص ' خارج الدالة", o_tokens); + + int INT_POS = 1; + + if (Token[1] == "خاص") + INT_POS = 2; + + if (Token[INT_POS + 1] == "") + ErrorCode("يجب تحديد اسم المتغير", o_tokens); + + if (Token[INT_POS + 2] != "" && Token[INT_POS + 2] != "=") + ErrorCode("يجب استعمال ' = ' بعد اسم المتغير", o_tokens); + + if (Token[INT_POS + 2] == "=" && Token[INT_POS + 3] == "") + ErrorCode("يجب اعطاء قيمة بعد ' = '", o_tokens); + + // Class + if (IsInsideClass) + { + if (!IsInsideFunction) + { + // global var int class + + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + SetNewVarClass(true, true, TheClass, TheFunction, Token[INT_POS + 1], + "عدد", false, false, o_tokens->Line, o_tokens); + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-GLOBAL-INT] [" + Token[INT_POS + 1] + + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class : New Private INT + CPP_CLASS.append(" private: double " + Global_ID[Token[INT_POS + 1]] + + " "); + if (Token[INT_POS + 2] == "") + { + CPP_CLASS.append(" = 0; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + SetNewVarClass(true, false, TheClass, TheFunction, Token[INT_POS + 1], + "عدد", false, false, o_tokens->Line, o_tokens); + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-GLOBAL-INT] [" + Token[INT_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class : New Public INT + CPP_CLASS.append(" public: double " + Global_ID[Token[INT_POS + 1]] + + " "); + if (Token[INT_POS + 2] == "") + { + CPP_CLASS.append(" = 0; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + } + else + { + // local int class + + if (Token[1] == "خاص") + { + ErrorCode("يجب استعمال خاصيه ' خاص ' خارج الدالة", o_tokens); + } + else + { + // if (!o_tokens->TOKENS_PREDEFINED) + //{ + SetNewVarClass(false, false, TheClass, TheFunction, Token[INT_POS + 1], + "عدد", false, false, o_tokens->Line, o_tokens); + // return; // continue; + //} + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-INT] [" + Token[INT_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class : New Local Class INT + CPP_CLASS.append(" double " + ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + CPP_CLASS.append(" = 0; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + } + } + // Global INT + else if (!IsInsideFunction) + { + // Ignore Local var predefinition, + // focus only on Global var predefinition + + if (!o_tokens->TOKENS_PREDEFINED) + { + SetNewVar(true, "", "", Token[INT_POS + 1], "عدد", false, false, + o_tokens->Line, o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-INT] [" + Token[INT_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Global Area + // INT a + CPP_GLOBAL.append(" double " + Global_ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + CPP_GLOBAL.append(" ; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + else + { + // Local INT + + // Ignore Local var predefinition, + // focus only on Global var predefinition + + SetNewVar(false, TheNamespace, TheFunction, Token[INT_POS + 1], "عدد", + false, false, o_tokens->Line, o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-INT] [" + Token[INT_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Local Area + // INT a + if (!IsInsideNamespace) + { + // Global Function + CPP_GLOBAL_FUN.append(" double " + ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + CPP_GLOBAL_FUN.append(" ; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + } + else + { + // Local Function + cpp_AddScript(TheFunction, " double " + ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + cpp_AddScript(TheFunction, " = 0; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + } + // *** *** *** *** *** *** + } + + if (Token[INT_POS + 2] == "=") + { + if (DEBUG) + DEBUG_MESSAGE("= ", o_tokens); // DEBUG + + if (!IsInsideFunction) + { + if (IsInsideClass) + { + // Class Global-Area + // *** Generate Code *** + CPP_CLASS.append(" = "); + // *** *** *** *** *** *** + } + else + { + // *** Generate Code *** + // Global Area + // INT a = + CPP_GLOBAL.append(" = "); + // *** *** *** *** *** *** + } + } + else + { + if (IsInsideClass) + { + // Local Function Class + // *** Generate Code *** + CPP_CLASS.append(" = "); + // *** *** *** *** *** *** + } + else + { + // *** Generate Code *** + // Local Area + // INT a = + if (!IsInsideNamespace) + // Global Function + CPP_GLOBAL_FUN.append(" = "); + else + // Local Function + cpp_AddScript(TheFunction, " = "); + // *** *** *** *** *** *** + } + } + + TempTokenCount = 0; + + for (int p = (INT_POS + 2); p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + if (substr_utf8(Token[p], 0, 1) == "_" && + !IsInsideFunction) // to avoid : a = b + _a + { + if (Token[INT_POS + 1] == + substr_utf8(Token[p], 1, CharCount_utf8(Token[p], o_tokens))) + ErrorCode("لا يمكن استعمال المتغير العام في نفس السطر الذي تم " + "الانشاء فيه '" + + Token[p] + "' ", + o_tokens); + } + else if (Token[INT_POS + 1] == Token[p] && + (Token[p - 1] != + ":")) // to avoid a = b + a, but ok for a = b + x:y:a + { + if (G_VAR_IS_SET[(Token[INT_POS + 1])] && + IntToString(o_tokens->Line) != + G_VAR_AT_LINE[(Token[INT_POS + 1])]) + ErrorCode( + "لا يمكن استعمال المتغير في نفس السطر الذي تم الانشاء فيه '" + + Token[p] + "', كذلك اذا كنت تود استعمال المتغير العام '" + + Token[INT_POS + 1] + + "', يجب اضافه خط قبل اسم المتغير على سبيل المثال : _" + + Token[INT_POS + 1], + o_tokens); + + ErrorCode( + "لا يمكن استعمال المتغير في نفس السطر الذي تم الانشاء فيه '" + + Token[p] + "' ", + o_tokens); + } + + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + std::string WIN_OR_CLASS; + if (IsInsideClass) + WIN_OR_CLASS = TheClass; + else + WIN_OR_CLASS = TheNamespace; + + // INT Syntax + ScriptSyntaxBuffer = + CheckForSyntax("عدد", // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from INT To Int + true, // Accept Convertion from Int To INT + TempToken, // SYNTAX[] INT + (TempTokenCount - 1), // SYNTAX_LONG int + WIN_OR_CLASS, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (IsInsideClass) + { + // just for fixing this ... + // *** Generate Code *** + CPP_CLASS.append(ScriptSyntaxBuffer + " ; \n "); + // *** *** *** *** *** *** + } + else if (!IsInsideFunction) + { + // *** Generate Code *** + // Global Area + // INT a = ... ; + CPP_GLOBAL.append(ScriptSyntaxBuffer + " ; \n "); + // *** *** *** *** *** *** + } + else + { + // *** Generate Code *** + // Local Area + // INT a = ... ; + if (!IsInsideNamespace) + // Global Function + CPP_GLOBAL_FUN.append(ScriptSyntaxBuffer + " ; \n "); + else + // Local Function + cpp_AddScript(TheFunction, ScriptSyntaxBuffer + " ; \n "); + // *** *** *** *** *** *** + } + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + else if (Token[INT_POS + 2] != "") + ErrorCode("أمر غير معروف '" + Token[INT_POS + 2] + "', ربما تقصد '=' ", + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG +} diff --git a/src/alif_loop.hpp b/src/alif_loop.hpp index 6f65f30b..8e036c9d 100644 --- a/src/alif_loop.hpp +++ b/src/alif_loop.hpp @@ -21,6 +21,389 @@ . */ -void parser_While(std::string Token[2048], CLASS_TOKEN *o_tokens){ - +void parser_While(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // كلما + + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (!IsInsideFunction) + ErrorCode("يجب استعمال كلما داخل دالة", o_tokens); + + std::string PART[1024]; + int PART_TOTAL; + + PART[0] = "="; + PART_TOTAL = 0; + + int IF_PARENTISE_POSITION; + IF_PARENTISE_POSITION = 0; + + int Start = 2; // from IF code source ! + + ALIF_LOOP_STATUS++; + + if (DEBUG) + DEBUG_MESSAGE("[LOOP " + IntToString(ALIF_LOOP_STATUS) + "] ( ", + o_tokens); // DEBUG + + /* + while(condition) + { + statement(s); + } + */ + + // *** Generate Code *** + if (!IsInsideNamespace) + { + // Global Fun Loop + CPP_GLOBAL_FUN.append(" while ( "); + } + else + { + // Local Fun Loop + cpp_AddScript(TheFunction, " while ( "); + } + // *** *** *** *** *** *** + + std::string OBJECTIF_TYPE = "عادم"; + + bool PART_A; + bool PART_B; + + PART_A = false; + PART_B = false; + + std::string PART_A_OBJECTIF_TYPE; + PART_A_OBJECTIF_TYPE = ""; + + std::string IF_SYNTAX_BUFFER; + IF_SYNTAX_BUFFER = ""; + + for (int p = Start; p <= o_tokens->TOTAL[o_tokens->Line]; + p++) // Line loop after كلما + { + if (Token[p] != "") // Token + { + // Condition-part is ready for syntax checking + + if (Token[p] == ">" || Token[p] == "<" || Token[p] == "=" || + Token[p] == "و" || Token[p] == "!" || Token[p] == "أو") + { + // Check if this current condition-part is not empty + if ((PART_TOTAL < 1)) + { + ErrorCode("جزء غير كامل : ' " + GET_REAL_LINE_MID(0, p, o_tokens) + + " ' <-- ", + o_tokens); + } + + // Check this condition-part for syntaxt + IS_IF_SYNTAX = true; + IF_SYNTAX_BUFFER.append( + CheckForSyntax(OBJECTIF_TYPE, // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + false, // Accept Convertion from Int To String + PART, // SYNTAX[] std::string + (PART_TOTAL), // SYNTAX_LONG int + TheNamespace, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens)); + + // IF X1 < X2 or X3 < X4 + if (!PART_A) + { + PART_A = true; + PART_B = false; + } + else if (!PART_B) + { + PART_A = true; + PART_B = true; + } + else + { + PART_A = true; + PART_B = false; + } + + // After checking the last part, + // now process the if operator + if (Token[p] == ">" && Token[p + 1] == "=") + { + // أكبر أو يساوي + + if (DEBUG) + DEBUG_MESSAGE("[أكبر أو يساوي] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" >= "); + // *** *** *** *** *** *** + + p++; + } + else if (Token[p] == ">") + { + // أكبر + + if (DEBUG) + DEBUG_MESSAGE("[أكبر] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" > "); + // *** *** *** *** *** *** + } + else if (Token[p] == "<" && Token[p + 1] == "=") + { + // أصغر أو يساوي + + if (DEBUG) + DEBUG_MESSAGE("[أصغر أو يساوي] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" <= "); + // *** *** *** *** *** *** + + p++; + } + else if (Token[p] == "<") + { + // أصغر + + if (DEBUG) + DEBUG_MESSAGE("[أصغر] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" < "); + // *** *** *** *** *** *** + } + else if ((Token[p] == "!" && Token[p + 1] == "=") || + (Token[p] == "=" && Token[p + 1] == "!")) + { + // يخالف + + if (DEBUG) + DEBUG_MESSAGE("[يخالف] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" != "); + // *** *** *** *** *** *** + + p++; + } + else if (Token[p] == "=") + { + // يساوي + + if (DEBUG) + DEBUG_MESSAGE("[يساوي] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" == "); + // *** *** *** *** *** *** + } + else if (Token[p] == "و") + { + // و + + if (DEBUG) + DEBUG_MESSAGE("[و] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" && "); + // *** *** *** *** *** *** + } + else if (Token[p] == "أو") + { + // او + + if (DEBUG) + DEBUG_MESSAGE("[او] ", o_tokens); // DEBUG + + // *** Generate Code *** + IF_SYNTAX_BUFFER.append(" || "); + // *** *** *** *** *** *** + } + else + { + ErrorCode("علة : نوع الجزء غير معروف ' " + Token[p] + " ' ", + o_tokens); + } + + // Clear + for (int c = 0; c <= PART_TOTAL; c++) + PART[c] = ""; + + PART[0] = "="; + PART_TOTAL = 0; + OBJECTIF_TYPE = "عادم"; + } + + // Condition-part is not ready for syntax chiking + // so, add tokens. + + else if (Token[p] == "(") // Open + { + IS_IF_SYNTAX = true; + + if (p > 0) + if (!CAN_ADD_PARENTHESIS_OPEN_HERE(Token[p - 1])) + ErrorCode("لا يمكن إضافة قوس مفتوح هنا ' " + Token[p - 1] + " " + + Token[p] + " ' ", + o_tokens); + + IF_PARENTISE_POSITION++; + + PART_TOTAL++; + PART[PART_TOTAL] = Token[p]; + } + else if (Token[p] == ")") // Close + { + IS_IF_SYNTAX = true; + + if (IF_PARENTISE_POSITION < 1) + ErrorCode("غلق قوس ليس مفتوحا ' " + Token[p] + " ' ", o_tokens); + + if (p > 0) + if (!CAN_ADD_PARENTHESIS_CLOSE_HERE(Token[p - 1])) + ErrorCode("لا يمكن إضافة غلق قوس هنا ' " + Token[p - 1] + " " + + Token[p] + " ' ", + o_tokens); + + IF_PARENTISE_POSITION--; + + PART_TOTAL++; + PART[PART_TOTAL] = Token[p]; + } + else + { + if (OBJECTIF_TYPE != "عدد" && OBJECTIF_TYPE != "نص") + { + if ((Token[p] != "+") && (Token[p] != "-") && (Token[p] != "*") && + (Token[p] != "\\")) + if (!IsValidVar(Token[p], o_tokens)) + ErrorCode("نوع المتغير غير معروف ' " + Token[p] + " ' ", + o_tokens); + + if (IsValidVar_Type == "عدد") + OBJECTIF_TYPE = "عدد"; + else if (IsValidVar_Type == "نص") + OBJECTIF_TYPE = "نص"; + else + ErrorCode("لايمكن إستعمال هدا المتغير ' " + Token[p] + + " ' لأنه من نوع " + IsValidVar_Type, + o_tokens); + + // IF X1 < X2 or X3 < X4 + if (!PART_A) + { + // A + PART_A_OBJECTIF_TYPE = OBJECTIF_TYPE; + } + else if (!PART_B) + { + // B + if (PART_A_OBJECTIF_TYPE != OBJECTIF_TYPE) + ErrorCode("لايمكن مقارنة نوعين مختلفين : ' " + + GET_REAL_LINE_MID(0, p, o_tokens) + " ' <-- ", + o_tokens); + } + else + { + // A + PART_A_OBJECTIF_TYPE = OBJECTIF_TYPE; + } + } + + PART_TOTAL++; + PART[PART_TOTAL] = Token[p]; + } + } + } + + // Check if the last condition-part is not empty + if ((PART_TOTAL < 1)) + { + ErrorCode("جزء غير كامل في نهاية السطر : " + + GET_REAL_LINE_MID(0, 0, o_tokens) + " <-- ", + o_tokens); + } + + // Part status + if (!PART_A) + { + PART_A = true; + PART_B = false; + } + else if (!PART_B) + { + PART_A = true; + PART_B = true; + } + else + { + PART_A = true; + PART_B = false; + } + + // Check if Part A or B is empty + if (!PART_A || !PART_B) + { + ErrorCode("أحد أطراف الجزء غير موجود : " + + GET_REAL_LINE_MID(0, 0, o_tokens) + " <-- ", + o_tokens); + } + + // Check this condition-part for syntaxt + IS_IF_SYNTAX = true; + IF_SYNTAX_BUFFER.append( + CheckForSyntax(OBJECTIF_TYPE, // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + false, // Accept Convertion from Int To String + PART, // SYNTAX[] std::string + (PART_TOTAL), // SYNTAX_LONG int + TheNamespace, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens)); + + // Parentise + if (IF_PARENTISE_POSITION < 0) + ErrorCode("هناك " + IntToString(IF_PARENTISE_POSITION) + + " أقواس مغلوقة من دون فتحها، المرجو إزالتها", + o_tokens); + else if (IF_PARENTISE_POSITION > 0) + ErrorCode("بقيت " + IntToString(IF_PARENTISE_POSITION) + + " أقواس مفتوحة، المرجو إغلاقها بالإشارة ' ) '", + o_tokens); + + // *** Generate Code *** + if (!IsInsideNamespace) + { + // Global Fun Loop + CPP_GLOBAL_FUN.append(IF_SYNTAX_BUFFER + " ) { \n"); + } + else + { + // Local Fun Loop + cpp_AddScript(TheFunction, IF_SYNTAX_BUFFER + " ) { \n"); + } + // *** *** *** *** *** *** + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; } diff --git a/src/alif_macro.hpp b/src/alif_macro.hpp index 3ccf578f..50f4469d 100644 --- a/src/alif_macro.hpp +++ b/src/alif_macro.hpp @@ -21,14 +21,16 @@ . */ -void check_macro_alif(CLASS_TOKEN *o_tokens){ +void check_macro_alif(CLASS_TOKEN *o_tokens) +{ if (!ALIF_FLAG_FILE[o_tokens->PATH_FULL_SOURCE]) ErrorCode("يجب الإعلان عن ماكرو ألف اولا، المرجو اضافة ' #ألف ' في الأعلى", o_tokens); } -void parser_macro_ui(std::string Token[2048], CLASS_TOKEN *o_tokens){ +void parser_macro_ui(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ if (Token[2] == "") ErrorCode("الماكرو غير محدد ' # '", o_tokens); diff --git a/src/alif_namespace.hpp b/src/alif_namespace.hpp index c0b1d8cd..09d19228 100644 --- a/src/alif_namespace.hpp +++ b/src/alif_namespace.hpp @@ -21,6 +21,65 @@ . */ -void parser_new_namespace(std::string Token[2048], CLASS_TOKEN *o_tokens){ +void parser_new_namespace(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // namespace abc + + if (IsInsideNamespace) + ErrorCode("لا يمكن انشاء مجال داخل مجال، المجال الحالية : " + TheNamespace, + o_tokens); + + if (IsInsideClass) + ErrorCode("لا يمكن انشاء مجال داخل صنف : " + TheClass, o_tokens); + + if (IsInsideFunction) + ErrorCode("لا يمكن انشاء مجال داخل دالة : " + TheFunction, o_tokens); + + if (Token[2] == "") + ErrorCode("يجب تحديد اسم المجال", o_tokens); + + if (Token[3] != "") + ErrorCode("أمر غير معروف : ' " + Token[3] + " ' ", o_tokens); + + // temporary set because this namespace + // did not get created yet, but we need + // his Generated ID now. + // TheNamespace = Token[2]; + + if (!IsValidName(Token[2], o_tokens)) + ErrorCode("اسم غير مقبول : ' " + Token[2] + " ' ", o_tokens); + + CheckForSameGlobalID(Token[2], o_tokens); + + if (!o_tokens->TOKENS_PREDEFINED) + { + + if (namespace_is_set[Token[2]]) + ErrorCode("المجال ' " + Token[2] + " ' تم انشاؤها مسبقا في السطر : " + + namespace_at_line[Token[2]], + o_tokens); + + namespace_is_set[Token[2]] = true; + namespace_at_line[Token[2]] = IntToString(o_tokens->Line); + SET_GLOBAL_C_NAME( + Token[2]); // TODO: is okay (SET_C_NAME -> SET_GLOBAL_C_NAME) ? + + IsInsideNamespace = true; // Need by Tokens Predefined + TheNamespace = Token[2]; // Need by Tokens Predefined + + // temporary end + // TheNamespace = ""; + + return; // continue; + } + + IsInsideNamespace = true; + TheNamespace = Token[2]; + + if (DEBUG) + DEBUG_MESSAGE("[NAMESPACE] [" + Token[2] + "] \n\n", o_tokens); // DEBUG + + // CPP_GLOBAL.append(" bool WINDOW_IS_SHOW_" + ID[Token[2]] + " = false; \n"); + CPP_GLOBAL_FUN.append(" namespace NS_" + ID[Token[2]] + " { \n"); } diff --git a/src/alif_next_break.hpp b/src/alif_next_break.hpp index 204d48de..f2df3f2f 100644 --- a/src/alif_next_break.hpp +++ b/src/alif_next_break.hpp @@ -21,6 +21,59 @@ . */ -void parser_NextBreak(std::string Token[2048], CLASS_TOKEN *o_tokens){ +void parser_NextBreak(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // التالي - كسر + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (!IsInsideFunction) + ErrorCode("يجب استعمال ' " + Token[1] + " ' داخل دالة", o_tokens); + + if (ALIF_LOOP_STATUS < 1) + ErrorCode("يجب استعمال ' " + Token[1] + " ' داخل جملة تكرارية \"كلما\" ", + o_tokens); + + if (Token[2] != "") + ErrorCode("أمر غير معروف : ' " + Token[2] + + " '، على العموم لايجب وضع أي شيئ بعد ' " + Token[1] + " ' ' ", + o_tokens); + + if (Token[1] == "التالي") + { + if (DEBUG) + DEBUG_MESSAGE("[Continue] \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + if (!IsInsideNamespace) + { + // Global Fun IF + CPP_GLOBAL_FUN.append("\n continue; \n "); + } + else + { + // Local Fun IF + cpp_AddScript(TheFunction, "\n continue; \n "); + } + // *** *** *** *** *** *** + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[Break] \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + if (!IsInsideNamespace) + { + // Global Fun IF + CPP_GLOBAL_FUN.append("\n break; \n "); + } + else + { + // Local Fun IF + cpp_AddScript(TheFunction, "\n break; \n "); + } + // *** *** *** *** *** *** + } } diff --git a/src/alif_obj.hpp b/src/alif_obj.hpp index f6831aa7..02c47a3b 100644 --- a/src/alif_obj.hpp +++ b/src/alif_obj.hpp @@ -21,6 +21,419 @@ . */ -void parser_Obj(std::string Token[2048], CLASS_TOKEN *o_tokens){ - +void parser_Obj(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // كائن + + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + // ك:م = 2 + + if (!IsInsideFunction) + ErrorCode("يجب استعمال الكائن داخل دالة ' " + Token[1] + " ' ", o_tokens); + + if (Token[2] != ":") + ErrorCode("يجب وضع نقطتين ':' بين الكائن و المنتمي، أي بعد ' " + Token[1] + + " ' ", + o_tokens); + + if (Token[3] == "بناء") + ErrorCode("لا يمكن استدعاء دالة ' بناء() '، هته الدالة تستدعى بشكل آلي عند " + "إنشاء الكائن", + o_tokens); + + if (Token[3] == "هدم") + ErrorCode("لا يمكن استدعاء دالة ' هدم() '، هته الدالة تستدعى بشكل آلي عند " + "الحاجة إلى تدمير هذا الكائن", + o_tokens); + + if (Token[3] == "") + ErrorCode("يجب وضع اسم المنتمي بعد ' " + Token[1] + ":' ", o_tokens); + + // C++, allow create Obj on global, global-class, local, but using it only on + // func. + std::string OBJ_ID; + bool IS_GLOBAL_OBJ = false; + std::string WIN_OR_CLASS; // Needed by CheckForSyntax() + + if (IsInsideClass) + { + if (OBJ_IS_SET[std::make_pair(TheClass + TheFunction, Token[1])]) + { + // Class -> Function. + // Local Class Obj. + + OBJ_ID = TheClass + TheFunction; + WIN_OR_CLASS = TheClass; + } + else if (OBJ_IS_SET[std::make_pair(TheClass, Token[1])]) + { + // Global Class. + + OBJ_ID = TheClass; + WIN_OR_CLASS = TheClass; + IS_GLOBAL_OBJ = true; + } + else if (OBJ_IS_SET[std::make_pair("", Token[1])]) + { + // Global Area Obj. + + OBJ_ID = ""; + WIN_OR_CLASS = ""; + IS_GLOBAL_OBJ = true; + } + else + ErrorCode("علة 1: انتماء الكائن غير معروف ' " + Token[1] + " ' ", + o_tokens); + } + else if (IsInsideNamespace) + { + if (OBJ_IS_SET[std::make_pair(TheNamespace + TheFunction, Token[1])]) + { + // Namespace -> Function. + // Local Obj. + + OBJ_ID = TheNamespace + TheFunction; + WIN_OR_CLASS = TheNamespace; + } + else if (OBJ_IS_SET[std::make_pair("", Token[1])]) + { + // Global Area Obj. + + OBJ_ID = ""; + WIN_OR_CLASS = ""; + IS_GLOBAL_OBJ = true; + } + else + ErrorCode("علة 2: انتماء الكائن غير معروف ' " + Token[1] + " ' ", + o_tokens); + } + else + { + if (OBJ_IS_SET[std::make_pair(TheFunction, Token[1])]) + { + // Global Function. + // Local Obj. + + OBJ_ID = TheFunction; + WIN_OR_CLASS = ""; + } + else if (OBJ_IS_SET[std::make_pair("", Token[1])]) + { + // Global Area Obj. + + OBJ_ID = ""; + WIN_OR_CLASS = ""; + IS_GLOBAL_OBJ = true; + } + else + ErrorCode("علة 3: انتماء الكائن غير معروف ' " + Token[1] + " ' ", + o_tokens); + } + + /* + if (OBJ_IS_SET[std::make_pair(TheNamespace + TheFunction, Token[1])]) + { + // Namespace -> Function. + // Local Obj. + OBJ_ID = TheNamespace + TheFunction; + WIN_OR_CLASS = TheNamespace; + if(DEBUG)DEBUG_MESSAGE("{{WF}}", o_tokens); // DEBUG + } + else if (OBJ_IS_SET[std::make_pair(TheClass + TheFunction, Token[1])]) + { + // Class -> Function. + // Local Class Obj. + OBJ_ID = TheClass + TheFunction; + WIN_OR_CLASS = TheClass; + if(DEBUG)DEBUG_MESSAGE("{{CF}}", o_tokens); // DEBUG + } + else if (OBJ_IS_SET[std::make_pair(TheClass, Token[1])]) + { + // Class. + // Global Class Obj. + OBJ_ID = TheClass; + WIN_OR_CLASS = TheClass; + if(DEBUG)DEBUG_MESSAGE("{{C}"+ TheClass + "}", o_tokens); // DEBUG + } + else + { + // Global Area. + // Global Obj. + OBJ_ID = ""; + WIN_OR_CLASS = ""; + IS_GLOBAL_OBJ = true; + } + */ + + std::string TK_CLASS = OBJ_CLASS[std::make_pair(OBJ_ID, Token[1])]; + + if (!CLASS_G_VAR_IS_SET[std::make_pair(TK_CLASS, Token[3])] && + !CLASS_FUN_IS_SET[std::make_pair(TK_CLASS, Token[3])]) + ErrorCode("الصنف ' " + TK_CLASS + " ' ليس فيه أي منتمي معرف باسم ' " + + Token[3] + " ' ", + o_tokens); + + std::string MEMBER_TYPE; + + if (CLASS_G_VAR_IS_SET[std::make_pair(TK_CLASS, Token[3])]) + { + // Var member + + if (CLASS_G_VAR_PRIVATE[std::make_pair(TK_CLASS, Token[3])]) + ErrorCode("لا يمكن استدعاء المتغير ' " + Token[3] + + " ' المنتمي للصنف ' " + TK_CLASS + + " ' لأنه من نوع ' خاص ' ", + o_tokens); + + if (Token[4] != "=") + ErrorCode("يجب وضع '=' بعد ' " + Token[1] + " : " + Token[3] + " ' ", + o_tokens); + + if (Token[5] == "") + ErrorCode("يجب وضع قيمة بعد '=' ", o_tokens); + + MEMBER_TYPE = CLASS_G_VAR_TYPE[std::make_pair(TK_CLASS, Token[3])]; + + if (MEMBER_TYPE == "عادم") + ErrorCode("لا يمكن إضافة منتمي عادم ' " + Token[1] + " : " + Token[3] + + " ' ", + o_tokens); + + TempTokenCount = 0; + for (int p = 4; p <= o_tokens->TOTAL[o_tokens->Line]; p++) // | = a + b | + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + if (IS_GLOBAL_OBJ) + { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + Token[1] + " ' : ' " + Token[3] + + " '] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Obj:Mem = ... + if (IsInsideClass) + { + CPP_CLASS.append(" " + GlobalObj_ID[Token[1]] + "." + + Global_ID[Token[3]] + " = "); + } + else if (!IsInsideNamespace) + { + // global func + CPP_GLOBAL_FUN.append(" " + GlobalObj_ID[Token[1]] + "." + + Global_ID[Token[3]] + " = "); + } + else + { + // local func + cpp_AddScript(TheFunction, " " + GlobalObj_ID[Token[1]] + "." + + Global_ID[Token[3]] + " = "); + } + // *** *** *** *** *** *** + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ ' " + Token[1] + " ' : ' " + Token[3] + + " '] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Obj:Mem = ... + if (IsInsideClass) + { + CPP_CLASS.append(" " + Obj_ID[Token[1]] + "." + Global_ID[Token[3]] + + " = "); + } + else if (!IsInsideNamespace) + { + // global func + // CPP_GLOBAL_FUN.append(" " + Obj_ID[Token[1]] + "." + + // Global_ID[Token[3]] + " = "); + ErrorCode("علة : كائن محلي داخل دالة عامة ' " + Token[1] + " : " + + Token[3] + " ' ", + o_tokens); + } + else + { + // local func + cpp_AddScript(TheFunction, " " + Obj_ID[Token[1]] + "." + + Global_ID[Token[3]] + " = "); + } + // *** *** *** *** *** *** + } + + ScriptSyntaxBuffer = + CheckForSyntax(MEMBER_TYPE, // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + true, // Accept Convertion from Int To String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG int + WIN_OR_CLASS, // TMP_WINDOW_NAME or CLASS_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + + // *** Generate Code *** + // Obj:Mem = ... ; + if (IsInsideClass) + { + CPP_CLASS.append(ScriptSyntaxBuffer + " ; \n"); + } + else if (!IsInsideNamespace) + { + // global func + CPP_GLOBAL_FUN.append(ScriptSyntaxBuffer + " ; \n"); + } + else + { + // local func + cpp_AddScript(TheFunction, ScriptSyntaxBuffer + " ; \n"); + } + // *** *** *** *** *** *** + + return; // continue; + } + else if (CLASS_FUN_IS_SET[std::make_pair(TK_CLASS, Token[3])]) + { + // Function member + + if (CLASS_FUN_PRIVATE[std::make_pair(TK_CLASS, Token[3])]) + ErrorCode("لا يمكن استدعاء الدالة ' " + Token[3] + + " ' المنتمية للصنف ' " + TK_CLASS + + " ' لأنها من نوع ' خاص ' ", + o_tokens); + + // if (CLASS_FUN_TYPE[std::make_pair(TK_CLASS, Token[3])] != "عادم") + // ErrorCode("الدالة ' " + Token[3] + " ' المنتمية للصنف ' " + TK_CLASS + " + // ' ليست من نوع 'عادم'، لذى لابد من استعمال متغير ليلتقط قيمة الإرجاع ", + // o_tokens); + + if (Token[4] != "(") + ErrorCode("يجب وضع '(' بعد ' " + Token[1] + " : " + Token[3] + " ' ", + o_tokens); + + if (Token[5] == "") + ErrorCode("يجب غلق القوس بعد ' " + Token[1] + " : " + Token[3] + " (' ", + o_tokens); + + if (Token[o_tokens->TOTAL[o_tokens->Line] - 1] != ")") + ErrorCode("يجب غلق القوس", o_tokens); + + MEMBER_TYPE = CLASS_FUN_TYPE[std::make_pair(TK_CLASS, Token[3])]; + + TempTokenCount = 0; + for (int p = 5; p <= o_tokens->TOTAL[o_tokens->Line]; + p++) // | a + b, c, 5) | + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + if (IS_GLOBAL_OBJ) + { + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-OBJ ' " + Token[1] + " ':'" + Token[3] + + " '(Func)( ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Obj:MemFunc ( ... + if (IsInsideClass) + { + CPP_CLASS.append(" " + GlobalObj_ID[Token[1]] + ".ClassFUNCTION_" + + ID[Token[3]] + "( "); + } + else if (!IsInsideNamespace) + { + // global func + CPP_GLOBAL_FUN.append(" " + GlobalObj_ID[Token[1]] + ".ClassFUNCTION_" + + ID[Token[3]] + "( "); + } + else + { + // local func + cpp_AddScript(TheFunction, " " + GlobalObj_ID[Token[1]] + + ".ClassFUNCTION_" + ID[Token[3]] + "( "); + } + // *** *** *** *** *** *** + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-OBJ2 ' " + Token[1] + " ':'" + Token[3] + + " '(Func)( ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Obj:MemFunc ( ... + if (IsInsideClass) + { + CPP_CLASS.append(" " + Obj_ID[Token[1]] + ".ClassFUNCTION_" + + ID[Token[3]] + "( "); + } + else if (!IsInsideNamespace) + { + // global func + // CPP_GLOBAL_FUN.append(); + ErrorCode("علة : كائن محلي داخل دالة عامة ' " + Token[1] + " : " + + Token[3] + " ' ", + o_tokens); + } + else + { + // local func + cpp_AddScript(TheFunction, " " + Obj_ID[Token[1]] + ".ClassFUNCTION_" + + ID[Token[3]] + "( "); + } + // *** *** *** *** *** *** + } + + ScriptSyntaxBuffer = CHECK_CALL_FUN_ARG( + false, TK_CLASS, Token[3], + 2, // 2 = fun member + WIN_OR_CLASS, TheFunction, TempToken, (TempTokenCount - 1), o_tokens); + + if (DEBUG) + DEBUG_MESSAGE(")] \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + // Obj:MemFunc ( ... ) ; + if (IsInsideClass) + { + CPP_CLASS.append(ScriptSyntaxBuffer + " ); \n"); + } + else if (!IsInsideNamespace) + { + // global func + CPP_GLOBAL_FUN.append(ScriptSyntaxBuffer + " ); \n"); + } + else + { + // local func + cpp_AddScript(TheFunction, ScriptSyntaxBuffer + " ); \n"); + } + // *** *** *** *** *** *** + + return; // continue; + } } diff --git a/src/alif_obj_new.hpp b/src/alif_obj_new.hpp index 1b82241d..ced4d52f 100644 --- a/src/alif_obj_new.hpp +++ b/src/alif_obj_new.hpp @@ -23,4 +23,381 @@ void parser_ObjNew(std::string Token[2048], CLASS_TOKEN *o_tokens){ + // كائن + // Normal: Obj v = foo() + // Short: foo v + + if (!o_tokens->TOKENS_PREDEFINED) + return; + + // --- Short code --------------------------------------------- + + if (CLASS_IS_SET[Token[1]]){ + + // foo v + + // --- Check for errors + if (Token[2] == "") + ErrorCode("يجب وضع إسم معرف الكائن بعد ' كائن '", o_tokens); + if (!IsValidName(Token[2], o_tokens)) + ErrorCode("اسم غير مقبول : ' " + Token[2] + " ' ", o_tokens); + if (Token[3] != "") + ErrorCode("أمر غير معروف ' " + Token[3] + " ' ", o_tokens); + + // --- reformat code + // from "foo v" to "obj v = foo()" + string cls = Token[1]; + Token[1] = "كائن"; + Token[3] = "="; + Token[4] = cls; + Token[5] = "("; + Token[6] = ")"; + Token[7] = ""; + o_tokens->TOTAL[o_tokens->Line] = 7; + } + + // --- Check for errors --------------------------------------- + + if (Token[2] == "") + ErrorCode("يجب وضع إسم معرف الكائن بعد ' كائن '", o_tokens); + if (!IsValidName(Token[2], o_tokens)) + ErrorCode("اسم غير مقبول : ' " + Token[2] + " ' ", o_tokens); + if (Token[3] != "=") + ErrorCode("يجب وضع إشارة '=' بعد ' كائن " + Token[2] + " ' ", o_tokens); + if (Token[4] == "") + ErrorCode("يجب وضع إسم الصنف بعد ' كائن " + Token[2] + " = '", o_tokens); + if (Token[5] == "(" && Token[6] == "") + ErrorCode("قوس مازال مفتوح، ربما تقصد ' () ' ", o_tokens); + if (Token[5] == "(") + { + if (Token[o_tokens->TOTAL[o_tokens->Line]] != ")" && + Token[o_tokens->TOTAL[o_tokens->Line]] != "") + ErrorCode("يجب انهاء السطر بالإشارة ')' '... " + + Token[o_tokens->TOTAL[o_tokens->Line]] + " ' ", + o_tokens); + } + if (!CLASS_IS_SET[Token[4]]) + ErrorCode("صنف غير معروف ' " + Token[4] + " ' ", o_tokens); + if (Token[2] == Token[4]) + ErrorCode("تشابه في الاسم بين الكائن و الصنف ' " + Token[2] + " ' ", + o_tokens); + + // --- Set current parent --------------------------------------- + + std::string CurrentParent = ""; + + if (IsInsideClass) + CurrentParent = TheClass; + else if (IsInsideNamespace) + CurrentParent = TheNamespace; + + // --- Initializing --------------------------------------------- + + std::string OBJ_ID; + + // --- Identify ------------------------------------------------- + + // --- Check ---------------------------------------------------- + + // --- ARGV ----------------------------------------------------- + + // --- Gen. Code ------------------------------------------------ + + // --- Add. Code ------------------------------------------------ + + // --- OLD STYLE ------------------------------------------------ + + // This code need to be cleaned.. + + if (IsInsideNamespace) + { + if (IsInsideFunction) + { + // Namespace -> Function. + // Local Obj. + + OBJ_ID = TheNamespace + TheFunction; + + if (!o_tokens->TOKENS_PREDEFINED) + { + + if (OBJ_IS_SET[std::make_pair(OBJ_ID, Token[2])]) + ErrorCode("الكائن ' " + Token[2] + " ' تم انشاؤه مسبقا في السطر : " + + OBJ_AT_LINE[std::make_pair(OBJ_ID, Token[2])], + o_tokens); + } + } + else + { + // Namespace. + // Error Obj. + ErrorCode("يجب إنشاء الكائن الجديد داخل دالة ", o_tokens); + } + } + else if (IsInsideClass) + { + if (IsInsideFunction) + { + // Class -> Function. + // Local Class Obj. + OBJ_ID = TheClass + TheFunction; + + if (!o_tokens->TOKENS_PREDEFINED) + { + + if (OBJ_IS_SET[std::make_pair(OBJ_ID, Token[2])]) + ErrorCode("الكائن ' " + Token[2] + " ' تم انشاؤه مسبقا في السطر : " + + OBJ_AT_LINE[std::make_pair(OBJ_ID, Token[2])], + o_tokens); + } + } + else + { + // Class. + // Global Class Obj. + + // if (o_tokens->TOKENS_PREDEFINED) + // This Global Obj has already Predefined. + + OBJ_ID = TheClass; + + if (!o_tokens->TOKENS_PREDEFINED) + { + + if (OBJ_IS_SET[std::make_pair(OBJ_ID, Token[2])]) + ErrorCode("الكائن ' " + Token[2] + " ' تم انشاؤه مسبقا في السطر : " + + OBJ_AT_LINE[std::make_pair(OBJ_ID, Token[2])], + o_tokens); + } + } + } + else + { + // Global Area. + // Global Obj. + + // if (o_tokens->TOKENS_PREDEFINED) + // This Global Obj has already Predefined. + + OBJ_ID = ""; + + if (!o_tokens->TOKENS_PREDEFINED) + { + + if (OBJ_IS_SET[std::make_pair(OBJ_ID, Token[2])]) + ErrorCode("الكائن العام ' " + Token[2] + + " ' تم انشاؤه مسبقا في السطر : " + + OBJ_AT_LINE[std::make_pair(OBJ_ID, Token[2])], + o_tokens); + + // if already any other type of global var exist + CheckForSameGlobalID(Token[2], o_tokens); + } + } + + // Add new Obj + // OBJ_IS_SET[std::make_pair(TheNamespace + TheFunction, Token[3])] = true; + // OBJ_AT_LINE[std::make_pair(TheNamespace + TheFunction, Token[3])] = + // IntToString(o_tokens->Line); OBJ_CLASS[std::make_pair(TheNamespace + + // TheFunction, Token[3])] = Token[2]; + + // if(DEBUG)DEBUG_MESSAGE("[NEW-OBJ] [CLASS ' " + Token[2] + " '] + // [Generated_ID ' " + Token[3] + " '] (", o_tokens); // DEBUG + // if(DEBUG)DEBUG_MESSAGE("[NEW-OBJ] [Generated_ID ' " + Token[2] + " '] = + // [CLASS ' " + Token[4] + " '] (", o_tokens); // DEBUG + + // NOTE: Dont add '(' now, + // bcs if no Arg then error: + // ... which is of non-class type. + + if (IsInsideNamespace) + { + // Namespace -> Function. + + if (DEBUG) + DEBUG_MESSAGE("[NEW-LOCAL-OBJ] [Generated_ID ' " + Token[2] + + " '] = [CLASS ' " + Token[4] + " '] (", + o_tokens); // DEBUG + + SET_OBJ_C_NAME(Token[2]); + OBJ_IS_SET[std::make_pair(OBJ_ID, Token[2])] = true; + OBJ_AT_LINE[std::make_pair(OBJ_ID, Token[2])] = IntToString(o_tokens->Line); + OBJ_CLASS[std::make_pair(OBJ_ID, Token[2])] = Token[4]; + + // *** Generate Code *** + cpp_AddScript(TheFunction, " CLASS_" + Global_ID[Token[4]] + " " + + Obj_ID[Token[2]] + " "); + // *** *** *** *** *** *** + } + else if (IsInsideClass) + { + if (IsInsideFunction) + { + // Class -> Function. + + if (DEBUG) + DEBUG_MESSAGE("[NEW-LOCAL-CLASS-OBJ] [Generated_ID ' " + Token[2] + + " '] = [CLASS ' " + Token[4] + " '] (", + o_tokens); // DEBUG + + SET_OBJ_C_NAME(Token[2]); + OBJ_IS_SET[std::make_pair(OBJ_ID, Token[2])] = true; + OBJ_AT_LINE[std::make_pair(OBJ_ID, Token[2])] = + IntToString(o_tokens->Line); + OBJ_CLASS[std::make_pair(OBJ_ID, Token[2])] = Token[4]; + + // *** Generate Code *** + CPP_CLASS.append(" CLASS_" + Global_ID[Token[4]] + " " + + Obj_ID[Token[2]] + " "); + // *** *** *** *** *** *** + } + else + { + // Global Class. + + if (!o_tokens->TOKENS_PREDEFINED) + { + SET_GLOBAL_OBJ_C_NAME(Token[2]); + OBJ_IS_SET[std::make_pair(OBJ_ID, Token[2])] = true; + OBJ_AT_LINE[std::make_pair(OBJ_ID, Token[2])] = + IntToString(o_tokens->Line); + OBJ_CLASS[std::make_pair(OBJ_ID, Token[2])] = Token[4]; + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[NEW-GLOBAL-CLASS-OBJ] [Generated_ID ' " + Token[2] + + " '] = [CLASS ' " + Token[4] + " '] (", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CLASS.append("public: CLASS_" + Global_ID[Token[4]] + " " + + GlobalObj_ID[Token[2]] + " "); + // *** *** *** *** *** *** + } + } + else + { + // Global Area. + + if (!o_tokens->TOKENS_PREDEFINED) + { + SET_GLOBAL_OBJ_C_NAME(Token[2]); + OBJ_IS_SET[std::make_pair("", Token[2])] = true; + OBJ_AT_LINE[std::make_pair("", Token[2])] = IntToString(o_tokens->Line); + OBJ_CLASS[std::make_pair("", Token[2])] = Token[4]; + + // *** Generate Code *** + // Add this Global Obj to the list. + // when closing this class, the list will be added at the buttom of class. + + // CPP_CLASS_GLOBAL_OBJ.append(" CLASS_" + Global_ID[Token[4]] + " " + + // GlobalObj_ID[Token[2]] + " "); + OBJ_GLOBAL_DECLARATION[Token[4]].append("\n CLASS_" + + Global_ID[Token[4]] + " " + + GlobalObj_ID[Token[2]] + " "); + // *** *** *** *** *** *** + + // Searching for ARGs of this global Obj. + + TempTokenCount = 0; + for (int p = 6; p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + ScriptSyntaxBuffer = CHECK_CALL_FUN_ARG( + false, + // Token[2], + Token[4], "بناء", + 1, // 1 = constructor + TheNamespace, TheFunction, TempToken, (TempTokenCount - 1), o_tokens); + + if (ScriptSyntaxBuffer == "") + { + // CPP_CLASS_GLOBAL_OBJ.append(" ; \n"); + OBJ_GLOBAL_DECLARATION[Token[4]].append(" ; \n"); + } + else + { + // CPP_CLASS_GLOBAL_OBJ.append(" ( " + ScriptSyntaxBuffer + " ); \n"); + OBJ_GLOBAL_DECLARATION[Token[4]].append(" ( " + ScriptSyntaxBuffer + + " ); \n"); + } + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[NEW-GLOBAL-OBJ] [Generated_ID ' " + Token[2] + + " '] = [CLASS ' " + Token[4] + " '] (", + o_tokens); // DEBUG + } + + TempTokenCount = 0; + // for (int p = 5; p <= o_tokens->TOTAL[o_tokens->Line]; p++) + for (int p = 6; p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + ScriptSyntaxBuffer = CHECK_CALL_FUN_ARG(false, + // Token[2], + Token[4], "بناء", + 1, // 1 = constructor + TheNamespace, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens); + + if (DEBUG) + DEBUG_MESSAGE(") \n\n", o_tokens); // DEBUG + + // To fix GCC Error "which is of non-class type" + // MyClass MyObj(); --> MyClass MyObj; + + bool IS_EMPTY_ARG = true; + if (ScriptSyntaxBuffer != "") + IS_EMPTY_ARG = false; + + // *** Generate Code *** + if (IsInsideClass) + { + // Class. + // Class -> Function. + if (IS_EMPTY_ARG) + { + CPP_CLASS.append(" ; \n"); + } + else + { + CPP_CLASS.append(" ( " + ScriptSyntaxBuffer + " ); \n"); + } + } + else if (IsInsideNamespace) + { + // Namespace -> Function. + if (IS_EMPTY_ARG) + { + cpp_AddScript(TheFunction, " ; \n"); + } + else + { + cpp_AddScript(TheFunction, " ( " + ScriptSyntaxBuffer + " ); \n"); + } + } + else + { + // Global Area. + // Already processed in OBJ_GLOBAL_DECLARATION[] + } + // *** *** *** *** *** *** + } diff --git a/src/alif_operator.hpp b/src/alif_operator.hpp index 32fde09c..c5c459e8 100644 --- a/src/alif_operator.hpp +++ b/src/alif_operator.hpp @@ -21,6 +21,140 @@ . */ -void parser_TwoPointOperator(std::string Token[2048], CLASS_TOKEN *o_tokens){ +void parser_TwoPointOperator(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // --------------------------------------------------------------------------------- + // : (Operator between members) + // --------------------------------------------------------------------------------- + + // namespace:local_func(a, b) | namespace:my_func(a, b) + // namespace:local_var | namespace:my_var + + // namespace_name : local_func ( ... ) + // 1 2 3 4 5 6 + + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (!IsInsideFunction) + ErrorCode("يجب استعمال المجال داخل دالة", o_tokens); + + if (namespace_is_set[Token[1]]) + { + // namespace:local_func(a, b) | win:my_func(a, b) + + if (Token[2] != ":") + ErrorCode("يجب اضافه ' : ' بعد ' " + Token[1] + " ' ", o_tokens); + + if (Token[3] == "") + ErrorCode("يجب اضافه عضو تابع ل ' " + Token[1] + " ' بعد ':' ", o_tokens); + + if (Token[4] == "") + ErrorCode("يجب اضافه ':' أو '()' أو '=' بعد ' " + Token[1] + " " + + Token[2] + " " + Token[3] + " ' ", + o_tokens); + + if (Token[4] != "(" && Token[4] != ":" && Token[4] != "=") + ErrorCode("أمر غير معروف ' " + Token[4] + + " ', يجب اضافه ':' أو '()' أو '=' ", + o_tokens); + + if (L_FUN_IS_SET[std::make_pair(Token[1], Token[3])] && Token[4] != "(") + ErrorCode("من اجل نداء الدالة ' " + Token[3] + + " ' يجب اضافه '()' بعد ' " + Token[1] + " " + Token[2] + + " " + Token[3] + " ' ", + o_tokens); + + if (Token[4] == "(") + { + // ----------------------- + // namespace:win-local_func() + // ----------------------- + + if (L_FUN_IS_SET[std::make_pair(Token[1], Token[3])]) + { + if (Token[o_tokens->TOTAL[o_tokens->Line] - 1] != ")") + ErrorCode("يجب انهاء السطر بالإشارة ')' ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[NS'" + Token[1] + " ':LOCAL_FUNC'" + Token[3] + + " ' ( ", + o_tokens); // DEBUG + + // // *** Generate Code *** + // if (!IsInsideNamespace) + // // Call other namespace local_func from global func + // CPP_GLOBAL_FUN.append(CG_WIN_MEMBER(Token[1], ID[Token[3]] + " + // (")); else + // // Call other namespace local_func from local func + // cpp_AddScript(TheFunction, CG_WIN_MEMBER(Token[1], ID[Token[3]] + // + " (")); + // // *** *** *** *** *** *** + + TempTokenCount = 0; + for (int p = 5; p <= o_tokens->TOTAL[o_tokens->Line]; + p++) // | a, b + 2, c) | + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + // Check local fun Args and Syntax : fun (a + c, 2 * (b - 1)) + ScriptSyntaxBuffer = CHECK_CALL_FUN_ARG( + false, Token[1], Token[3], 0, TheNamespace, TheFunction, TempToken, + (TempTokenCount - 1), o_tokens); + + if (DEBUG) + DEBUG_MESSAGE(")] \n\n", o_tokens); // DEBUG + + // // *** Generate Code *** + // if (!IsInsideNamespace) + // // Call other win-local_func from global func + // CPP_GLOBAL_FUN.append(ScriptSyntaxBuffer + " ); \n } \n"); + // else + // // Call other win-local_func from local func + // cpp_AddScript(TheFunction, ScriptSyntaxBuffer + " ); \n } \n"); + // // *** *** *** *** *** *** + + // *** Generate Code *** + ScriptBuffer = " NS_" + ID[Token[1]] + "::FUNCTION_" + ID[Token[3]] + + "(" + ScriptSyntaxBuffer + "); \n"; + + if (!IsInsideNamespace) + // Call other win-local_func from global func + CPP_GLOBAL_FUN.append(ScriptBuffer + " \n"); + else + // Call other win-local_func from local func + cpp_AddScript(TheFunction, ScriptBuffer + " \n"); + // *** *** *** *** *** *** + + return; // continue; + } + // --------------------------------------------------------------------------------- + else + ErrorCode("المجال ' " + Token[1] + + " ' لا تحتوي على دالة محليه بإسم ' " + Token[3] + " ' ", + o_tokens); + + // Exception! + return; // continue; + } + else + { + // Exception ! + ErrorCode("يجب اضافه ':' أو '()' أو '=' بعد ' " + Token[1] + " " + + Token[2] + " " + Token[3] + " ' ", + o_tokens); + } + } + else + { + // Exception ! + ErrorCode("أمر غير معروف ' " + Token[1] + " ', يجب أن تكون فقط مجال", + o_tokens); + } } diff --git a/src/alif_return.hpp b/src/alif_return.hpp index cc74cf1d..919b25b0 100644 --- a/src/alif_return.hpp +++ b/src/alif_return.hpp @@ -21,6 +21,261 @@ . */ -void parser_Return(std::string Token[2048], CLASS_TOKEN *o_tokens){ +void parser_Return(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // إرجاع + // func int () + // return 1 + 2 + // Note: Parsing Local var must be first, and global after. + + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (!IsInsideFunction) + ErrorCode("يجب استعمال ' إرجاع ' داخل دالة", o_tokens); + + if (TheFunction_TYPE == "عادم") + { + // ErrorCode("لا يمكن استعمال ' إرجاع ' في دالة من نوع عادم", o_tokens); + + if (Token[2] != "") + ErrorCode("لا يمكن إرجاع قيمة، لأن الدالة ' " + TheFunction + + " ' من نوع عادم، المرجو عدم كتابة أي شيئ بعد ' إرجاع '، أو " + "تغيير نوع الدالة", + o_tokens); + + if (IsInsideClass) + { + // void return in class func + + if (DEBUG) + DEBUG_MESSAGE("[VOID-RETURN-CLASS-FUN] \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CLASS.append("\n return; \n"); + // *** *** *** *** *** *** + + return; // continue; + } + else if (!IsInsideNamespace) + { + // void return in global func + + if (DEBUG) + DEBUG_MESSAGE("[VOID-RETURN-GLOBAL-FUN] \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_GLOBAL_FUN.append("\n return; \n"); + // *** *** *** *** *** *** + + return; // continue; + } + else + { + // void return in local func + + if (DEBUG) + DEBUG_MESSAGE("[VOID-RETURN-LOCAL-FUN] \n\n", o_tokens); // DEBUG + + // *** Generate Code *** + cpp_AddScript(TheFunction, "\n return; \n"); + // *** *** *** *** *** *** + + return; // continue; + } + } + else + { + // return int + // return std::string + // return bool + + if (Token[2] == "") + ErrorCode("يجب اضافه قيمة بعد ' إرجاع ' لأن الدالة ' " + TheFunction + + " ' من نوع " + TheFunction_TYPE, + o_tokens); + } + + // std::string FUN_TYPE; + + if (IsInsideClass) + { + // return in class func + + if (TheFunction_TYPE == "عدد") + { + if (DEBUG) + DEBUG_MESSAGE("[RETURN-CLASS-INT] ", o_tokens); // DEBUG + } + else if (TheFunction_TYPE == "نص") + { + if (DEBUG) + DEBUG_MESSAGE("[RETURN-CLASS-STRING] ", o_tokens); // DEBUG + } + else if (TheFunction_TYPE == "منطق") + { + if (DEBUG) + DEBUG_MESSAGE("[RETURN-CLASS-BOOL] ", o_tokens); // DEBUG + } + + // *** Generate Code *** + CPP_CLASS.append("\n return ( "); + // *** *** *** *** *** *** + + if (ALIF_IF_STATUS > 0 && + RETURN_FUN[std::make_pair(TheClass, TheFunction)] == "") + RETURN_FUN[std::make_pair(TheClass, TheFunction)] = "IF"; + else + RETURN_FUN[std::make_pair(TheClass, TheFunction)] = "OK"; + } + else if (!IsInsideNamespace) + { + // return in global func + + if (TheFunction_TYPE == "عدد") + { + if (DEBUG) + DEBUG_MESSAGE("[RETURN-GLOBAL-INT] ", o_tokens); // DEBUG + } + else if (TheFunction_TYPE == "نص") + { + if (DEBUG) + DEBUG_MESSAGE("[RETURN-GLOBAL-STRING] ", o_tokens); // DEBUG + } + else if (TheFunction_TYPE == "منطق") + { + if (DEBUG) + DEBUG_MESSAGE("[RETURN-GLOABL-BOOL] ", o_tokens); // DEBUG + } + + // *** Generate Code *** + // Global Func Return + CPP_GLOBAL_FUN.append("\n return ( "); + // *** *** *** *** *** *** + + if (ALIF_IF_STATUS > 0 && RETURN_FUN[std::make_pair("", TheFunction)] == "") + RETURN_FUN[std::make_pair("", TheFunction)] = "IF"; + else + RETURN_FUN[std::make_pair("", TheFunction)] = "OK"; + } + else + { + // return in local func + + if (TheFunction_TYPE == "عدد") + { + if (DEBUG) + DEBUG_MESSAGE("[RETURN-INT] ", o_tokens); // DEBUG + } + else if (TheFunction_TYPE == "نص") + { + if (DEBUG) + DEBUG_MESSAGE("[RETURN-STRING] ", o_tokens); // DEBUG + } + else if (TheFunction_TYPE == "منطق") + { + if (DEBUG) + DEBUG_MESSAGE("[RETURN-BOOL] ", o_tokens); // DEBUG + } + + // *** Generate Code *** + // Local Func Return + cpp_AddScript(TheFunction, "\n return ( "); + // *** *** *** *** *** *** + + if (ALIF_IF_STATUS > 0 && + RETURN_FUN[std::make_pair(TheNamespace, TheFunction)] == "") + RETURN_FUN[std::make_pair(TheNamespace, TheFunction)] = "IF"; + else + RETURN_FUN[std::make_pair(TheNamespace, TheFunction)] = "OK"; + } + + if (Token[2] == "صحيح") + { + // Return Syntax + // return true. + + ScriptSyntaxBuffer = " true "; + if (DEBUG) + DEBUG_MESSAGE("[true] ", o_tokens); // DEBUG + } + else if (Token[2] == "خطأ") + { + // Return Syntax + // return false. + + ScriptSyntaxBuffer = " false "; + if (DEBUG) + DEBUG_MESSAGE("[false] ", o_tokens); // DEBUG + } + else + { + + // Return Syntax + // return a + 1 + a * (_g - 3) ... + + TempToken[0] = "="; + TempTokenCount = 1; + + for (int p = 2; p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + std::string WIN_OR_CLASS; + if (IsInsideClass) + WIN_OR_CLASS = TheClass; + else + WIN_OR_CLASS = TheNamespace; + + ScriptSyntaxBuffer = + CheckForSyntax(TheFunction_TYPE, // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + true, // Accept Convertion from Int To String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG int + WIN_OR_CLASS, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + } + + // return + // if (condition) + // return + // else + // return + + // *** Generate Code *** + if (IsInsideClass) + { + // Class Func return + CPP_CLASS.append(ScriptSyntaxBuffer + " ); \n"); + } + else if (!IsInsideNamespace) + { + // Global Func Return + CPP_GLOBAL_FUN.append(ScriptSyntaxBuffer + " ); \n"); + } + else + { + // Local Func Return + cpp_AddScript(TheFunction, ScriptSyntaxBuffer + " ); \n"); + } + // *** *** *** *** *** *** + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + + return; // continue; } diff --git a/src/alif_string.hpp b/src/alif_string.hpp new file mode 100644 index 00000000..f285e6b9 --- /dev/null +++ b/src/alif_string.hpp @@ -0,0 +1,390 @@ +/* + The Alif Programming Language + Version 3.x Series + (C)2021 Hassan DRAGA + www.aliflang.org + + This file is part of Alif compiler. + + Alif compiler is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 3, or (at your option) any later + version. + + Alif compiler is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with Alif compiler; see the file COPYING3. If not see + . +*/ + +void parser_String(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + + // نص + + if (!o_tokens->TOKENS_PREDEFINED && IsInsideFunction) + // Ignore Local func var predefinition, + // focus only on Global var predefinition, and Class global var + // predefinition. + return; // continue; + + if (IsInsideNamespace && !IsInsideFunction) + ErrorCode("انشاء متغير جديد يجب ان يكون خارج المجال ليكون عام، او داخل " + "دالة ليكون محلي", + o_tokens); + + if (Token[1] == "خاص" && !IsInsideClass) + ErrorCode("يجب استعمال خاصيه ' خاص ' داخل صنف", o_tokens); + + if (Token[1] == "خاص" && IsInsideFunction) + ErrorCode("يجب استعمال خاصيه ' خاص ' خارج الدالة", o_tokens); + + int INT_POS = 1; + + if (Token[1] == "خاص") + INT_POS = 2; + + if (Token[INT_POS + 1] == "") + ErrorCode("يجب تحديد اسم المتغير", o_tokens); + + if (Token[INT_POS + 2] != "" && Token[INT_POS + 2] != "=") + ErrorCode("يجب استعمال ' = ' بعد اسم المتغير", o_tokens); + + if (Token[INT_POS + 2] == "=" && Token[INT_POS + 3] == "") + ErrorCode("يجب اعطاء قيمة بعد ' = '", o_tokens); + + // Class + if (IsInsideClass) + { + if (!IsInsideFunction) + { + // global var int class + + if (Token[1] == "خاص") + { + if (!o_tokens->TOKENS_PREDEFINED) + { + SetNewVarClass(true, true, TheClass, TheFunction, Token[INT_POS + 1], + "نص", false, false, o_tokens->Line, o_tokens); + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[PRIVATE] [CLASS-GLOBAL-STRING] [" + + Token[INT_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class : New Private STRING + CPP_CLASS.append(" private: std::string " + + Global_ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + CPP_CLASS.append(" = \"\"; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + else + { + if (!o_tokens->TOKENS_PREDEFINED) + { + SetNewVarClass(true, false, TheClass, TheFunction, Token[INT_POS + 1], + "نص", false, false, o_tokens->Line, o_tokens); + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-GLOBAL-STRING] [" + Token[INT_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class : New Public STRING + CPP_CLASS.append(" public: std::string " + + Global_ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + CPP_CLASS.append(" = \"\"; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + } + else + { + // local int class + + if (Token[1] == "خاص") + { + ErrorCode("يجب استعمال خاصيه ' خاص ' خارج الدالة", o_tokens); + } + else + { + // if (!o_tokens->TOKENS_PREDEFINED) + //{ + SetNewVarClass(false, false, TheClass, TheFunction, Token[INT_POS + 1], + "نص", false, false, o_tokens->Line, o_tokens); + // return; // continue; + //} + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-STRING] [" + Token[INT_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Class : New Local Class STRING + CPP_CLASS.append(" std::string " + ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + CPP_CLASS.append(" = \"\"; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + } + } + // Global String + else if (!IsInsideFunction) + { + // Ignore Local var predefinition, + // focus only on Global var predefinition + + if (!o_tokens->TOKENS_PREDEFINED) + { + SetNewVar(true, "", "", Token[INT_POS + 1], "نص", false, false, + o_tokens->Line, o_tokens); + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-STRING] [" + Token[INT_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Global Area + // String a + CPP_GLOBAL.append(" std::string " + Global_ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + CPP_GLOBAL.append(" ; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + // *** *** *** *** *** *** + } + else + { + // Local String + + // Ignore Local var predefinition, + // focus only on Global var predefinition + + SetNewVar(false, TheNamespace, TheFunction, Token[INT_POS + 1], "نص", false, + false, o_tokens->Line, o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-STRING] [" + Token[INT_POS + 1] + "] ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Local Area + // STRING a + if (!IsInsideNamespace) + { + // Global Function + CPP_GLOBAL_FUN.append(" std::string " + ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + CPP_GLOBAL_FUN.append(" ; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + } + else + { + // Local Function + cpp_AddScript(TheFunction, + " std::string " + ID[Token[INT_POS + 1]] + " "); + if (Token[INT_POS + 2] == "") + { + cpp_AddScript(TheFunction, " = \"\"; \n"); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + } + // *** *** *** *** *** *** + } + + if (Token[INT_POS + 2] == "=") + { + if (DEBUG) + DEBUG_MESSAGE("= ", o_tokens); // DEBUG + + if (!IsInsideFunction) + { + if (IsInsideClass) + { + // Class Global-Area + // *** Generate Code *** + CPP_CLASS.append(" = "); + // *** *** *** *** *** *** + } + else + { + // *** Generate Code *** + // Global Area + // STRING a = + CPP_GLOBAL.append(" = "); + // *** *** *** *** *** *** + } + } + else + { + if (IsInsideClass) + { + // Local Function Class + // *** Generate Code *** + CPP_CLASS.append(" = "); + // *** *** *** *** *** *** + } + else + { + // *** Generate Code *** + // Local Area + // STRING a = + if (!IsInsideNamespace) + // Global Function + CPP_GLOBAL_FUN.append(" = "); + else + // Local Function + cpp_AddScript(TheFunction, " = "); + // *** *** *** *** *** *** + } + } + + TempTokenCount = 0; + + for (int p = (INT_POS + 2); p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + if (substr_utf8(Token[p], 0, 1) == "_" && + !IsInsideFunction) // to avoid : a = b + _a + { + if (Token[INT_POS + 1] == + substr_utf8(Token[p], 1, CharCount_utf8(Token[p], o_tokens))) + ErrorCode("لا يمكن استعمال المتغير العام في نفس السطر الذي تم " + "الانشاء فيه '" + + Token[p] + "' ", + o_tokens); + } + else if (Token[INT_POS + 1] == Token[p] && + (Token[p - 1] != + ":")) // to avoid a = b + a, but ok for a = b + x:y:a + { + if (G_VAR_IS_SET[(Token[INT_POS + 1])] && + IntToString(o_tokens->Line) != + G_VAR_AT_LINE[(Token[INT_POS + 1])]) + ErrorCode( + "لا يمكن استعمال المتغير في نفس السطر الذي تم الانشاء فيه '" + + Token[p] + "', كذلك اذا كنت تود استعمال المتغير العام '" + + Token[INT_POS + 1] + + "', يجب اضافه خط قبل اسم المتغير على سبيل المثال : _" + + Token[INT_POS + 1], + o_tokens); + + ErrorCode( + "لا يمكن استعمال المتغير في نفس السطر الذي تم الانشاء فيه '" + + Token[p] + "' ", + o_tokens); + } + + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + std::string WIN_OR_CLASS; + if (IsInsideClass) + WIN_OR_CLASS = TheClass; + else + WIN_OR_CLASS = TheNamespace; + + // STRING Syntax + ScriptSyntaxBuffer = + CheckForSyntax("نص", // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + true, // Accept Convertion from Int To String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG int + WIN_OR_CLASS, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (IsInsideClass) + { + // just for fixing this ... + // *** Generate Code *** + CPP_CLASS.append(ScriptSyntaxBuffer + " ; \n "); + // *** *** *** *** *** *** + } + else if (!IsInsideFunction) + { + // *** Generate Code *** + // Global Area + // STRING a = ... ; + CPP_GLOBAL.append(ScriptSyntaxBuffer + + " ; \n "); // TODO: did we need 'CPP_CLASS' ?????? + // *** *** *** *** *** *** + } + else + { + // *** Generate Code *** + // Local Area + // STRING a = ... ; + if (!IsInsideNamespace) + // Global Function + CPP_GLOBAL_FUN.append(ScriptSyntaxBuffer + " ; \n "); + else + // Local Function + cpp_AddScript(TheFunction, ScriptSyntaxBuffer + " ; \n "); + // *** *** *** *** *** *** + } + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + return; // continue; + } + else if (Token[INT_POS + 2] != "") + ErrorCode("أمر غير معروف '" + Token[INT_POS + 2] + "', ربما تقصد '=' ", + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG +} diff --git a/src/alif_var.hpp b/src/alif_var.hpp index c143958f..d1c67085 100644 --- a/src/alif_var.hpp +++ b/src/alif_var.hpp @@ -20,9 +20,189 @@ along with Alif compiler; see the file COPYING3. If not see . */ - #include // vector +// ---------------------------------- + +void parser_Var(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + + // Local var + // a = 1 + 2 + + // Note: Parsing Local var must be first, and global after. + + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (!IsInsideFunction) + ErrorCode("يجب استعمال المتغير داخل دالة ' " + Token[1] + " ' ", o_tokens); + + if (Token[2] == ":") + ErrorCode("ليس كائن ' " + Token[1] + " ' ", o_tokens); + + if (Token[2] != "=") + ErrorCode("يجب اضافة ' = ' بعد اسم المتغير", o_tokens); + + if (Token[3] == "") + ErrorCode("يجب اضافه قيمة بعد ' = ' ", o_tokens); + + std::string CLASS_OR_WIN; + if (IsInsideClass) + CLASS_OR_WIN = TheClass; + else + CLASS_OR_WIN = TheNamespace; + + if (L_VAR_TYPE[std::make_pair(CLASS_OR_WIN + TheFunction, Token[1])] == + "عدد") + { + // if (L_VAR_IS_CONST[std::make_pair(CLASS_OR_WIN + TheFunction, Token[1])] + // == "ثابت") ErrorCode("لا يمكن تغيير قيمة المتغير ' " + Token[1] + " ' لأنه + // من نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-INT (" + Token[1] + ")] = ", o_tokens); // DEBUG + + // *** Generate Code *** + // Local INT = ... + if (IsInsideClass) + { + CPP_CLASS.append(" " + ID[Token[1]] + " = "); + } + else if (!IsInsideNamespace) + { + // global func + CPP_GLOBAL_FUN.append(" " + ID[Token[1]] + " = "); + } + else + { + // local func + cpp_AddScript(TheFunction, " " + ID[Token[1]] + " = "); + } + // *** *** *** *** *** *** + } + else if (L_VAR_TYPE[std::make_pair(CLASS_OR_WIN + TheFunction, Token[1])] == + "نص") + { + // if (L_VAR_IS_CONST[std::make_pair(CLASS_OR_WIN + TheFunction, Token[1])] + // == "ثابت") ErrorCode("لا يمكن تغيير قيمة المتغير ' " + Token[1] + " ' لأنه + // من نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-STRING (" + Token[1] + ")] = ", o_tokens); // DEBUG + + // *** Generate Code *** + // Local STRING = ... + if (IsInsideClass) + { + CPP_CLASS.append(" " + ID[Token[1]] + " = "); + } + else if (!IsInsideNamespace) + { + // global func + CPP_GLOBAL_FUN.append(" " + ID[Token[1]] + " = "); + } + else + { + // local func + cpp_AddScript(TheFunction, " " + ID[Token[1]] + " = "); + } + // *** *** *** *** *** *** + } + else if (L_VAR_TYPE[std::make_pair(CLASS_OR_WIN + TheFunction, Token[1])] == + "منطق") + { + // if (L_VAR_IS_CONST[std::make_pair(CLASS_OR_WIN + TheFunction, Token[1])] + // == "ثابت") ErrorCode("لا يمكن تغيير قيمة المتغير ' " + Token[1] + " ' لأنه + // من نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[LOCAL-BOOL (" + Token[1] + ")] = ", o_tokens); // DEBUG + + // *** Generate Code *** + // Local BOOL = ... + if (IsInsideClass) + { + CPP_CLASS.append(" " + ID[Token[1]] + " = "); + } + else if (!IsInsideNamespace) + { + CPP_GLOBAL_FUN.append(" " + ID[Token[1]] + " = "); + } + else + { + cpp_AddScript(TheFunction, " " + ID[Token[1]] + " = "); + } + // *** *** *** *** *** *** + } + + /* + if (!IsInsideNamespace && IsInsideFunction) + { + // *** Generate Code *** + // Global Function + CPP_GLOBAL_FUN.append(" " + ID[Token[1]] + " = "); + // *** *** *** *** *** *** + } + else if (IsInsideNamespace && IsInsideFunction) + { + // *** Generate Code *** + // Local Function + cpp_AddScript(TheFunction, " " + ID[Token[1]] + " = "); + // *** *** *** *** *** *** + } + */ + + TempTokenCount = 0; + + for (int p = 2; p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + // Local var Syntax + // a = 1 + a * (_g - 3) ... + + ScriptSyntaxBuffer = + CheckForSyntax(L_VAR_TYPE[std::make_pair(CLASS_OR_WIN + TheFunction, + Token[1])], // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + true, // Accept Convertion from Int To String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG int + CLASS_OR_WIN, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG -void parser_Var(std::string Token[2048], CLASS_TOKEN *o_tokens){ + // *** Generate Code *** + // Local A = ... + if (IsInsideClass) + { + CPP_CLASS.append(ScriptSyntaxBuffer + " ; \n"); + } + else if (!IsInsideNamespace) + { + // from global func + CPP_GLOBAL_FUN.append(ScriptSyntaxBuffer + " ; \n"); + } + else + { + // from local func + cpp_AddScript(TheFunction, ScriptSyntaxBuffer + " ; \n"); + } + // *** *** *** *** *** *** + return; // continue; } diff --git a/src/alif_var_g.hpp b/src/alif_var_g.hpp index 7b3a825d..98fb7d5a 100644 --- a/src/alif_var_g.hpp +++ b/src/alif_var_g.hpp @@ -21,6 +21,216 @@ . */ -void parser_VarGlobal(std::string Token[2048], CLASS_TOKEN *o_tokens){ +void parser_VarGlobal(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + // Global var + // _g1 = 1 + 2 + // g1 = 1 + 2 + + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (!IsInsideFunction) + ErrorCode("يجب استعمال المتغير العام داخل دالة ' " + Token[1] + " ' ", + o_tokens); + + // if (IsInsideNamespace && !IsInsideFunction) // C++ cant do this ! + // ErrorCode("Using vars must set outside window for global, or inside + // function for local.", o_tokens); + + std::string G_VAR_WITHOUT_; + + if (substr_utf8(Token[1], 0, 1) == "_") + G_VAR_WITHOUT_ = + substr_utf8(Token[1], 1, CharCount_utf8(Token[1], o_tokens)); + else + G_VAR_WITHOUT_ = Token[1]; + + if (!G_VAR_IS_SET[(G_VAR_WITHOUT_)]) + ErrorCode("ليس متغير عام ' " + Token[1] + " ' ", o_tokens); + + if (Token[2] != "=") + ErrorCode("يجب اضافة ' = ' بعد اسم المتغير", o_tokens); + + if (Token[3] == "") + ErrorCode("يجب اضافه قيمة بعد ' = ' ", o_tokens); + + // if (!IsInsideFunction) + // ErrorCode("Your are in global area, so you dont need to use '_' for the + // global var : " + Token[1], o_tokens); + + if (IsInsideFunction) + { + // if (substr_utf8(Token[1], 0, 1) != "_") + // ErrorCode("متغير محلي غير موجود, من اجل استعمال المتغير العام ' " + + // Token[1] + " ' يجب اضافه خط قبل اسم المتغير على سبيل المثال : _" + + // Token[1], o_tokens); + + if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "عدد") + { + // if (G_VAR_IS_CONST[(G_VAR_WITHOUT_)] == "ثابت") + // ErrorCode("لا يمكن تغيير قيمة المتغير ' " + G_VAR_WITHOUT_ + " ' لأنه + // من نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-INT (" + G_VAR_WITHOUT_ + ")] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + if (!IsInsideNamespace) + // Global Function + // global-int = ... + CPP_GLOBAL_FUN.append(Global_ID[G_VAR_WITHOUT_] + " = "); + else + // Local Function + // global-int = ... + cpp_AddScript(TheFunction, Global_ID[G_VAR_WITHOUT_] + " = "); + // *** *** *** *** *** *** + } + else if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "نص") + { + // if (G_VAR_IS_CONST[(G_VAR_WITHOUT_)] == "ثابت") + // ErrorCode("لا يمكن تغيير قيمة المتغير ' " + G_VAR_WITHOUT_ + " ' لأنه + // من نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-STRING (" + G_VAR_WITHOUT_ + ")] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + if (!IsInsideNamespace) + // Global Function + // global-std::string = ... + CPP_GLOBAL_FUN.append(Global_ID[G_VAR_WITHOUT_] + " = "); + else + // Local Function + // global-std::string = ... + cpp_AddScript(TheFunction, Global_ID[G_VAR_WITHOUT_] + " = "); + // *** *** *** *** *** *** + } + else if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "منطق") + { + // if (G_VAR_IS_CONST[(G_VAR_WITHOUT_)] == "ثابت") + // ErrorCode("لا يمكن تغيير قيمة المتغير ' " + G_VAR_WITHOUT_ + " ' لأنه + // من نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-BOOL (" + G_VAR_WITHOUT_ + ")] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + if (!IsInsideNamespace) + // Global Function + // global-BOOL = ... + CPP_GLOBAL_FUN.append(Global_ID[G_VAR_WITHOUT_] + " = "); + else + // Local Function + // global-BOOL = ... + cpp_AddScript(TheFunction, Global_ID[G_VAR_WITHOUT_] + " = "); + // *** *** *** *** *** *** + } + } + else + { + if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "عدد") + { + // if (G_VAR_IS_CONST[(G_VAR_WITHOUT_)] == "ثابت") + // ErrorCode("لا يمكن تغيير قيمة المتغير ' " + G_VAR_WITHOUT_ + " ' لأنه + // من نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-INT (" + G_VAR_WITHOUT_ + ")] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Global Area + // global-int = ... + CPP_GLOBAL.append(Global_ID[G_VAR_WITHOUT_] + " = "); + // *** *** *** *** *** *** + } + else if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "نص") + { + // if (G_VAR_IS_CONST[(G_VAR_WITHOUT_)] == "ثابت") + // ErrorCode("لا يمكن تغيير قيمة المتغير ' " + G_VAR_WITHOUT_ + " ' لأنه + // من نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-STRING (" + G_VAR_WITHOUT_ + ")] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Global Area + // global-std::string = ... + CPP_GLOBAL.append(Global_ID[G_VAR_WITHOUT_] + " = "); + // *** *** *** *** *** *** + } + else if (G_VAR_TYPE[(G_VAR_WITHOUT_)] == "منطق") + { + // if (G_VAR_IS_CONST[(G_VAR_WITHOUT_)] == "ثابت") + // ErrorCode("لا يمكن تغيير قيمة المتغير ' " + G_VAR_WITHOUT_ + " ' لأنه + // من نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[GLOBAL-BOOL (" + G_VAR_WITHOUT_ + ")] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + // Global Area + // global-BOOL = ... + CPP_GLOBAL.append(Global_ID[G_VAR_WITHOUT_] + " = "); + // *** *** *** *** *** *** + } + } + + TempTokenCount = 0; + for (int p = 2; p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + // Global var Syntax + // _a = 1 + (_a * 3) ... + + ScriptSyntaxBuffer = + CheckForSyntax(G_VAR_TYPE[(G_VAR_WITHOUT_)], // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + true, // Accept Convertion from Int To String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG int + TheNamespace, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + + // *** Generate Code *** + if (IsInsideFunction) + { + if (!IsInsideNamespace) + // Global Function + CPP_GLOBAL_FUN.append(ScriptSyntaxBuffer + " ; \n"); + else + // Local Function + cpp_AddScript(TheFunction, ScriptSyntaxBuffer + " ; \n"); + } + else + { + // Global Area + CPP_GLOBAL.append(ScriptSyntaxBuffer + " ; \n"); + } + // *** *** *** *** *** *** + + return; // continue; } diff --git a/src/alif_var_g_class.hpp b/src/alif_var_g_class.hpp index 8b4c5f05..743be312 100644 --- a/src/alif_var_g_class.hpp +++ b/src/alif_var_g_class.hpp @@ -21,6 +21,103 @@ . */ -void parser_VarGlobalClass(std::string Token[2048], CLASS_TOKEN *o_tokens){ - +void parser_VarGlobalClass(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + + // Global Class var + // g1 = 1 + 2 + + if (!o_tokens->TOKENS_PREDEFINED) + return; // continue; + + if (!IsInsideFunction) + ErrorCode("يجب استعمال المتغير داخل دالة ' " + Token[1] + " ' ", o_tokens); + + if (Token[2] != "=") + ErrorCode("يجب اضافة ' = ' بعد اسم المتغير", o_tokens); + + if (Token[3] == "") + ErrorCode("يجب اضافه قيمة بعد ' = ' ", o_tokens); + + if (CLASS_G_VAR_TYPE[std::make_pair(TheClass, Token[1])] == "عدد") + { + // if (CLASS_G_VAR_IS_CONST[std::make_pair(TheClass, Token[1])] == "ثابت") + // ErrorCode("لا يمكن تغيير قيمة المتغير ' " + G_VAR_WITHOUT_ + " ' لأنه من + // نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-GLOBAL-INT (" + Token[1] + ")] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CLASS.append(" " + Global_ID[Token[1]] + " = "); + // *** *** *** *** *** *** + } + else if (CLASS_G_VAR_TYPE[std::make_pair(TheClass, Token[1])] == "نص") + { + // if (CLASS_G_VAR_IS_CONST[std::make_pair(TheClass, Token[1])] == "ثابت") + // ErrorCode("لا يمكن تغيير قيمة المتغير ' " + G_VAR_WITHOUT_ + " ' لأنه من + // نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-GLOBAL-STRING (" + Token[1] + ")] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CLASS.append(" " + Global_ID[Token[1]] + " = "); + // *** *** *** *** *** *** + } + else if (CLASS_G_VAR_TYPE[std::make_pair(TheClass, Token[1])] == "منطق") + { + // if (CLASS_G_VAR_IS_CONST[std::make_pair(TheClass, Token[1])] == "ثابت") + // ErrorCode("لا يمكن تغيير قيمة المتغير ' " + G_VAR_WITHOUT_ + " ' لأنه من + // نوع ثابت ", o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("[CLASS-GLOBAL-BOOL (" + Token[1] + ")] = ", + o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CLASS.append(" " + Global_ID[Token[1]] + " = "); + // *** *** *** *** *** *** + } + + TempTokenCount = 0; + + for (int p = 2; p <= o_tokens->TOTAL[o_tokens->Line]; p++) + { + if (Token[p] != "") + { + TempToken[TempTokenCount] = Token[p]; + TempTokenCount++; + } + } + + // Local var Syntax + // a = 1 + a * (_g - 3) ... + + ScriptSyntaxBuffer = CheckForSyntax( + CLASS_G_VAR_TYPE[std::make_pair(TheClass, Token[1])], // OBJECTIF_TYPE + true, // Accept Using Reference to Namespace:Controls + true, // Accept Using Reference to Namespace:Function + true, // Accept Using Reference to Global Functions + true, // Accept Using Reference to Local Functions + true, // Accept Using Reference to Global VAR + true, // Accept Using Reference to Local VAR + false, // Accept Convertion from String To Int + true, // Accept Convertion from Int To String + TempToken, // SYNTAX[] std::string + (TempTokenCount - 1), // SYNTAX_LONG int + TheClass, // TMP_WINDOW_NAME + TheFunction, // TMP_FUNCTION_NAME + o_tokens); + + if (DEBUG) + DEBUG_MESSAGE("\n\n", o_tokens); // DEBUG + + // *** Generate Code *** + CPP_CLASS.append(ScriptSyntaxBuffer + " ; \n"); + // *** *** *** *** *** *** + + return; // continue; } diff --git a/src/alif_window.hpp b/src/alif_window.hpp new file mode 100644 index 00000000..9b333ecf --- /dev/null +++ b/src/alif_window.hpp @@ -0,0 +1,788 @@ +/* + The Alif Programming Language + Version 3.x Series + (C)2021 Hassan DRAGA + www.aliflang.org + + This file is part of Alif compiler. + + Alif compiler is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 3, or (at your option) any later + version. + + Alif compiler is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with Alif compiler; see the file COPYING3. If not see + . +*/ + +std::string GetFormatedHTML(std::string HTML, std::string WindowName, + CLASS_TOKEN *o_tokens) +{ + + std::string FormatedHTML; + + /* + std::istringstream isCode(Code); +std::string Line; +while (std::getline(isCode, Line)){ + + std::size_t p = Line.find("ألف:"); + if (p != std::string::npos){ + + std::string AlifScript; + + // ... ألف:رئيسية:الدالة_test(10, 20, 'test_1') ... + // 6 = 'ألف' + // 1 = ':' + //AlifScript = Line.substr(p + 7); + AlifScript = substr_utf8(Line, p + 4, 0); + + int LINE_CHAR_TOTAL = 0; + int CHAR_NUMBER = 0; + std::string Char; + LINE_CHAR_TOTAL = CharCount_utf8(AlifScript, o_tokens); + bool INSIDE_STRING = false; + + int PramCount = 0; + std::string Pram; + + while (CHAR_NUMBER < LINE_CHAR_TOTAL){ + Char = substr_utf8(AlifScript, CHAR_NUMBER, 1); + + if (Char == "'") + Char = "\""; + + if (Char == "\""){ + if (INSIDE_STRING){ + // String End + // Add char, and pram is ready + Pram.append(Char); + PramCount++; + } + } + } + + //ErrorCode(" ####### Script : ||" + AlifScript + "||", +o_tokens); } else { FormatedHTML.append(Line); + } +} + */ + + // --- Reformating HTML script ------------------ + + std::istringstream ScriptStream(HTML); + std::string Line; + while (std::getline(ScriptStream, Line)) + { + + // + // + // Note: src=\" -> 6 + + std::size_t p_1; + std::size_t p_2; + std::string LineBuffer; + std::string LineLower; + + (void)p_2; // Just to skip --> warning: variable ‘p_2’ set but not used + // [-Wunused-but-set-variable] + + LineLower = boost::algorithm::to_lower_copy(Line); + + p_1 = LineLower.find(" src=\""); + if (p_1 != std::string::npos) + { + + p_1 = p_1 + 6; + + /* + #ifdef __linux__ + // src="file:///myfolder/test.jpg" + if(substr_utf8(Line, p_1, 8) == ""){ + + } + #endif + */ + + LineBuffer = substr_utf8(Line, p_1, 0); + + // if(DEBUG)DEBUG_MESSAGE("LineBuffer 000 |" + LineBuffer + "| \n\n", + // o_tokens); // DEBUG + + std::size_t p_2 = Line.find('\"', p_1); + if (p_2 != std::string::npos) + { + + LineBuffer = + boost::algorithm::trim_copy(substr_utf8(Line, p_1, (p_2 - p_1))); + // LineBuffer = substr_utf8(Line, p_1, (p_2 - p_1)); + + // Fix: src="file://..." + if (substr_utf8(LineBuffer, 0, 7) == "file://") + { + + boost::algorithm::replace_first(LineBuffer, "file://", ""); + if (DEBUG) + DEBUG_MESSAGE("file and fixed |" + LineBuffer + "| \n\n", + o_tokens); // DEBUG + } + + const std::string c_URI = LineBuffer; + + // if(DEBUG)DEBUG_MESSAGE("LineBuffer 111111 |" + LineBuffer + "| \n\n", + // o_tokens); // DEBUG + + // Fix: src="http://..." + // std::size_t p_h = LineBuffer.find("http://"); + // std::size_t p_hs = LineBuffer.find("https://"); + // if (p_h != std::string::npos || p_hs != std::string::npos){ + if (substr_utf8(LineBuffer, 0, 7) == "http://" || + substr_utf8(LineBuffer, 0, 8) == "https://") + { + + // Allow external link.. + FormatedHTML.append(Line); + // if(DEBUG)DEBUG_MESSAGE("http 0 |" + LineBuffer + "| next \n\n", + // o_tokens); // DEBUG + continue; + } + + std::string FileType = + LineBuffer.substr(LineBuffer.find_last_of(".") + 1); + + // .apng -> + // image/apng + // .bmp -> + // image/bmp + // .gif -> + // image/gif + // .ico / .cur -> + // image/x-icon .jpg / .jpeg / .jfif / .pjpeg / .pjp -> image/jpeg + // .png -> + // image/png + // .svg -> + // image/svg+xml .tif / .tiff + // -> image/tiff .webp + // -> image/webp + + if (FileType == "jpg" || FileType == "jpeg" || FileType == "jfif" || + FileType == "pjpeg" || FileType == "pjp") + { + FileType = "image/jpeg"; + } + else if (FileType == "png") + { + FileType = "image/png"; + } + else if (FileType == "gif") + { + FileType = "image/gif"; + } + else if (FileType == "apng") + { + FileType = "image/apng"; + } + else if (FileType == "bmp") + { + FileType = "image/bmp"; + } + else if (FileType == "ico" || FileType == "cur") + { + FileType = "image/x-icon"; + } + else if (FileType == "tif" || FileType == "tiff") + { + FileType = "image/tiff"; + } + else if (FileType == "svg") + { + FileType = "image/svg+xml"; + } + else if (FileType == "webp") + { + FileType = "image/webp"; + } + else + { + + // if(DEBUG)DEBUG_MESSAGE("Unknow 0 |" + FileType + "| next \n\n", + // o_tokens); // DEBUG + // Unknow file type + // so, skip embeding it. + FormatedHTML.append(Line); + continue; + } + + // --- BinToBase64 Data ------------------------ + boost::filesystem::ifstream FileStream(c_URI, std::ios::binary); + std::string FileData((std::istreambuf_iterator(FileStream)), + std::istreambuf_iterator()); + std::string DataBase64 = base64_encode( + reinterpret_cast(FileData.c_str()), + FileData.length()); + // --------------------------------------------- + + boost::algorithm::replace_first( + Line, c_URI, ("data:" + FileType + ";base64," + DataBase64)); + + // if(DEBUG)DEBUG_MESSAGE("=======> c_URI |" + c_URI + "| \n\n", + // o_tokens); // DEBUG if(DEBUG)DEBUG_MESSAGE("=======> FileType |" + + // FileType + "| \n\n", o_tokens); // DEBUG + // if(DEBUG)DEBUG_MESSAGE("=======> Line |" + Line + "| \n\n", + // o_tokens); // DEBUG + } + } + + FormatedHTML.append(Line + '\n'); + + p_1 = 0; + p_2 = 0; + LineBuffer = ""; + LineLower = ""; + Line = ""; + } + + // ErrorCode("END -> ", o_tokens); + + // if(!replace_end(FormatedHTML, "", AlifJavaScript_Bridge)){ + // ErrorCode("شيفرة واجهة ويب، لا تحتوي على '' -> " + WindowName, + // o_tokens); + // } + + // --- Bin2C Data ------------------------------ + // BinaryToC() work.. but result need extra work. + // BinaryToC("D:\\Code\\Alif_App\\Alif_2\\test.jpg", + // "D:\\Code\\Alif_App\\Alif_2\\test.jpg.cpp"); + // BinaryToC("D:\\Code\\Alif_App\\Alif_2\\test2.png", + // "D:\\Code\\Alif_App\\Alif_2\\test2.png.cpp"); + // --------------------------------------------- + + return FormatedHTML; +} + +void HTML_to_c(std::string sHTMLPath, std::string sCPath, std::string VarName, + std::string WindowName, CLASS_TOKEN *o_tokens) +{ + // This function can be completly replace in c++20 by + // In: test.html + // Out: test.c -> const test_content = "..test.html.."; + + // --- Read -------------------------- + boost::filesystem::ifstream rBuffer(sHTMLPath); + stringstream sHTML; + sHTML << rBuffer.rdbuf(); + + // --- HTML to C++ ------------------- + std::string sHTMLCode = + " \n" + + // --- Get formated AlifJavaScript --- + GetFormatedHTML(sHTML.str(), WindowName, o_tokens) + // sHTML.str() + + " \n"; + + // std::string::size_type pos = 0; + // while ((pos = sHTMLCode.find('\"', pos)) != std::string::npos){ + // sHTMLCode.replace(pos, 1, "\\\""); + // pos += 2; + //} + + std::string cppCode_start = + "static const std::string " + VarName + " = ( R\"V0G0N( \n\n"; + std::string cppCode_end = "\n\n )V0G0N\" );"; + std::string cppCode = R"( + // --- Const HTML script -------------------------- + )" + cppCode_start + + sHTMLCode + cppCode_end + R"( + // ------------------------------------------------ + wxCharBuffer )" + + VarName + R"(_CharBuffer = )" + VarName + R"(.ToUTF8(); + wxMemoryFSHandler::AddFile(")" + + VarName + R"(.htm", )" + VarName + + R"(_CharBuffer, strlen()" + VarName + + R"(_CharBuffer ) ); + + )"; + + // WebUI static html to global + std::string cppCodeWebUI = R"( + const std::string )" + + VarName + R"(_webui_html = R"V0G0N( + )" + sHTML.str() + R"( + )V0G0N"; + webui::window )" + VarName + + R"(_webui_o; // &)" + VarName + R"(_webui_html + )"; + CPP_GLOBAL.append(" " + cppCodeWebUI + " \n"); + + // --- Write ----------------------- + std::ofstream cFile(sCPath); + cFile << cppCode; + + CBUFER = CPP_WINDOW[std::make_pair(TheNamespace, "LOAD")]; + CPP_WINDOW[std::make_pair(TheNamespace, "LOAD")] = + CBUFER + " \n " + VarName + "_webui_o.show( &" + VarName + + "_webui_html ); "; +} + +void parser_NewWindowWeb(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + + // #واجهة رئيسية "UI_WEB_1" + // #window_web MyWindow "MyFile.html" + + if (IsInsideNamespace) + ErrorCode("لا يمكن انشاء مجال داخل مجال، المجال الحالية : " + TheNamespace, + o_tokens); + + if (IsInsideClass) + ErrorCode("لا يمكن انشاء مجال داخل صنف : " + TheClass, o_tokens); + + if (IsInsideFunction) + ErrorCode("لا يمكن انشاء مجال داخل دالة : " + TheFunction, o_tokens); + + if (Token[3] == "") + ErrorCode("يجب تحديد اسم المجال", o_tokens); + + if (!IsValidName(Token[3], o_tokens)) + ErrorCode("اسم غير مقبول : ' " + Token[3] + " ' ", o_tokens); + + if (Token[4] == "") + ErrorCode("يجب تحديد اسم الملف", o_tokens); + + if (!IsValidStringFormat(Token[4], o_tokens)) + ErrorCode("خطأ في كتابة إسم الملف: " + Token[4], o_tokens); + + // ------------------------ + + if (Token[3] == "رئيسية") + { + + // temporary set because this window + // didnt created yet, but we need + // this window Generated_ID now. + TheNamespace = "رئيسية"; + + // --- WindowWeb Main -------------------- + + if (!o_tokens->TOKENS_PREDEFINED) + { + + if (CONTROL_WIN_IS_SET["رئيسية"]) + ErrorCode("المجال ' رئيسية ' تم انشاؤها مسبقا في السطر رقم : " + + CONTROL_WIN_AT_LINE["رئيسية"], + o_tokens); + + // MAIN_WIN_IS_SET = true; + // MAIN_WIN_AT_LINE = IntToString(o_tokens->Line); + CONTROL_WIN_IS_SET["رئيسية"] = true; + WIN_IS_WEB["رئيسية"] = true; + // Win_CurrentTotalFucntion = 0; + CONTROL_WIN_AT_LINE["رئيسية"] = IntToString(o_tokens->Line); + CPP_WINDOW[std::make_pair("رئيسية", "شكل")] = " wxDEFAULT_FRAME_STYLE "; + APP_TYPE = "PC_GUI"; + + // temporary end + TheNamespace = ""; + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[WINDOW_WEB] [MAIN] {SET BASE CTR} \n\n", + o_tokens); // DEBUG + + /* + if (CONTROL_WIN_IS_SET["رئيسية"]){ + + // Main Namespace already set by control (Alif lang UI) + ErrorCode("النافذه الرئيسية تم انشاؤها مسبقا في السطر : " + + CONTROL_WIN_AT_LINE[(Token[3])], o_tokens); + } + */ + + // Not need this because we are in: #win web "MyWindow.alifui" + // IsInsideNamespace = true; + // TheNamespace = "رئيسية"; + // Win_CurrentTotalFucntion = 0; + // APP_TYPE = "PC_GUI"; + + // *** Generate Code *** + // New Web Namespace -> WebUI construction + CBUFER_ID = "ID_CTR_" + ID["رئيسية"] + "_" + Control_ID["AlifUIWeb"]; + CBUFER_OBJ = "OBJ_CTR_" + ID["رئيسية"] + "_" + Control_ID["AlifUIWeb"]; + std::string CBUFER_VarName = ID["رئيسية"] + "_ConstHTML"; + CPP_ID_DECLARATION.append(" int " + CBUFER_ID + + " = ALIFCORE_ID_GENERATOR(); \n"); + CPP_OBJ_DECLARATION.append(" wxWebView* " + CBUFER_OBJ + "; \n"); + // New Web Namespace -> WebUI HTML + std::string PATH_FULL_HTML_CPP = PATH_TEMP + SEPARATION + + "alifcompiler_html_" + ID["رئيسية"] + "_" + + RANDOM + ".cpp"; + HTML_to_c(PATH_FULL_WINDOW_WEB, PATH_FULL_HTML_CPP, CBUFER_VarName, + "رئيسية", o_tokens); + CPP_WINDOW[std::make_pair("رئيسية", "CTR_CONSTRUCTOR")] = + "wxBoxSizer* o_TopSizer = new wxBoxSizer(wxVERTICAL); " + "P->SetSizer(o_TopSizer); " + + CBUFER_OBJ + + " = wxWebView::New(P, wxID_ANY, \"\", wxPoint(10,10), wxSize(100, " + "100), wxWebViewBackendDefault, wxBORDER_NONE, " + "(\"Alif_Application\")); o_TopSizer->Add(" + + CBUFER_OBJ + ", wxSizerFlags().Expand().Proportion(1)); " + CBUFER_OBJ + + "->RegisterHandler(wxSharedPtr(new " + "wxWebViewArchiveHandler(\"wxfs\"))); " + + CBUFER_OBJ + + "->RegisterHandler(wxSharedPtr(new " + "wxWebViewFSHandler(\"memory\")));\n #include \"" + + PATH_FULL_HTML_CPP + "\" \n " + CBUFER_OBJ + + "->LoadURL(\"memory:" + CBUFER_VarName + + ".htm\"); \n Center(); \n Bind(wxEVT_WEBVIEW_NEWWINDOW, &NS_" + + ID["رئيسية"] + "::AlifJavaScript_OnNewWindow, this, " + CBUFER_OBJ + + "->GetId()); \n Bind(wxEVT_WEBVIEW_NAVIGATING, &NS_" + ID["رئيسية"] + + "::AlifJavaScript_OnNavigationRequest, this, " + CBUFER_OBJ + + "->GetId()); \n " + CBUFER_OBJ + "->EnableContextMenu(false); \n " + + CBUFER_OBJ + "->EnableHistory(false); \n "; + + // WebUI + // CBUFER_VarName + + // " + CBUFER_OBJ + "->SetEditable(false); " + // + CBUFER_OBJ + "->EnableContextMenu(false); " + // + CBUFER_OBJ + "->EnableHistory(false); " + // + CBUFER_OBJ + "->Enable(true); \n + + // New Web Namespace -> WebUI AlifJavaScript + CBUFER = CPP_WINDOW[std::make_pair(TheNamespace, "FUN_DECLARATION")]; + CPP_WINDOW[std::make_pair(TheNamespace, "FUN_DECLARATION")] = + CBUFER + " \n void AlifJavaScript_OnNewWindow(wxWebViewEvent& evt); \n " + "void AlifJavaScript_OnNavigationRequest(wxWebViewEvent& " + "evt); \n void AlifJavaScript_Error(std::string sError); void " + "AlifJavaScript_Run(std::string JSCode); \n void " + "AlifJavaScriptBridge(std::string sLink); \n "; + // New Web Namespace -> Basic Namespace settings + // CPP_WINDOW[std::make_pair(TheNamespace, "CTR_CONSTRUCTOR")] = " Center(); + // \n "; + // x = افصول + // y = ارتوب + /* + CPP_WINDOW[std::make_pair(TheNamespace, "نص")] = " (" + TheNamespace + ") + مجال بدون عنوان"; #ifdef __APPLE__ CPP_WINDOW[std::make_pair(TheNamespace, + "افصول")] = "10"; CPP_WINDOW[std::make_pair(TheNamespace, "ارتوب")] = + "25"; // Because the macOS task-bar is on top screen. #else + CPP_WINDOW[std::make_pair(TheNamespace, "افصول")] = "0"; + CPP_WINDOW[std::make_pair(TheNamespace, "ارتوب")] = "0"; + #endif + CPP_WINDOW[std::make_pair(TheNamespace, "عرض")] = "400"; + CPP_WINDOW[std::make_pair(TheNamespace, "ارتفاع")] = "400"; + Namespace_Total++; // only on second windows, no main. + Namespace_Total_Names[Namespace_Total] = TheNamespace; // only on second + windows, no main. CPP_ID_DECLARATION.append(" int ID_WINDOW_" + + ID[TheNamespace] + " = ALIFCORE_ID_GENERATOR(); \n"); CPP_GLOBAL.append(" + bool WINDOW_IS_SHOW_" + ID[TheNamespace] + " = false; \n"); + CPP_GLOBAL.append(" bool WINDOW_IS_CONSTRUCTION_" + ID[TheNamespace] + " = + false; \n"); CPP_GLOBAL.append(" void WINDOW_LOAD_" + ID[TheNamespace] + + "(); \n"); + */ + // *** *** *** *** *** *** + + // temporary end + TheNamespace = ""; + } + else + { + // --- WindowWeb MyWindowName -------------------- + + // temporary set because this window + // didnt created yet, but we need + // this window Generated_ID now. + TheNamespace = Token[3]; + + if (!IsValidName(Token[3], o_tokens)) + ErrorCode("اسم غير مقبول : ' " + Token[3] + " ' ", o_tokens); + + if (!o_tokens->TOKENS_PREDEFINED) + { + + if (CONTROL_WIN_IS_SET[Token[3]]) + ErrorCode("المجال ' " + Token[3] + " ' تم انشاؤها مسبقا في السطر : " + + CONTROL_WIN_AT_LINE[Token[3]], + o_tokens); + + // MAIN_WIN_IS_SET = true; + // MAIN_WIN_AT_LINE = IntToString(o_tokens->Line); + CONTROL_WIN_IS_SET[Token[3]] = true; + WIN_IS_WEB[Token[3]] = true; + // Win_CurrentTotalFucntion = 0; + CONTROL_WIN_AT_LINE[Token[3]] = IntToString(o_tokens->Line); + CPP_WINDOW[std::make_pair(Token[3], "شكل")] = " wxDEFAULT_FRAME_STYLE "; + APP_TYPE = "PC_GUI"; + + SET_C_NAME(Token[3]); + + // temporary end + TheNamespace = ""; + + return; // continue; + } + + if (DEBUG) + DEBUG_MESSAGE("[NAMESPACE] [" + Token[3] + "] {SET BASE CTR} \n\n", + o_tokens); // DEBUG + + // Not need this because we are in: #win web "MyWindow.alifui" + // IsInsideNamespace = true; + // TheNamespace = Token[3]; + // Win_CurrentTotalFucntion = 0; + // APP_TYPE = "PC_GUI"; + + // *** Generate Code *** + // New Web Namespace -> WebUI construction + CBUFER_ID = "ID_CTR_" + ID[Token[3]] + "_" + Control_ID["AlifUIWeb"]; + CBUFER_OBJ = "OBJ_CTR_" + ID[Token[3]] + "_" + Control_ID["AlifUIWeb"]; + std::string CBUFER_VarName = ID[Token[3]] + "_ConstHTML"; + CPP_ID_DECLARATION.append(" int " + CBUFER_ID + + " = ALIFCORE_ID_GENERATOR(); \n"); + CPP_OBJ_DECLARATION.append(" wxWebView* " + CBUFER_OBJ + "; \n"); + // New Web Namespace -> WebUI HTML + std::string PATH_FULL_HTML_CPP = PATH_TEMP + SEPARATION + + "alifcompiler_html_" + ID[Token[3]] + "_" + + RANDOM + ".cpp"; + HTML_to_c(PATH_FULL_WINDOW_WEB, PATH_FULL_HTML_CPP, CBUFER_VarName, + Token[3], o_tokens); + CPP_WINDOW[std::make_pair(Token[3], "CTR_CONSTRUCTOR")] = + "wxBoxSizer* o_TopSizer = new wxBoxSizer(wxVERTICAL); " + "P->SetSizer(o_TopSizer); " + + CBUFER_OBJ + + " = wxWebView::New(P, wxID_ANY, \"\", wxPoint(10,10), wxSize(100, " + "100), wxWebViewBackendDefault, wxBORDER_NONE, " + "(\"Alif_Application\")); o_TopSizer->Add(" + + CBUFER_OBJ + ", wxSizerFlags().Expand().Proportion(1)); " + CBUFER_OBJ + + "->RegisterHandler(wxSharedPtr(new " + "wxWebViewArchiveHandler(\"wxfs\"))); " + + CBUFER_OBJ + + "->RegisterHandler(wxSharedPtr(new " + "wxWebViewFSHandler(\"memory\")));\n #include \"" + + PATH_FULL_HTML_CPP + "\" \n " + CBUFER_OBJ + + "->LoadURL(\"memory:" + CBUFER_VarName + + ".htm\"); \n Center(); \n Bind(wxEVT_WEBVIEW_NEWWINDOW, &NS_" + + ID[Token[3]] + "::AlifJavaScript_OnNewWindow, this, " + CBUFER_OBJ + + "->GetId()); \n Bind(wxEVT_WEBVIEW_NAVIGATING, &NS_" + ID[Token[3]] + + "::AlifJavaScript_OnNavigationRequest, this, " + CBUFER_OBJ + + "->GetId()); \n " + CBUFER_OBJ + "->EnableContextMenu(false); \n " + + CBUFER_OBJ + "->EnableHistory(false); \n "; + + // " + CBUFER_OBJ + "->SetEditable(false); " + // + CBUFER_OBJ + "->EnableContextMenu(false); " + // + CBUFER_OBJ + "->EnableHistory(false); " + // + CBUFER_OBJ + "->Enable(true); \n + + // New Web Namespace -> WebUI AlifJavaScript + CBUFER = CPP_WINDOW[std::make_pair(TheNamespace, "FUN_DECLARATION")]; + CPP_WINDOW[std::make_pair(TheNamespace, "FUN_DECLARATION")] = + CBUFER + " \n void AlifJavaScript_OnNewWindow(wxWebViewEvent& evt); \n " + "void AlifJavaScript_OnNavigationRequest(wxWebViewEvent& " + "evt); \n void AlifJavaScript_Error(std::string sError); void " + "AlifJavaScript_Run(std::string JSCode); \n void " + "AlifJavaScriptBridge(std::string sLink); \n "; + // New Web Namespace -> Basic Namespace settings + // CPP_WINDOW[std::make_pair(TheNamespace, "CTR_CONSTRUCTOR")] = " Center(); + // \n "; + // x = افصول + // y = ارتوب + + CPP_WINDOW[std::make_pair(TheNamespace, "نص")] = + " (" + TheNamespace + ") مجال بدون عنوان"; +#ifdef __APPLE__ + CPP_WINDOW[std::make_pair(TheNamespace, "افصول")] = "10"; + CPP_WINDOW[std::make_pair(TheNamespace, "ارتوب")] = + "25"; // Because the macOS task-bar is on top screen. +#else + CPP_WINDOW[std::make_pair(TheNamespace, "افصول")] = "0"; + CPP_WINDOW[std::make_pair(TheNamespace, "ارتوب")] = "0"; +#endif + CPP_WINDOW[std::make_pair(TheNamespace, "عرض")] = "400"; + CPP_WINDOW[std::make_pair(TheNamespace, "ارتفاع")] = "400"; + Namespace_Total++; // only on second windows, no main. + Namespace_Total_Names[Namespace_Total] = + TheNamespace; // only on second windows, no main. + CPP_ID_DECLARATION.append(" int ID_WINDOW_" + ID[TheNamespace] + + " = ALIFCORE_ID_GENERATOR(); \n"); + CPP_GLOBAL.append(" bool WINDOW_IS_SHOW_" + ID[TheNamespace] + + " = false; \n"); + CPP_GLOBAL.append(" bool WINDOW_IS_CONSTRUCTION_" + ID[TheNamespace] + + " = false; \n"); + CPP_GLOBAL.append(" void WINDOW_LOAD_" + ID[TheNamespace] + "(); \n"); + // *** *** *** *** *** *** + + // temporary end + TheNamespace = ""; + } + + if (DEBUG) + DEBUG_MESSAGE("#NewWindow_Web (" + Token[3] + ") [HTML " + Token[4] + + " . ALIF UIWeb] \n\n", + o_tokens); + + // temporary end + TheNamespace = ""; +} + +void parser_NewWindow(std::string Token[2048], CLASS_TOKEN *o_tokens) +{ + + if (IsInsideNamespace) + ErrorCode("لا يمكن انشاء مجال داخل مجال، المجال الحالية : " + TheNamespace, + o_tokens); + + if (IsInsideClass) + ErrorCode("لا يمكن انشاء مجال داخل صنف : " + TheClass, o_tokens); + + if (IsInsideFunction) + ErrorCode("لا يمكن انشاء مجال داخل دالة : " + TheFunction, o_tokens); + + if (Token[2] == "") + ErrorCode("يجب تحديد اسم المجال", o_tokens); + + if (Token[3] != "" && Token[3] != "(") + ErrorCode("أمر غير معروف : ' " + Token[3] + " ' ", o_tokens); + + if (Token[3] == "(") + { + if (Token[4] == "") + ErrorCode("يجب اغلاق ')' ", o_tokens); + + if (Token[4] != ")") + ErrorCode("لا يمكن اعطاء خصائص لمجال", o_tokens); + + if (Token[5] != "") + ErrorCode("أمر غير معروف : ' " + Token[5] + " ' ", o_tokens); + } + + if (Token[2] == "رئيسية") // مجال رئيسية + { + if (!o_tokens->TOKENS_PREDEFINED) + { + if (MAIN_WIN_IS_SET) + ErrorCode("النافذه الرئيسية تم انشاؤها مسبقا في السطر : " + + MAIN_WIN_AT_LINE, + o_tokens); + + MAIN_WIN_IS_SET = true; + MAIN_WIN_AT_LINE = IntToString(o_tokens->Line); + WIN_IS_WEB["رئيسية"] = (WIN_IS_WEB["رئيسية"] ? true : false); + + IsInsideNamespace = true; // Need by Tokens Predefined + TheNamespace = "رئيسية"; // Need by Tokens Predefined + Win_CurrentTotalFucntion = 0; + APP_TYPE = "PC_GUI"; + + return; // continue; + } + + IsInsideNamespace = true; + TheNamespace = "رئيسية"; + Win_CurrentTotalFucntion = 0; + APP_TYPE = "PC_GUI"; + + if (CONTROL_WIN_IS_SET["رئيسية"]) + { + if (DEBUG) + DEBUG_MESSAGE("[NAMESPACE] [MAIN] {CTR ALREADY SET} \n\n", + o_tokens); // DEBUG + + return; // continue; + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[NAMESPACE] [MAIN] {SET BASE CTR} \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // CG_INITIALIZATION() // already done by 'alif.cpp' + CPP_WINDOW[std::make_pair("رئيسية", "CTR_CONSTRUCTOR")] = + " Center(); \n "; + // *** *** *** *** *** *** + + return; // continue; + } + } + else // مجال MyWindowName + { + if (!IsValidName(Token[2], o_tokens)) + ErrorCode("اسم غير مقبول : ' " + Token[2] + " ' ", o_tokens); + + if (!o_tokens->TOKENS_PREDEFINED) + { + if (namespace_is_set[Token[2]]) + ErrorCode("المجال ' " + Token[2] + " ' تم انشاؤها مسبقا في السطر : " + + namespace_at_line[Token[2]], + o_tokens); + + namespace_is_set[Token[2]] = true; + WIN_IS_WEB[Token[2]] = (WIN_IS_WEB[Token[2]] ? true : false); + namespace_at_line[Token[2]] = IntToString(o_tokens->Line); + + IsInsideNamespace = true; // Need by Tokens Predefined + TheNamespace = Token[2]; // Need by Tokens Predefined + Win_CurrentTotalFucntion = 0; + APP_TYPE = "PC_GUI"; + + SET_C_NAME(Token[2]); + return; // continue; + } + + IsInsideNamespace = true; + TheNamespace = Token[2]; + Win_CurrentTotalFucntion = 0; + APP_TYPE = "PC_GUI"; + + if (CONTROL_WIN_IS_SET[Token[2]]) + { + if (DEBUG) + DEBUG_MESSAGE("[NAMESPACE] [" + Token[2] + "] {CTR ALREADY SET} \n\n", + o_tokens); // DEBUG + return; // continue; + } + else + { + if (DEBUG) + DEBUG_MESSAGE("[NAMESPACE] [" + Token[2] + "] {SET BASE CTR} \n\n", + o_tokens); // DEBUG + + // *** Generate Code *** + // New Namespace + // x = افصول + // y = ارتوب + CPP_WINDOW[std::make_pair(Token[2], "نص")] = + " (" + Token[2] + ") مجال بدون عنوان"; +#ifdef __APPLE__ + CPP_WINDOW[std::make_pair(Token[2], "افصول")] = "10"; + CPP_WINDOW[std::make_pair(Token[2], "ارتوب")] = + "25"; // Because the macOS task-bar is on top screen. +#else + CPP_WINDOW[std::make_pair(Token[2], "افصول")] = "0"; + CPP_WINDOW[std::make_pair(Token[2], "ارتوب")] = "0"; +#endif + CPP_WINDOW[std::make_pair(Token[2], "عرض")] = "400"; + CPP_WINDOW[std::make_pair(Token[2], "ارتفاع")] = "400"; + Namespace_Total++; + Namespace_Total_Names[Namespace_Total] = Token[2]; + CPP_ID_DECLARATION.append(" int ID_WINDOW_" + ID[Token[2]] + + " = ALIFCORE_ID_GENERATOR(); \n"); + CPP_GLOBAL.append(" bool WINDOW_IS_SHOW_" + ID[Token[2]] + + " = false; \n"); + CPP_GLOBAL.append(" bool WINDOW_IS_CONSTRUCTION_" + ID[Token[2]] + + " = false; \n"); + CPP_GLOBAL.append(" void WINDOW_LOAD_" + ID[Token[2]] + "(); \n"); + // *** *** *** *** *** *** + + return; // continue; + } + } +}