This is a simple integer expression interpreter.
1
2
3
4
5
6
7 char look;
8 std::map<std::string, int> table;
9
10 void getChar() {
11 look = std::cin.get();
12 }
13
14 void error(const std::string &s) {
15 std::cout << std::endl;
16 std::cout << "Error: " << s << "." << std::endl;
17 }
18
19 void abort(const std::string &s) {
20 error(s);
21 exit(1);
22 }
23
24 void expected(const std::string &s) {
25 abort(s + " Expected");
26 }
27
28 bool isAlpha(char c) {
29 return isalpha(c);
30 }
31
32 bool isDigit(char c) {
33 return isdigit(c);
34 }
35
36 bool isAlNum(char c) {
37 return isalnum(c);
38 }
39
40 bool isAddop(char c) {
41 return ((c == '+') || (c == '-'));
42 }
43
44 bool isMulop(char c) {
45 return (('*' == c) || ('/' == c));
46 }
47
48 bool isWhite(char c) {
49 return ((' ' == c) || ('\t' == c));
50 }
51
52 void skipWhite() {
53 while (isWhite(look))
54 getChar();
55 }
56
57 void match(char x) {
58 if (look != x)
59 expected(std::string("\"") + x + "\"");
60 else {
61 getChar();
62 skipWhite();
63 }
64 }
65
66 void emit(const std::string &s) {
67 std::cout << "\t" << s;
68 }
69
70 void emitLn(const std::string &s) {
71 emit(s);
72 std::cout << std::endl;
73 }
74
75 void newLine() {
76 if (look == '\n')
77 getChar();
78 }
79
80 std::string getName() {
81 if (!isAlpha(look))
82 expected("Name");
83
84 std::string name;
85 while (isAlNum(look)) {
86 name += look;
87 getChar();
88 }
89 skipWhite();
90
91 return name;
92 }
93
94 int getNum() {
95 int value(0);
96
97 if (!isDigit(look))
98 expected("Integer");
99
100 while (isDigit(look)) {
101 value = value * 10 + look - '0';
102 getChar();
103 }
104 skipWhite();
105
106 return value;
107 }
108
109 int expression();
110
111 int factor() {
112 int ret;
113
114 if (look == '(') {
115 match('(');
116 ret = expression();
117 match(')');
118 } else if (isAlpha(look)) {
119 std::string name = getName();
120 if (table.count(name) == 0)
121 table.insert(std::pair<std::string, int>(name, 0));
122 ret = table[name];
123 } else
124 ret = getNum();
125
126 return ret;
127 }
128
129 int term() {
130 int value = factor();
131
132 while (isMulop(look)) {
133 if (look == '*') {
134 match('*');
135 value *= factor();
136 } else if (look == '/') {
137 match('/');
138 value /= factor();
139 }
140 }
141
142 return value;
143 }
144
145 int expression() {
146 int value(0);
147
148 if (!isAddop(look))
149 value = term();
150
151 while (isAddop(look)) {
152 if (look == '+') {
153 match('+');
154 value += term();
155 } else if (look == '-') {
156 match('-');
157 value -= term();
158 }
159 }
160
161 return value;
162 }
163
164 void assignment() {
165 std::string name = getName();
166 match('=');
167 if (table.count(name) == 1)
168 table[name] = expression();
169 else
170 table.insert(std::pair<std::string, int>(name, expression()));
171
172 std::cout << name << " = " << table[name] << std::endl;
173 }
174
175 void init() {
176 getChar();
177 skipWhite();
178 }
179
180 int main(int argc, char *argv[]) {
181 init();
182
183 do {
184 assignment();
185 newLine();
186 } while ((look != '.') && (look != '\n'));
187
188 return 0;
189 }