From ae199b3d0e980f612c7d7260602ac4e66f49a31d Mon Sep 17 00:00:00 2001 From: leo Date: Thu, 17 Jun 2021 11:52:52 +0200 Subject: [PATCH] PLUS et STAR --- lexer.c | 55 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/lexer.c b/lexer.c index c6057b7..6a45097 100644 --- a/lexer.c +++ b/lexer.c @@ -9,7 +9,8 @@ typedef struct Exploration Exploration; enum opcode { STRING, AND, - STAR + STAR, + PLUS }; struct Exploration { @@ -19,7 +20,7 @@ struct Exploration Exploration *mkExploration(char *text) { - Exploration *exploration = calloc(1,sizeof(Exploration)); + Exploration *exploration = calloc(1,sizeof(Exploration*)); //sizeof du type pointeur exploration->position= 0; exploration->text= text; return exploration; @@ -57,6 +58,7 @@ struct Node }; + Node *mkNode(enum opcode type) { Node *node= calloc(1, sizeof(Node)); @@ -79,6 +81,7 @@ Node *mkAnd(Node *node1, Node *node2) return node; } + Node *mkStar(Node *child) { Node *node= mkNode(STAR); @@ -86,6 +89,13 @@ Node *mkStar(Node *child) return node; } +Node *mkPlus(Node *child) +{ + Node *node= mkNode(PLUS); + node->children[0]= child; + return node; +} + int execute(Node *node, Exploration *in) { @@ -116,8 +126,25 @@ int execute(Node *node, Exploration *in) } } case STAR: { - //TODO - return 0; + if(execute(node->children[0], in) == 1){ + execute(node->children[0], in); + } + else return 1; + } + case PLUS: { + if(execute(node->children[0],in)==0){ + return 0; + } + else{ + while(execute(node->children[0], in) == 1){ + + execute(node->children[0], in); + + } + return 1; + + } + } } printf("this cannot happen\n"); @@ -136,15 +163,21 @@ int main(int argc, char **argv) mkAnd(mkString("aab"), mkString("bcc"));*/ - Node *program= + /*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")));*/ + mkString("cc")));*/ + + /* Node *program= + mkAnd( mkString("aabbcc"), + mkAnd(mkStar(mkString("c")), // "a"*"b"*"c"* + mkAnd(mkStar(mkString("b")), + mkStar(mkString("c"))))); +*/ + Node *program= + mkAnd(mkPlus(mkString("a")), // "a"*"b"*"c"* + mkAnd(mkPlus(mkString("b")), + mkPlus(mkString("c")))); if (execute(program, in)<=0) {