#ifndef AST_H #define AST_H #include #include "../lists/lists.h" enum ast_type { AST_END, AST_LIST, AST_IF, AST_CMD }; struct ast_cmd { struct list *cmd; // A list of words (char*) }; struct ast_if { struct ast *condition; struct ast *then_clause; struct ast *else_clause; }; struct ast { enum ast_type type; /** * Data associated with this AST node. It can be one of the following: * - NULL (AST_END) * - struct ast_if* (AST_IF) * - struct ast_cmd* (AST_CMD) */ void *data; }; struct ast_list { struct list *children; // A list of ASTs (ast*) }; /** * Checks if the given AST node is an if statement. */ bool ast_is_if(struct ast *node); /** * Checks if the given AST node is a command. */ bool ast_is_cmd(struct ast *node); /** * Checks if the given AST node is a command. */ bool ast_is_list(struct ast *node); /** * Retrieves the if statement data from the given AST node. * Assumes that the node is of type AST_IF. */ struct ast_if *ast_get_if(struct ast *node); /** * Retrieves the command data from the given AST node. * Assumes that the node is of type AST_CMD. */ struct ast_cmd *ast_get_cmd(struct ast *node); /** * Retrieves the command data from the given AST node. * Assumes that the node is of type AST_LIST. */ struct ast_list *ast_get_list(struct ast *node); /** * Creates a new AST node representing an if statement. */ struct ast *ast_create_if(struct ast *condition, struct ast *then_clause, struct ast *else_clause); /** * Creates a new AST node representing a command. */ struct ast *ast_create_cmd(struct list *cmd); /** * Creates a new AST node representing a list of ASTs */ struct ast* ast_create_list(struct list* ast_list); #endif /* ! AST_H */