1
+ #include " OAT.h"
2
+ #include " Constants.h"
3
+
4
+ #include < cmath>
5
+ #include < string>
6
+ #include < vector>
7
+
8
+ using std::string;
9
+ using std::vector;
10
+ using IncludesVector = vector<string>;
11
+
12
+ namespace vars
13
+ {
14
+ static string def{ constants::DEFAULT };
15
+ static bool def_reference{ false };
16
+ static bool ipow_dec{ false };
17
+ static bool fpow_dec{ false };
18
+ static bool dpow_dec{ false };
19
+ static bool type_dec{ false };
20
+ }
21
+
22
+ string prefixCheck (string prefix = " " )
23
+ {
24
+ if (vars::def_reference) { return " " ; }
25
+ else { return prefix; }
26
+ }
27
+
28
+ // Variables
29
+ string OAT::dec (string var_name, string var_value) { return " auto " + var_name + " { " + var_value + " };\n " ; }
30
+ string OAT::dec (string var_name, string var_value, string type) { return type + " " + var_name + " { " + var_value + " };\n " ; }
31
+ string OAT::mov (string l_var, string r_var) { return " auto " + r_var + " { " + l_var + " };\n " ; }
32
+ string OAT::anydef (string var_name, bool reference)
33
+ {
34
+ vars::def = var_name;
35
+ vars::def_reference = reference;
36
+ return string (" " );
37
+ }
38
+ string OAT::conv (string var_name, string type) { return prefixCheck (type + " " ) + vars::def + " { static_cast<" + type + " >(" + var_name + " ) };\n " ; }
39
+ string OAT::iconv (string old_var, string new_var) { return " int " + new_var + " { std::stoi(" + old_var + " ) };\n " ; }
40
+ string OAT::fconv (string old_var, string new_var) { return " float " + new_var + " { strtof(" + old_var + " ) };\n " ; }
41
+ string OAT::dconv (string old_var, string new_var) { return " double " + new_var + " { atof(" + old_var + " .c_str()) };\n " ; }
42
+ string OAT::type (string var_name)
43
+ {
44
+ // Add
45
+ return " " ;
46
+ }
47
+ string OAT::round (string l_var, string r_var) { return " auto " + r_var + " { round(" + l_var + " ) };\n " ; }
48
+
49
+ // Math
50
+ string OAT::math (string l_var, string r_var, string mode, bool def)
51
+ {
52
+ if (mode == " pow" ) { return prefixCheck (" int " ) + vars::def + " = pow(" + l_var + " , " + r_var + " );\n " ; }
53
+ else if (mode == " rpow" ) { return l_var + " = pow(" + l_var + " , " + r_var + " );\n " ; }
54
+
55
+ if (def) { return prefixCheck (" auto " ) + vars::def + " {" + l_var + " " + mode + " " + r_var + " };\n " ; }
56
+ else { return l_var + " " + mode + " = " + r_var + " ;\n " ; }
57
+ }
58
+ string OAT::cat (string l_var, string r_var) { return l_var + " += " + " std::string(" + r_var + " );\n " ; }
59
+
60
+ string OAT::mathpow (string base, string exp, string mode) { return prefixCheck (" int " ) + vars::def + " = " + mode + " pow(" + base + " , " + exp + " );\n " ; } // mode == i, d, etc
61
+
62
+ // Input/Output
63
+ string OAT::io (string mode, string var)
64
+ {
65
+ if (mode == " out" ) { return " std::cout << " + var + " ;\n " ; }
66
+ else if (mode == " nlout" ) { return " std::cout << " + var + " << '\\ n';\n " ; }
67
+ else if (mode == " in" ) { return " std::string " + var + " {};\n " + constants::INDENTATION + " std::cin >> " + var + " ;\n " ; }
68
+ else if (mode == " input" )
69
+ {
70
+ if (vars::def_reference)
71
+ {
72
+ return " std::cout << " + var + " ;\n "
73
+ " " + constants::INDENTATION + " std::cin >> " + vars::def + " ;\n " ;
74
+ }
75
+ else
76
+ {
77
+ return " std::cout << " + var + " ;\n "
78
+ " std::string " + vars::def + " {};\n "
79
+ " " + constants::INDENTATION + " std::cin >> " + vars::def + " ;\n " ;
80
+ }
81
+ }
82
+ else if (mode == " defin" )
83
+ {
84
+ if (vars::def_reference)
85
+ {
86
+ return " std::cin >> " + vars::def + " ;\n " ;
87
+ }
88
+ else
89
+ {
90
+ return " std::string " + vars::def + " {};\n " + constants::INDENTATION + " std::cin >> " + vars::def + " ;\n " ;
91
+ }
92
+ }
93
+ else { return string (" " ); }
94
+ }
95
+
96
+ string OAT::assert (string l_var, string r_var, string mode, bool format)
97
+ {
98
+ if (format)
99
+ {
100
+ return " if (" + l_var + " " + mode + " " + r_var + " )"
101
+ " { std::cout << \" " + l_var + " " + mode + " " + r_var + " = true\\ n\" ; }\n "
102
+ " else { std::cout << \" " + l_var + " " + mode + " " + r_var + " = false\\ n\" ; }\n " ;
103
+ }
104
+ else
105
+ {
106
+ return " if (" + l_var + " " + mode + " " + r_var + " ) { std::cout << \" true\\ n\" ; }\n "
107
+ " else { std::cout << \" false\\ n\" ;\n " ;
108
+ }
109
+ } // mode == "==", <, >, etc
110
+
111
+ string OAT::cpp (string b, string c) { return " " + b + c + ' \n ' ; } // DANGEROUS
112
+
113
+ vector<string> getIncludes (string to_include)
114
+ {
115
+ if (to_include == " io" ) { return constants::IO_INCLUDES; }
116
+ else if (to_include == " conv" ) { return constants::CONV_INCLUDES; }
117
+ else if (to_include == " math" ) { return constants::MATH_INCLUDES; }
118
+ else if (to_include == " string" ) { return constants::STRING_INCLUDES; }
119
+ else if (to_include == " type" ) { return constants::TYPE_INCLUDES; }
120
+ else { return constants::NONE_INCLUDE; }
121
+ }
122
+
123
+ string OAT::process_c (string c)
124
+ {
125
+ // Removes " ;" and anything past it
126
+ string cut_c{ c.substr (0 , c.find (" ;" , 0 )) };
127
+
128
+ if (cut_c == " NEWLINE" ) { return constants::NEWLINE_CHARACTER; }
129
+ else if (cut_c == " SPACE" ) { return constants::SPACE; }
130
+ else if (cut_c == " TRUE" ) { return constants::TRUE ; }
131
+ else if (cut_c == " FALSE" ) { return constants::FALSE ; }
132
+ else if (cut_c == " NONE" ) { return constants::NONE; }
133
+ else { return cut_c; };
134
+ }
135
+
136
+ string OAT::process_line (string a, string b, string c, IncludesVector *include_vector)
137
+ {
138
+ if (a == " dec" ) { return OAT::dec (b, c); }
139
+ else if (a == " sdec" ) // string
140
+ {
141
+ // Push #include <string> into vector
142
+ include_vector->push_back (" #include <string>\n " );
143
+ return OAT::dec (b, c, " std::string" );
144
+ }
145
+ else if (a == " idec" ) { return OAT::dec (b, c, " int" ); } // int
146
+ else if (a == " cdec" ) { return OAT::dec (b, c, " char" ); } // char
147
+ else if (a == " fdec" ) { return OAT::dec (b, c, " float" ); } // float
148
+ else if (a == " ddec" ) { return OAT::dec (b, c, " double" ); } // double
149
+ else if (a == " bdec" ) { return OAT::dec (b, c, " bool" ); } // bool
150
+ else if (a == " cat" )
151
+ {
152
+ include_vector->push_back (" #include <string>\n " );
153
+ return OAT::cat (b, c);
154
+ }
155
+ else if (a == " mov" ) { return OAT::mov (b, c); }
156
+ else if (a == " def" ) { return OAT::anydef (b, false ); }
157
+ else if (a == " rdef" ) { return OAT::anydef (b, true ); }
158
+ else if (a == " conv" ) { return OAT::conv (b, c); }
159
+ else if (a == " iconv" )
160
+ {
161
+ include_vector->push_back (" #include <string>\n " );
162
+ return OAT::iconv (b, c);
163
+ }
164
+ else if (a == " fconv" )
165
+ {
166
+ include_vector->push_back (" #include <cstdlib>\n " );
167
+ return OAT::fconv (b, c);
168
+ }
169
+ else if (a == " dconv" )
170
+ {
171
+ include_vector->push_back (" #include <cstdlib>\n " );
172
+ return OAT::dconv (b, c);
173
+ }
174
+ else if (a == " add" ) { return OAT::math (b, c, " +" , false ); }
175
+ else if (a == " sub" ) { return OAT::math (b, c, " -" , false ); }
176
+ else if (a == " mul" ) { return OAT::math (b, c, " *" , false ); }
177
+ else if (a == " div" ) { return OAT::math (b, c, " /" , false ); }
178
+ else if (a == " mod" ) { return OAT::math (b, c, " %" , false ); }
179
+ else if (a == " pow" )
180
+ {
181
+ include_vector->push_back (" #include <cmath>\n " );
182
+ return OAT::math (b, c, " pow" , false );
183
+ }
184
+ else if (a == " rpow" )
185
+ {
186
+ include_vector->push_back (" #include <cmath>\n " );
187
+ return OAT::math (b, c, " rpow" , false );
188
+ }
189
+ else if (a == " defadd" ) { return OAT::math (b, c, " +" , true ); }
190
+ else if (a == " defsub" ) { return OAT::math (b, c, " -" , true ); }
191
+ else if (a == " defmul" ) { return OAT::math (b, c, " *" , true ); }
192
+ else if (a == " defdiv" ) { return OAT::math (b, c, " /" , true ); }
193
+ else if (a == " defmod" ) { return OAT::math (b, c, " %" , true ); }
194
+ else if (a == " defpow" )
195
+ {
196
+ include_vector->push_back (" #include <cmath>\n " );
197
+ return OAT::math (b, c, " pow" , true );
198
+ }
199
+ else if (a == " ipow" ) { return OAT::mathpow (b, c, " i" ); }
200
+ else if (a == " fpow" ) { return OAT::mathpow (b, c, " f" ); }
201
+ else if (a == " dpow" ) { return OAT::mathpow (b, c, " d" ); }
202
+ else if (a == " round" )
203
+ {
204
+ include_vector->push_back (" #include <cmath>\n " );
205
+ return OAT::round (b, c);
206
+ }
207
+ else if (a == " io" ) {
208
+ include_vector->push_back (" #include <iostream>\n " );
209
+ return OAT::io (b, c);
210
+ }
211
+ else if (a == " asserteq" ) { return OAT::assert (b, c, " ==" , false ); }
212
+ else if (a == " fasserteq" ) { return OAT::assert (b, c, " ==" , true ); }
213
+ else if (a == " assertlt" ) { return OAT::assert (b, c, " <" , false ); }
214
+ else if (a == " fassertlt" ) { return OAT::assert (b, c, " <" , true ); }
215
+ else if (a == " assertgt" ) { return OAT::assert (b, c, " >" , false ); }
216
+ else if (a == " fassertgt" ) { return OAT::assert (b, c, " >" , true ); }
217
+ else if (a == " assertgteq" ) { return OAT::assert (b, c, " >=" , false ); }
218
+ else if (a == " fassertgteq" ) { return OAT::assert (b, c, " >=" , true ); }
219
+ else if (a == " assertlteq" ) { return OAT::assert (b, c, " <=" , false ); }
220
+ else if (a == " fassertlteq" ) { return OAT::assert (b, c, " <=" , true ); }
221
+ else if (a == " cpp" ) { return OAT::cpp (b, c); }
222
+ else if (a == " include" )
223
+ {
224
+ vector<string> includes{ getIncludes (b) };
225
+ for (string include : includes) { include_vector->push_back (include); }
226
+ return string ();
227
+ }
228
+ else if (a == " type" || a == " ptype" || a == " fptype" )
229
+ {
230
+ vector<string> includes{ getIncludes (" type" ) };
231
+ for (string include : includes) { include_vector->push_back (include); }
232
+ if (a == " type" )
233
+ {
234
+ return prefixCheck (" auto " ) + vars::def + " { type_name<decltype(" + b + " )>() };\n " ;
235
+ }
236
+ else if (a == " ptype" )
237
+ {
238
+ include_vector->push_back (" #include <iostream>\n " );
239
+ return " std::cout << " + string () + " type_name<decltype(" + b + " )>() << '\\ n';\n " ;
240
+ }
241
+ else if (a == " fptype" )
242
+ {
243
+ include_vector->push_back (" #include <iostream>\n " );
244
+ return " std::cout << \" variable '" + b + " ' has type '\" << type_name<decltype(" + b + " )>() << \" '\\ n\" ;\n " ;
245
+ }
246
+ else { return " " ; }
247
+ }
248
+ else { return " " ; }
249
+ }
250
+
251
+ string OAT::declare_function (string function_name)
252
+ {
253
+ if (function_name == " ipow" && !(vars::ipow_dec))
254
+ {
255
+ vars::ipow_dec = true ;
256
+ return " int ipow(int base, int exp) { return exp == 0 ? 1 : base * ipow(base, exp - 1); }\n " ;
257
+ }
258
+ else if (function_name == " fpow" && !(vars::fpow_dec))
259
+ {
260
+ vars::fpow_dec = true ;
261
+ return " float fpow(float base, float exp) { return exp == 0 ? 1 : base * fpow(base, exp - 1); }\n " ;
262
+ }
263
+ else if (function_name == " dpow" && !(vars::dpow_dec))
264
+ {
265
+ vars::dpow_dec = true ;
266
+ return " double dpow(double base, double exp) { return exp == 0 ? 1 : base * dpow(base, exp - 1); }\n " ;
267
+ }
268
+ else if ((function_name == " type" || function_name == " ptype" || function_name == " fptype" ) && !(vars::type_dec))
269
+ {
270
+ vars::type_dec = true ;
271
+ return constants::TYPE_NAME; // Adds the template for type in source
272
+ }
273
+ else { return " " ; }
274
+ }
0 commit comments