Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

96 строки
2.1 KiB

  1. #define _CRT_SECURE_NO_DEPRECATE
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <stdarg.h> /* needed for va_list */
  6. #include <ctype.h>
  7. #include <math.h>
  8. #include "./helpers.c"
  9. #include "./ast.c"
  10. #include "./error.c"
  11. #include "./io.c"
  12. #include "./assert.c"
  13. #include "./parse.c"
  14. #include "./env.c"
  15. #include "./built_ins.c"
  16. #include "./eval.c"
  17. #include "./testing.c"
  18. #include "./init.c"
  19. int interprete_file (char* file_content) {
  20. Ast_Node_Array_List* program = parse_program(file_content);
  21. if (error) {
  22. log_error();
  23. return 1;
  24. }
  25. Environment* env = create_empty_environment(Environment_Type_Let);
  26. built_in_load("pre.slime", env);
  27. if (error) {
  28. log_error();
  29. return 1;
  30. }
  31. Ast_Node* result = create_ast_node_nil();
  32. for (int i = 0; i < program->next_index; ++i) {
  33. result = eval_expr(program->data[i], env);
  34. if (error) {
  35. log_error();
  36. return 1;
  37. }
  38. }
  39. return 0;
  40. }
  41. int interprete_stdin () {
  42. printf("Welcome to the lispy interpreter.\n");
  43. char* line;
  44. Environment* env = create_empty_environment(Environment_Type_Let);
  45. built_in_load("pre.slime", env);
  46. if (error) {
  47. log_error();
  48. delete_error();
  49. }
  50. Ast_Node* parsed, * evaluated;
  51. while (true) {
  52. printf(">");
  53. line = read_line();
  54. parsed = parse_single_expression(line);
  55. if (error) {
  56. log_error();
  57. delete_error();
  58. continue;
  59. }
  60. evaluated = eval_expr(parsed, env);
  61. if (error) {
  62. log_error();
  63. delete_error();
  64. continue;
  65. }
  66. print(evaluated);
  67. printf("\n");
  68. }
  69. return 0;
  70. }
  71. int main (int argc, char *argv[]) {
  72. init();
  73. if (argc > 1) {
  74. char* file_content = read_entire_file(argv[1]);
  75. if (file_content) {
  76. return interprete_file(file_content);
  77. } else {
  78. printf("The file could not be read\n");
  79. return 1;
  80. }
  81. } else {
  82. run_all_tests();
  83. return interprete_stdin();
  84. }
  85. }