|
@ -0,0 +1,160 @@ |
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
#include <stdlib.h> |
|
|
|
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|
|
|
|
} |