diff --git a/.gitignore b/.gitignore index c59f1ee..e128d3d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,7 @@ exclude-executables.sh lexical/example lexical/flux lexical/string +syntaxique/expr +syntaxique/lang *.c *.o diff --git a/syntaxique/lang.y b/syntaxique/lang.y index 9cef9f8..c6b9dfc 100644 --- a/syntaxique/lang.y +++ b/syntaxique/lang.y @@ -30,7 +30,7 @@ typedef struct varlist // variable reference (used for print statement) typedef struct expr // boolean expression { - int type; // TRUE, FALSE, OR, AND, NOT, 0 (variable) + int type; // TRUE, FALSE, OR, AND, EQUIV, NOT, 0 (variable) var *var; struct expr *left, *right; } expr; @@ -130,6 +130,7 @@ stmt* make_stmt (int type, var *var, expr *expr, %left OR XOR %left AND %right NOT +%left EQUIV %% @@ -158,6 +159,7 @@ expr : IDENT { $$ = make_expr(0,find_ident($1),NULL,NULL); } | expr XOR expr { $$ = make_expr(XOR,NULL,$1,$3); } | expr OR expr { $$ = make_expr(OR,NULL,$1,$3); } | expr AND expr { $$ = make_expr(AND,NULL,$1,$3); } + | expr EQUIV expr { $$ = make_expr(EQUIV,NULL,$1,$3); } | NOT expr { $$ = make_expr(NOT,NULL,$2,NULL); } | TRUE { $$ = make_expr(TRUE,NULL,NULL,NULL); } | FALSE { $$ = make_expr(FALSE,NULL,NULL,NULL); } @@ -179,6 +181,12 @@ int eval (expr *e) case XOR: return eval(e->left) ^ eval(e->right); case OR: return eval(e->left) || eval(e->right); case AND: return eval(e->left) && eval(e->right); + case EQUIV: { + int right = eval(e->right); + int left = eval(e->left); + return (right && left) || (!right && !left); // Équivalent avec left == right avec la définition. + // Toutefois, on privilégie cette forme car faux = 0 et vrai = tout entier non nul. + } case NOT: return !eval(e->left); case 0: return e->var->value; } diff --git a/syntaxique/langlex.l b/syntaxique/langlex.l index 3ba90bd..bcea3eb 100644 --- a/syntaxique/langlex.l +++ b/syntaxique/langlex.l @@ -13,10 +13,11 @@ DIG [0-9] "false" { return FALSE; } ":=" { return ASSIGN; } -"^" { return XOR; } +"^" { return XOR; } "||" { return OR; } "&&" { return AND; } -"!" { return NOT; } +"!" { return NOT; } +"<=>" { return EQUIV; } [a-z_][a-z0-9_]* { yylval.i = strdup(yytext); return IDENT; } diff --git a/syntaxique/test.my b/syntaxique/test.my new file mode 100644 index 0000000..0f41a24 --- /dev/null +++ b/syntaxique/test.my @@ -0,0 +1,21 @@ +bool x,y,z; + +x := true; +y := true; +z := x <=> y; +print x,y,z; + +x := true; +y := false; +z := x <=> y; +print x,y,z; + +x := false; +y := true; +z := x <=> y; +print x,y,z; + +x := false; +y := false; +z := x <=> y; +print x,y,z