From f035f7d33c7fe6460a96b2e391194c2e6a9a792d Mon Sep 17 00:00:00 2001 From: Vank143 <78201359+Vank143@users.noreply.github.com> Date: Wed, 16 Jun 2021 17:21:32 +0200 Subject: [PATCH] Create lexer --- lexer | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 lexer diff --git a/lexer b/lexer new file mode 100644 index 0000000..92dc1f2 --- /dev/null +++ b/lexer @@ -0,0 +1,160 @@ +#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; +}