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.
 
 
 
 
 
 

115 line
2.4 KiB

  1. struct Ast_Node;
  2. typedef enum {
  3. Ast_Node_Type_Nil,
  4. Ast_Node_Type_Symbol,
  5. Ast_Node_Type_Keyword,
  6. Ast_Node_Type_Number,
  7. Ast_Node_Type_String,
  8. Ast_Node_Type_Pair,
  9. Ast_Node_Type_Function,
  10. Ast_Node_Type_Built_In_Function,
  11. } Ast_Node_Type;
  12. typedef struct {
  13. char* identifier;
  14. } Symbol;
  15. typedef struct {
  16. char* identifier;
  17. } Keyword;
  18. typedef struct {
  19. double value;
  20. } Number;
  21. typedef struct {
  22. char* value;
  23. } String;
  24. typedef struct {
  25. struct Ast_Node* first;
  26. struct Ast_Node* rest;
  27. } Pair;
  28. typedef struct {
  29. Pair* regular_params;
  30. Pair* keyword_params;
  31. } Lambda_List;
  32. typedef struct {
  33. Lambda_List* parameters;
  34. Pair* form;
  35. } Function;
  36. typedef struct {
  37. char* identifier;
  38. } Built_In_Function;
  39. struct Ast_Node {
  40. Ast_Node_Type type;
  41. union {
  42. Symbol* symbol;
  43. Keyword* keyword;
  44. Number* number;
  45. String* string;
  46. Pair* pair;
  47. Function* function;
  48. Built_In_Function* built_in_function;
  49. } value;
  50. };
  51. // was forward declarated
  52. typedef struct Ast_Node Ast_Node;
  53. Ast_Node* create_ast_node_nil() {
  54. Ast_Node* node = new(Ast_Node);
  55. node->type = Ast_Node_Type_Nil;
  56. node->value.pair = NULL;
  57. return node;
  58. }
  59. Ast_Node* create_ast_node_number(double number) {
  60. Ast_Node* node = new(Ast_Node);
  61. node->type = Ast_Node_Type_Number;
  62. node->value.number = new(Number);
  63. node->value.number->value = number;
  64. return node;
  65. }
  66. Ast_Node* create_ast_node_string(char* str) {
  67. Ast_Node* node = new(Ast_Node);
  68. node->type = Ast_Node_Type_String;
  69. node->value.string = new(String);
  70. node->value.string->value = str;
  71. return node;
  72. }
  73. Ast_Node* create_ast_node_symbol(char* identifier) {
  74. Ast_Node* node = new(Ast_Node);
  75. node->type = Ast_Node_Type_Symbol;
  76. node->value.symbol = new(Symbol);
  77. node->value.symbol->identifier = identifier;
  78. return node;
  79. }
  80. Ast_Node* create_ast_node_built_in_function(char* identifier) {
  81. Ast_Node* node = new(Ast_Node);
  82. node->type = Ast_Node_Type_Built_In_Function;
  83. node->value.built_in_function = new(Built_In_Function);
  84. node->value.built_in_function->identifier = identifier;
  85. return node;
  86. }
  87. Ast_Node* create_ast_node_pair(Ast_Node* first, Ast_Node* rest) {
  88. Ast_Node* node = new(Ast_Node);
  89. node->type = Ast_Node_Type_Pair;
  90. node->value.pair = new(Pair);
  91. node->value.pair->first = first;
  92. node->value.pair->rest = rest;
  93. return node;
  94. }