Fin du readme
This commit is contained in:
@ -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("");
|
||||
|
Reference in New Issue
Block a user