Fin du readme

This commit is contained in:
Yohann D'ANELLO
2020-05-17 18:24:19 +02:00
parent 45723682bf
commit d8df43acf3
3 changed files with 71 additions and 13 deletions

View File

@ -108,6 +108,8 @@ expr* make_expr (int type, int class, var *var, expr *left, expr *right)
expr *e = malloc(sizeof(expr));
e->type = type;
e->class = class;
if (var != NULL)
e->class = var->class;
e->var = var;
e->left = left;
e->right = right;
@ -230,28 +232,28 @@ int eval (expr *e)
case FALSE: return 0;
case XOR: {
if (e->left->class != 0 || e->right->class != 0) {
yyerror("An expression has wrong types");
yyerror("A xor expression has wrong types");
exit(-1);
}
return eval(e->left) ^ eval(e->right);
}
case OR: {
if (e->left->class != 0 || e->right != NULL && e->right->class != 0) {
yyerror("An expression has wrong types");
yyerror("An or expression has wrong types");
exit(-1);
}
return eval(e->left) || eval(e->right);
}
case AND: {
if (e->left->class != 0 || e->right->class != 0) {
yyerror("An expression has wrong types");
yyerror("An and expression has wrong types");
exit(-1);
}
return eval(e->left) && eval(e->right);
}
case EQUIV: {
if (e->left->class != 0 || e->right->class != 0) {
yyerror("An expression has wrong types");
yyerror("An equivalence expression has wrong types");
exit(-1);
}
int right = eval(e->right);
@ -261,28 +263,28 @@ int eval (expr *e)
}
case NOT: {
if (e->left->class != 0) {
yyerror("An expression has wrong types");
yyerror("A not expression has wrong types");
exit(-1);
}
return !eval(e->left);
}
case PLUS: {
if (e->left->class != 1 || e->right->class != 1) {
yyerror("An expression has wrong types");
yyerror("A plus expression has wrong types");
exit(-1);
}
return eval(e->left) + eval(e->right);
}
case TIMES: {
if (e->left->class != 1 || e->right->class != 1) {
yyerror("An expression has wrong types");
yyerror("A times expression has wrong types");
exit(-1);
}
return eval(e->left) * eval(e->right);
}
case EQUALS: {
if (e->left->class != 1 || e->right->class != 1) {
yyerror("An expression has wrong types");
yyerror("An equality expression has wrong types");
exit(-1);
}
@ -291,7 +293,7 @@ int eval (expr *e)
}
case LT: {
if (e->left->class != 1 || e->right->class != 1) {
yyerror("An expression has wrong types");
yyerror("A comparison expression has wrong types");
exit(-1);
}
return eval(e->left) < eval(e->right) ? 1 : 0;
@ -332,15 +334,26 @@ void execute (stmt *s)
execute(s->left);
execute(s->right);
break;
case WHILE:
case WHILE: {
if (s->expr->class != 0 && s->expr->class != 2) {
yyerror("A while condition must be a boolean expression");
exit(-1);
}
while (eval(s->expr)) execute(s->left);
break;
case IF:
}
case IF: {
if (s->expr->class != 0 && s->expr->class != 2) {
yyerror("An if condition must be a boolean expression");
exit(-1);
}
if (eval(s->expr))
execute(s->left);
else if (s->right != NULL)
execute(s->right);
break;
}
case PRINT:
print_vars(s->list);
puts("");