From 9fefbe57df367d6777520f5e5d9d8716f744714f Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Sun, 17 May 2020 00:21:25 +0200 Subject: [PATCH] =?UTF-8?q?Support=20des=20=C3=A9galit=C3=A9s=20et=20des?= =?UTF-8?q?=20in=C3=A9galit=C3=A9s=20entre=20entiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- syntaxique/lang.y | 12 +++++++++++- syntaxique/langlex.l | 2 ++ syntaxique/test2.my | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/syntaxique/lang.y b/syntaxique/lang.y index b7da368..a3eb550 100644 --- a/syntaxique/lang.y +++ b/syntaxique/lang.y @@ -31,7 +31,7 @@ typedef struct varlist // variable reference (used for print statement) typedef struct expr // boolean expression { - int type; // TRUE, FALSE, OR, AND, EQUIV, NOT, 0 (variable), PLUS, TIMES, INT + int type; // TRUE, FALSE, OR, AND, EQUIV, NOT, 0 (variable), PLUS, TIMES, INT, EQUALS, LT var *var; struct expr *left, *right; } expr; @@ -71,6 +71,7 @@ var* find_ident (char *s) while (v && strcmp(v->name,s)) v = v->next; if (!v) { + // Check in int vars v = program_ints; while (v && strcmp(v->name, s)) v = v->next; @@ -158,6 +159,8 @@ stmt* make_stmt (int type, var *var, expr *expr, %left EQUIV %left PLUS %left TIMES +%left EQUALS +%left LT %% @@ -206,6 +209,8 @@ expr : IDENT { $$ = make_expr(0,find_ident($1),NULL,NULL); } | INT { $$ = make_expr(INT, make_int($1), NULL, NULL); } | expr TIMES expr { $$ = make_expr(TIMES, NULL, $1, $3); } | expr PLUS expr { $$ = make_expr(PLUS, NULL, $1, $3); } + | expr EQUALS expr { $$ = make_expr(EQUALS, NULL, $1, $3); } + | expr LT expr { $$ = make_expr(LT, NULL, $1, $3); } %% @@ -235,6 +240,11 @@ int eval (expr *e) return eval(e->left) + eval(e->right); case TIMES: return eval(e->left) * eval(e->right); + case EQUALS: + printf("%d, %d\n", eval(e->left), eval(e->right)); + return eval(e->left) == eval(e->right) ? 1 : 0; + case LT: + return eval(e->left) < eval(e->right) ? 1 : 0; case INT: case 0: return e->var->value; diff --git a/syntaxique/langlex.l b/syntaxique/langlex.l index 450a6fb..98050e9 100644 --- a/syntaxique/langlex.l +++ b/syntaxique/langlex.l @@ -26,6 +26,8 @@ DIG [0-9] "<=>" { return EQUIV; } "+" { return PLUS; } "*" { return TIMES; } +"==" { return EQUALS; } +"<" { return LT; } [a-z_][a-z0-9_]* { yylval.i = strdup(yytext); return IDENT; } diff --git a/syntaxique/test2.my b/syntaxique/test2.my index ed8eb0e..6a2460c 100644 --- a/syntaxique/test2.my +++ b/syntaxique/test2.my @@ -1,5 +1,5 @@ bool y; int x; x := 42 + 21; -y := true; +y := x == (7 * (5 + 4)); print x,y,x