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