You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

106 line
2.8 KiB

  1. #define console_normal "\x1B[0m"
  2. #define console_red "\x1B[31m"
  3. #define console_green "\x1B[32m"
  4. #define console_cyan "\x1B[36m"
  5. typedef enum {
  6. Log_Level_None,
  7. Log_Level_Critical,
  8. Log_Level_Warning,
  9. Log_Level_Info,
  10. Log_Level_Debug,
  11. } Log_Level;
  12. Log_Level log_level = Log_Level_Debug;
  13. void log_message(Log_Level type, char* message) {
  14. if (type > log_level)
  15. return;
  16. char* prefix;
  17. switch (type) {
  18. case Log_Level_Critical: prefix = "CRITICAL"; break;
  19. case Log_Level_Warning: prefix = "WARNING"; break;
  20. case Log_Level_Info: prefix = "INFO"; break;
  21. case Log_Level_Debug: prefix = "DEBUG"; break;
  22. case Log_Level_None: return;
  23. }
  24. printf("%s: %s\n",prefix, message);
  25. }
  26. void panic(char* message) {
  27. log_message(Log_Level_Critical, message);
  28. exit(1);
  29. }
  30. char* Ast_Node_Type_to_string(Ast_Node_Type type) {
  31. switch (type) {
  32. case(Ast_Node_Type_Nil): return "nil";
  33. case(Ast_Node_Type_Number): return "number";
  34. case(Ast_Node_Type_String): return "string";
  35. case(Ast_Node_Type_Symbol): return "symbol";
  36. case(Ast_Node_Type_Keyword): return "keyword";
  37. case(Ast_Node_Type_Function): return "function";
  38. case(Ast_Node_Type_Built_In_Function): return "built-in function";
  39. case(Ast_Node_Type_Pair): return "pair";
  40. }
  41. }
  42. void print(Ast_Node* node) {
  43. switch (node->type) {
  44. case (Ast_Node_Type_Nil): {
  45. printf("nil");
  46. } break;
  47. case (Ast_Node_Type_Number): {
  48. printf("%f", node->value.number->value);
  49. } break;
  50. case (Ast_Node_Type_String): {
  51. printf("\"%s\"", node->value.string->value);
  52. } break;
  53. case (Ast_Node_Type_Symbol): {
  54. printf("%s", node->value.symbol->identifier);
  55. } break;
  56. case (Ast_Node_Type_Keyword): {
  57. printf(":%s", node->value.keyword->identifier);
  58. } break;
  59. case (Ast_Node_Type_Function): {
  60. printf("[lambda]");
  61. } break;
  62. case (Ast_Node_Type_Built_In_Function): {
  63. printf("[built-in-function %s]", node->value.built_in_function->identifier);
  64. } break;
  65. case (Ast_Node_Type_Pair): {
  66. Ast_Node* head = node;
  67. printf("(");
  68. while (1) {
  69. print(head->value.pair->first);
  70. head = head->value.pair->rest;
  71. if (head->type != Ast_Node_Type_Pair)
  72. break;
  73. printf(" ");
  74. }
  75. if (head->type != Ast_Node_Type_Nil) {
  76. printf(" . ");
  77. print(head);
  78. }
  79. printf(")");
  80. } break;
  81. }
  82. }
  83. void log_error() {
  84. printf("\t%s%s%s\n", console_red,
  85. Error_Type_to_string(error->type),
  86. console_normal);
  87. printf("\t in: %s", console_cyan);
  88. print(error->location);
  89. printf("%s\n", console_normal);
  90. }