From f79290084948f3cf140395c270c07cf29ca58e8d Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Sun, 22 Sep 2024 19:34:43 +0330
Subject: Better errors Added variables

---
 src/main.c | 108 +++++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 66 insertions(+), 42 deletions(-)

(limited to 'src/main.c')

diff --git a/src/main.c b/src/main.c
index c23696e..ea85110 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,62 +1,70 @@
 #include <stdlib.h>
+#include <string.h>
 #include <utils/file.h>
 #include <utils/time.h>
 #include <vm/runner/runner.h>
 
+#include "compiler/tree_parser/tree_parser.h"
+#include "utils/types.h"
+
 static const char *codes[] = {
-    "print(\"\");",
+    "print(\"Hello\\n\");",
 };
 
-bool run(char const *restrict code) {
-  bool ranSuccess = false;
-  const Nodes nodes = lexer(code);
-  ParsedNode *parsedNode = parser(nodes);
-  if (parsedNode != NULL) {
-    Instructions instructions = codeGenerator(parsedNode);
-    if (instructions.size != ERROR_SIZE) {
-      ranSuccess = runner(instructions);
-      deleteInstructions(instructions);
-    }
-    deleteParsedNode(parsedNode);
-  }
-  deleteNodes(nodes);
-  return ranSuccess;
-}
-
 Clock runWithPrint(char const *restrict code) {
   Clock sum = 0;
   Clock diff = 0;
-  printf("----code:\n%s\n----\n", code);
+  fprintf(stderr, "----code:\n%s\n----\n", code);
   Clock start = getTimeInNano();
   const Nodes nodes = lexer(code);
   diff += getTimeInNano() - start;
   sum += diff;
-  printNodes(nodes);
-  printf("----lexing in %ldns\n", diff);
-  start = getTimeInNano();
-  ParsedNode *parsedNode = parser(nodes);
-  diff = getTimeInNano() - start;
-  sum += diff;
-  printf("----parsing in %ldns\n", diff);
-  if (parsedNode != NULL) {
-    printParsedNode(parsedNode);
+  if (nodes.size != ERROR_SIZE) {
+    printNodes(nodes);
+    fprintf(stderr, "----lexing in %ldns\n", diff);
     start = getTimeInNano();
-    Instructions instructions = codeGenerator(parsedNode);
-    if (instructions.size != ERROR_SIZE) {
-      diff = getTimeInNano() - start;
-      sum += diff;
-      printf("----code_generator in %ldns\n", diff);
-      printInstructions(instructions);
+    ParsedNode *parsedNode = _parser(nodes, code);
+    diff = getTimeInNano() - start;
+    sum += diff;
+    if (parsedNode != NULL) {
+      printParsedNode(parsedNode);
+      fprintf(stderr, "----node parsing in %ldns\n", diff);
       start = getTimeInNano();
-      bool ranSuccess = runner(instructions);
+      ParsedTree *parsedTree = _treeParser(parsedNode, code);
       diff = getTimeInNano() - start;
       sum += diff;
-      printf("----runner in %ldns\n", diff);
-      printf("ran sucessfully = %s\n", ranSuccess ? "true" : "false");
-      printf("----sum %ldns\n", sum);
-      deleteInstructions(instructions);
+      if (parsedTree != NULL) {
+        printParsedTreeNode(parsedTree);
+        fprintf(stderr, "----tree parsing in %ldns\n", diff);
+        start = getTimeInNano();
+        Instructions instructions = _codeGenerator(parsedTree, code);
+        diff = getTimeInNano() - start;
+        sum += diff;
+        if (instructions.size != ERROR_SIZE) {
+          printInstructions(instructions);
+          fprintf(stderr, "----code_generator in %ldns\n", diff);
+          start = getTimeInNano();
+          bool ranSuccess = _runner(instructions);
+          diff = getTimeInNano() - start;
+          sum += diff;
+          fprintf(stderr, "----runner in %ldns\n", diff);
+          fprintf(stderr, "ran sucessfully = %s\n",
+                  ranSuccess ? "true" : "false");
+          fprintf(stderr, "----sum %ldns\n", sum);
+          deleteInstructions(instructions);
+        } else {
+          fprintf(stderr, "----returned error");
+        }
+        deleteParsedTree(parsedTree);
+      } else {
+        fprintf(stderr, "----returned error");
+      }
+      deleteParsedNode(parsedNode);
+    } else {
+      fprintf(stderr, "----returned error");
     }
-    deleteParsedNode(parsedNode);
+  } else {
+    fprintf(stderr, "----returned error");
   }
   deleteNodes(nodes);
   return sum;
@@ -66,7 +74,7 @@ Clock process() {
   Clock sumAll = 0;
   for (size_t i = 0; i < sizeof(codes) / sizeof(char *); ++i) {
     Clock start = getTimeInNano();
-    run(codes[i]);
+    runWithPrint(codes[i]);
     sumAll += getTimeInNano() - start;
   }
   return sumAll;
@@ -74,7 +82,7 @@ Clock process() {
 
 void runBenchmark() {
   Clock sum = 0;
-  const int times = 10000;
+  const int times = 100;
   for (int i = 0; i < times; ++i) {
     sum += process();
   }
@@ -88,7 +96,23 @@ int main(int argc, char *argv[]) {
     return 1;
   }
   char *code = read_whole_file(argv[1]);
-  const bool ret = run(code);
+  if (code == NULL) {
+    return 1;
+  }
+  char *import = read_whole_file("stdlib/builtins.felan");
+  if (import == NULL) {
+    return 1;
+  }
+  char *lastCode = code;
+  code = a404m_malloc(strlen(code) + strlen(import) + 2);
+  strcpy(code, import);
+  strcat(code, "\n");
+  strcat(code, lastCode);
+  free(lastCode);
+  free(import);
+
+  bool ret = runner(code);
+
   free(code);
   if (ret) {
     return 0;
-- 
cgit v1.2.3