annotate s-calc-r.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 06763fed18e4
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 */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
4
6bf66c125dbc Initial revision
kono
parents:
diff changeset
5 #include <stdio.h>
6bf66c125dbc Initial revision
kono
parents:
diff changeset
6
6bf66c125dbc Initial revision
kono
parents:
diff changeset
7 static char *ptr,*last_ptr;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
8 static int value,lvalue;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
9 static int last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
10 static int variable[48];
6bf66c125dbc Initial revision
kono
parents:
diff changeset
11
6bf66c125dbc Initial revision
kono
parents:
diff changeset
12 static int expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
13 static int aexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
14 static int mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
15 static int term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
16 static int token();
11
kono
parents: 0
diff changeset
17 static void error(char *);
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
18
6bf66c125dbc Initial revision
kono
parents:
diff changeset
19
6bf66c125dbc Initial revision
kono
parents:
diff changeset
20 static int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
21 token()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
22 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
23 int c,d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
24
6bf66c125dbc Initial revision
kono
parents:
diff changeset
25 last_ptr = ptr; /* for error position */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
26 c= *ptr;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
27 if(!c) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
28 last_token = EOF;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
29 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
30 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
31 ptr++;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
32 if (c<=' ') { /* comment */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
33 while(*ptr++);
6bf66c125dbc Initial revision
kono
parents:
diff changeset
34 ptr--;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
35 last_token = EOF;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
36 last_ptr = ptr;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
37 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
38 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
39 if('0'<=c && c<='9') { /* Decimal */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
40 d = c-'0';
15
8741552a4e4b register base intel64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
41 while((c= *ptr++)) {
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
42 if('0'<=c && c<='9') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
43 d = d*10 + (c - '0');
6bf66c125dbc Initial revision
kono
parents:
diff changeset
44 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
45 break;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
46 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
47 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
48 c && ptr--;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
49 value = d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
50 last_token = '0';
6bf66c125dbc Initial revision
kono
parents:
diff changeset
51 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
52 } else if ('a'<=c && c<='z') { /* variable */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
53 value = c-'a'; /* return variable reference */
6bf66c125dbc Initial revision
kono
parents:
diff changeset
54 last_token = 'v';
6bf66c125dbc Initial revision
kono
parents:
diff changeset
55 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
56 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
57 last_token = c;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
58 return last_token;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
59 return c;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
60 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
61 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
62
6bf66c125dbc Initial revision
kono
parents:
diff changeset
63 static int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
64 expr()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
65 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
66 int d,assign;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
67
6bf66c125dbc Initial revision
kono
parents:
diff changeset
68 d = aexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
69 assign = lvalue;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
70 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
71 case '>':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
72 d = (d > aexpr());
6bf66c125dbc Initial revision
kono
parents:
diff changeset
73 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
74 case '=':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
75 if(assign>=0) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
76 d = expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
77 variable[assign] = d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
78 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
79 } else {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
80 error("Bad assignment");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
81 return 0;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
82 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
83 case ')':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
84 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
85 case EOF:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
86 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
87 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
88 error("Bad expression");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
89 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
90 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
91 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
92
6bf66c125dbc Initial revision
kono
parents:
diff changeset
93 static int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
94 aexpr()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
95 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
96 int d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
97
6bf66c125dbc Initial revision
kono
parents:
diff changeset
98 d = mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
99 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
100 case '-':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
101 d -= aexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
102 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
103 case '+':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
104 d += aexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
105 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
106 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
107 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
108 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
109 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
110
6bf66c125dbc Initial revision
kono
parents:
diff changeset
111 static int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
112 mexpr()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
113 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
114 int d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
115
6bf66c125dbc Initial revision
kono
parents:
diff changeset
116 d = term();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
117 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
118 case '*':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
119 d *= mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
120 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
121 case '/':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
122 d /= mexpr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
123 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
124 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
125 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
126 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
127 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
128
6bf66c125dbc Initial revision
kono
parents:
diff changeset
129 static int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
130 term()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
131 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
132 int d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
133
6bf66c125dbc Initial revision
kono
parents:
diff changeset
134 lvalue= -1;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
135 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
136 if(last_token==EOF) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
137 error("Term expected");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
138 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
139 switch(last_token) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
140 case '0':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
141 d = value;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
142 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
143 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
144 case 'v':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
145 d = lvalue = value;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
146 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
147 return variable[d];
6bf66c125dbc Initial revision
kono
parents:
diff changeset
148 case '(':
6bf66c125dbc Initial revision
kono
parents:
diff changeset
149 d = expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
150 if(last_token != ')') {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
151 error("Unbalanced parenthsis");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
152 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
153 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
154 return d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
155 default:
6bf66c125dbc Initial revision
kono
parents:
diff changeset
156 token();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
157 error("Unknown term");
6bf66c125dbc Initial revision
kono
parents:
diff changeset
158 return 0;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
159 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
160 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
161
11
kono
parents: 0
diff changeset
162 static int lineno = 0;
kono
parents: 0
diff changeset
163
kono
parents: 0
diff changeset
164 void
kono
parents: 0
diff changeset
165 error(char *msg)
kono
parents: 0
diff changeset
166 {
kono
parents: 0
diff changeset
167 fprintf(stderr,"%s on line %d\n",msg, lineno);
kono
parents: 0
diff changeset
168 }
kono
parents: 0
diff changeset
169
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
170 int
6bf66c125dbc Initial revision
kono
parents:
diff changeset
171 main()
6bf66c125dbc Initial revision
kono
parents:
diff changeset
172 {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
173 int d;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
174 char buf[BUFSIZ];
6bf66c125dbc Initial revision
kono
parents:
diff changeset
175
6bf66c125dbc Initial revision
kono
parents:
diff changeset
176 while (fgets(buf,BUFSIZ,stdin)) {
6bf66c125dbc Initial revision
kono
parents:
diff changeset
177 ptr = buf;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
178 d = expr();
6bf66c125dbc Initial revision
kono
parents:
diff changeset
179 printf("%s = 0x%08x = %d\n",buf,d,d);
6bf66c125dbc Initial revision
kono
parents:
diff changeset
180 fflush(stdout);
11
kono
parents: 0
diff changeset
181 lineno++;
0
6bf66c125dbc Initial revision
kono
parents:
diff changeset
182 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
183 return 0;
6bf66c125dbc Initial revision
kono
parents:
diff changeset
184 }
6bf66c125dbc Initial revision
kono
parents:
diff changeset
185
6bf66c125dbc Initial revision
kono
parents:
diff changeset
186 /* end */