#include #include #include typedef struct Node Node; typedef struct Exploration Exploration; enum opcode { STRING, AND }; struct Exploration { int position; char *text; }; Exploration *mkExploration(char *text) { Exploration *exploration = calloc(1,sizeof(Exploration)); exploration->position= 0; exploration->text= text; return exploration; } char advance(Exploration *exploration) { return exploration->text[exploration->position++]; } int endExploration(Exploration *exploration) { if (exploration->position >= strlen(exploration->text)) { return 1; } else { return 0; } } void setPosition(Exploration *exploration, int position) { exploration->position= position; } struct Node { enum opcode type; union { char *stringValue; Node *children[2]; }; }; Node *mkNode(enum opcode type) { Node *node= calloc(1, sizeof(Node)); node->type= type; return node; } Node *mkString(char *value) { Node *node= mkNode(STRING); node->stringValue= value; return node; } Node *mkAnd(Node *node1, Node *node2) { Node *node= mkNode(AND); node->children[0]= node1; node->children[1]= node2; return node; } int execute(Node *node, Exploration *in) { switch (node->type) { case STRING: { for (int i=0; i < strlen(node->stringValue);i++) { if (advance(in) != node->stringValue[i]) { return 0; } } if (endExploration(in)==1) { return 1; } else { return -1; } } case AND: { if (execute(node->children[0], in) == 0) //si il y a eu une erreur { return 0; } else //si ça s'est bien passé { return execute(node->children[1], in); } } } printf("this cannot happen\n"); abort(); } int main(int argc, char **argv) { Exploration *in= mkExploration("aabbcc"); /*Node *program= mkString("aabbcc");*/ Node *program= mkAnd(mkString("aab"), mkString("bcc")); /*Node *program= mkAnd(mkString("aa"), mkAnd(mkString("bb"), mkString("cc")); Node *program= mkAnd(mkStar(mkString("a")), // "a"*"b"*"c"* mkAnd(mkStar(mkString("b")), mkStar(mkString("c")));*/ if (execute(program, in)<=0) { printf("no match\n"); } else { printf("match\n"); }// 0 => no match, 1 => match /*Input *in1= mkInput("hello"); Input *in2= mkInput("world"); Input *in3= mkInput("hello world"); Node *program= mkOr(mkString("hello"), // "hello" | "world" mkString("world")); printf("%i\n", execute(program, in)); // 0 => no match, 1 => match*/ return 0; }