-
Notifications
You must be signed in to change notification settings - Fork 0
/
pcalc.c
69 lines (65 loc) · 1.86 KB
/
pcalc.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/* Implementation of a calculator in prefix notation */
#include <stdio.h>
#include <assert.h>
#include "lexer.h"
#include "list.h"
void parse_exp(list l, int *v) {
token current = next(v);
int v1 = 0, v2 =0;
switch (current) {
case INT:
break;
case VAR:
if (*v <= length(l)){
*v = pick(l, *v);}
else{ unexpected(current, *v, "exp");} //pour récupérer l'élément indiqué par #*v
break;
case PLUS:
//il faut lire deux expressions après un opérateur
parse_exp(l,&v1);
parse_exp(l,&v2);
*v = v1 + v2;
break;
case MULT:
//il faut lire deux expressions après un opérateur
parse_exp(l,&v1);
parse_exp(l,&v2);
*v = v1 * v2;
break;
case DIV:
//il faut lire deux expressions après un opérateur
parse_exp(l,&v1);
parse_exp(l,&v2);
*v = v1/ v2;
break;
case MINUS:
//il faut lire deux expressions après un opérateur
parse_exp(l,&v1);
parse_exp(l,&v2);
*v = v1 - v2;
break;
default:
unexpected(current, *v, "exp");
}
}
void parse_input(list l) {
int v;
/* A CORRIGER: on reconnaît juste une expression (sans '?' devant) */ //corrigé :)
token current = next(&v);
while(current != END){
assert(current == QUEST);
parse_exp(l, &v);
append(l, v);
current = next(&v);
}// L'affichage est fait dans "append" (cf. commentaires dans "list.h")
}
int main() {
printf("// Mini-calculator.\n//\n") ;
printf("// Enter below a sequence of integer computations (using prefix notation).\n");
printf("// Each computation must start with '?'.\n") ;
printf("// Type Ctrl-D to quit.\n") ;
parse_input(empty());
/* Ligne suivante à garder, pour vérifier qu'on sort proprement */
printf("// End of Input: Bye !\n") ;
return 0;
}