annotate s-calc.c @ 27:c4e2ca100ab9 default tip

llvm worked
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 25 Oct 2024 17:10:11 +0900
parents 6bf66c125dbc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
1 /*
6bf66c125dbc Initial revision
kono
parents:
diff changeset
2 Very Simple Calculator
6bf66c125dbc Initial revision
kono
parents:
diff changeset
3 $Id$
6bf66c125dbc Initial revision
kono
parents:
diff changeset
4 */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
5
6bf66c125dbc Initial revision
kono
parents:
diff changeset
6 #include "s-compile.h"
6bf66c125dbc Initial revision
kono
parents:
diff changeset
7
6bf66c125dbc Initial revision
kono
parents:
diff changeset
8 int variable[48];
6bf66c125dbc Initial revision
kono
parents:
diff changeset
9
6bf66c125dbc Initial revision
kono
parents:
diff changeset
10 static int expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
11 static int aexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
12 static int mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
13 static int term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
14
6bf66c125dbc Initial revision
kono
parents:
diff changeset
15
6bf66c125dbc Initial revision
kono
parents:
diff changeset
16 static int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
17 expr()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
18 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
19 int d,assign;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
20
6bf66c125dbc Initial revision
kono
parents:
diff changeset
21 d = aexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
22 assign = lvalue;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
23 while(last_token!=EOF) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
24 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
25 case '>':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
26 d = (d > aexpr());
6bf66c125dbc Initial revision
kono
parents:
diff changeset
27 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
28 case '=':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
29 if(assign>=0) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
30 d = expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
31 variable[assign] = d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
32 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
33 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
34 error("Bad assignment");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
35 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
36 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
37 case ')':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
38 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
39 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
40 error("Bad expression");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
41 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
42 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
43 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
44 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
45 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
46
6bf66c125dbc Initial revision
kono
parents:
diff changeset
47 static int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
48 aexpr()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
49 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
50 int d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
51
6bf66c125dbc Initial revision
kono
parents:
diff changeset
52 d = mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
53 while(last_token!=EOF) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
54 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
55 case '-':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
56 d -= mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
57 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
58 case '+':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
59 d += mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
60 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
61 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
62 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
63 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
64 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
65 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
66 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
67
6bf66c125dbc Initial revision
kono
parents:
diff changeset
68 static int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
69 mexpr()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
70 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
71 int d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
72
6bf66c125dbc Initial revision
kono
parents:
diff changeset
73 d = term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
74 while(last_token!=EOF) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
75 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
76 case '*':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
77 d *= term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
78 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
79 case '/':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
80 d /= term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
81 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
82 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
83 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
84 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
85 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
86 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
87 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
88
6bf66c125dbc Initial revision
kono
parents:
diff changeset
89 static int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
90 term()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
91 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
92 int d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
93
6bf66c125dbc Initial revision
kono
parents:
diff changeset
94 lvalue= -1;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
95 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
96 if(last_token==EOF) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
97 error("Term expected");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
98 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
99 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
100 case '0':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
101 d = value;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
102 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
103 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
104 case 'v':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
105 d = lvalue = value;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
106 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
107 return variable[d];
6bf66c125dbc Initial revision
kono
parents:
diff changeset
108 case '(':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
109 d = expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
110 if(last_token != ')') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
111 error("Unbalanced parenthsis");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
112 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
113 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
114 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
115 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
116 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
117 error("Unknown term");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
118 return 0;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
119 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
120 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
121
6bf66c125dbc Initial revision
kono
parents:
diff changeset
122 int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
123 main()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
124 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
125 int d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
126 char buf[BUFSIZ];
6bf66c125dbc Initial revision
kono
parents:
diff changeset
127
6bf66c125dbc Initial revision
kono
parents:
diff changeset
128 while (fgets(buf,BUFSIZ,stdin)) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
129 ptr = buf;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
130 d = expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
131 printf("%s = 0x%08x = %d\n",buf,d,d);
6bf66c125dbc Initial revision
kono
parents:
diff changeset
132 fflush(stdout);
6bf66c125dbc Initial revision
kono
parents:
diff changeset
133 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
134 return 0;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
135 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
136
6bf66c125dbc Initial revision
kono
parents:
diff changeset
137 /* end */