diff --git a/Anna et Ethan/regexp.c b/Anna et Ethan/regexp.c new file mode 100644 index 0000000..83d8bc7 --- /dev/null +++ b/Anna et Ethan/regexp.c @@ -0,0 +1,133 @@ +#include "regexp.h" + +bool reg_issimple(regexp *expression) { + if (expression == NULL) return true; + if (expression->op == INTER || expression->op == COMPLEMENT) return false; + return reg_issimple(expression->left) && reg_issimple(expression->right); +} + +void reg_free(regexp *expression) { + if (expression == NULL) return; + reg_free(expression->left); + reg_free(expression->right); + free(expression); + return; +} + +regexp *reg_copy(regexp *expression) { + if (expression == NULL) return NULL; + // on alloue de la mémoire pour la copie + regexp *copy = malloc(sizeof(regexp)); + // on copie les champs de l'expression + copy->op = expression->op; + copy->letter = expression->letter; + // on copie les sous-expressions de manière récursive + copy->left = reg_copy(expression->left); + copy->right = reg_copy(expression->right); + // on retourne la copie effectuée + return copy; +} + +regexp *reg_empty(void) { + regexp *ptr = malloc(sizeof(regexp)); + if (ptr == NULL) { + ERROR("reg_empty : malloc failed"); + } else { + ptr->op = EMPTY; + ptr->letter = '\0'; + ptr->left = NULL; + ptr->right = NULL; + } + return ptr; +} + +regexp *reg_epsilon(void) { + regexp *ptr = malloc(sizeof(regexp)); + if (ptr == NULL) { + ERROR("reg_epsilon : malloc failed"); + } else { + ptr->op = EPSILON; + ptr->letter = '\0'; + ptr->left = NULL; + ptr->right = NULL; + } + return ptr; +} + +regexp *reg_letter(char c) { + regexp *ptr = malloc(sizeof(regexp)); + if (ptr == NULL) { + ERROR("reg_lettre : malloc failed"); + } else { + ptr->op = CHAR; + ptr->letter = c; + ptr->left = NULL; + ptr->right = NULL; + } + return ptr; +} + +regexp *reg_union(regexp *ptr_left, regexp *ptr_right) { + regexp *ptr = malloc(sizeof(regexp)); + if (ptr == NULL) { + ERROR("reg_union : malloc failed"); + } else { + ptr->op = UNION; + ptr->letter = '\0'; + ptr->left = ptr_left; + ptr->right = ptr_right; + } + return ptr; +} + +regexp *reg_inter(regexp *ptr_left, regexp *ptr_right) { + regexp *ptr = malloc(sizeof(regexp)); + if (ptr == NULL) { + ERROR("reg_inter : malloc failed"); + } else { + ptr->op = INTER; + ptr->letter = '\0'; + ptr->left = ptr_left; + ptr->right = ptr_right; + } + return ptr; +} + +regexp *reg_concat(regexp *ptr_left, regexp *ptr_right) { + regexp *ptr = malloc(sizeof(regexp)); + if (ptr == NULL) { + ERROR("reg_concat : malloc failed"); + } else { + ptr->op = CONCAT; + ptr->letter = '\0'; + ptr->left = ptr_left; + ptr->right = ptr_right; + } + return ptr; +} + +regexp *reg_star(regexp *expression) { + regexp *ptr = malloc(sizeof(regexp)); + if (ptr == NULL) { + ERROR("reg_star : malloc failed"); + } else { + ptr->op = STAR; + ptr->letter = '\0'; + ptr->left = expression; + ptr->right = NULL; + } + return ptr; +} + +regexp *reg_complement(regexp *expression) { + regexp *ptr = malloc(sizeof(regexp)); + if (ptr == NULL) { + ERROR("reg_complement : malloc failed"); + } else { + ptr->op = COMPLEMENT; + ptr->letter = '\0'; + ptr->left = expression; + ptr->right = NULL; + } + return ptr; +}