|
- struct Ast_Node;
-
- typedef enum {
- Ast_Node_Type_Nil,
-
- Ast_Node_Type_Symbol,
- Ast_Node_Type_Keyword,
- Ast_Node_Type_Number,
- Ast_Node_Type_String,
-
- Ast_Node_Type_Pair,
- Ast_Node_Type_Function,
- Ast_Node_Type_Built_In_Function,
- } Ast_Node_Type;
-
- typedef struct {
- char* identifier;
- } Symbol;
-
- typedef struct {
- char* identifier;
- } Keyword;
-
- typedef struct {
- double value;
- } Number;
-
- typedef struct {
- char* value;
- } String;
-
- typedef struct {
- struct Ast_Node* first;
- struct Ast_Node* rest;
- } Pair;
-
- typedef struct {
- Pair* regular_params;
- Pair* keyword_params;
- } Lambda_List;
-
- typedef struct {
- Lambda_List* parameters;
- Pair* form;
- } Function;
-
- typedef struct {
- char* identifier;
- } Built_In_Function;
-
- struct Ast_Node {
- Ast_Node_Type type;
- union {
- Symbol* symbol;
- Keyword* keyword;
- Number* number;
- String* string;
- Pair* pair;
- Function* function;
- Built_In_Function* built_in_function;
- } value;
- };
- // was forward declarated
- typedef struct Ast_Node Ast_Node;
-
-
- Ast_Node* create_ast_node_nil() {
- Ast_Node* node = new(Ast_Node);
- node->type = Ast_Node_Type_Nil;
- node->value.pair = NULL;
- return node;
- }
-
- Ast_Node* create_ast_node_number(double number) {
- Ast_Node* node = new(Ast_Node);
- node->type = Ast_Node_Type_Number;
- node->value.number = new(Number);
- node->value.number->value = number;
- return node;
- }
-
- Ast_Node* create_ast_node_string(char* str) {
- Ast_Node* node = new(Ast_Node);
- node->type = Ast_Node_Type_String;
- node->value.string = new(String);
- node->value.string->value = str;
- return node;
- }
-
- Ast_Node* create_ast_node_symbol(char* identifier) {
- Ast_Node* node = new(Ast_Node);
- node->type = Ast_Node_Type_Symbol;
- node->value.symbol = new(Symbol);
- node->value.symbol->identifier = identifier;
- return node;
- }
-
-
- Ast_Node* create_ast_node_built_in_function(char* identifier) {
- Ast_Node* node = new(Ast_Node);
- node->type = Ast_Node_Type_Built_In_Function;
- node->value.built_in_function = new(Built_In_Function);
- node->value.built_in_function->identifier = identifier;
- return node;
- }
-
- Ast_Node* create_ast_node_pair(Ast_Node* first, Ast_Node* rest) {
- Ast_Node* node = new(Ast_Node);
- node->type = Ast_Node_Type_Pair;
- node->value.pair = new(Pair);
- node->value.pair->first = first;
- node->value.pair->rest = rest;
- return node;
- }
|