Files

134 lines
3.3 KiB
C
Raw Permalink Normal View History

2024-12-16 01:09:03 +00:00
#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;
}