MCPcopy Create free account
hub / github.com/covscript/covscript / build_tree

Method build_tree

sources/compiler/parser.cpp:244–298  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

242 }
243
244 void compiler_type::build_tree(tree_type<token_base *> &tree, std::deque<token_base *> &signals,
245 std::deque<token_base *> &objects)
246 {
247 if (objects.empty() || signals.empty() || objects.size() != signals.size() + 1)
248 throw compile_error("Unexpected grammar when building expression tree.");
249 for (auto &obj : objects) {
250 if (obj != nullptr && obj->get_type() == token_types::sblist) {
251 auto *sbl = static_cast<token_sblist *>(obj);
252 std::deque<token_base *> tokens;
253 for (auto &list : sbl->get_list()) {
254 for (auto &it : list)
255 tokens.push_back(it);
256 tokens.push_back(new token_signal(signal_types::com_));
257 }
258 tokens.pop_back();
259 tree_type<token_base *> t;
260 gen_tree(t, tokens);
261 obj = new token_expr(t);
262 }
263 }
264 tree.clear();
265 tree.emplace_root_left(tree.root(), signals.front());
266 tree.emplace_left_left(tree.root(), objects.front());
267 for (std::size_t i = 1; i < signals.size(); ++i) {
268 for (typename tree_type<token_base *>::iterator it = tree.root(); it.usable(); it = it.right()) {
269 if (!it.right().usable()) {
270 tree.emplace_right_right(it, objects.at(i));
271 break;
272 }
273 }
274 for (typename tree_type<token_base *>::iterator it = tree.root(); it.usable(); it = it.right()) {
275 if (!it.right().usable()) {
276 tree.emplace_root_left(it, signals.at(i));
277 break;
278 }
279 if (get_signal_level(it.data()) == get_signal_level(signals.at(i))) {
280 if (is_left_associative(it.data()))
281 tree.emplace_right_left(it, signals.at(i));
282 else
283 tree.emplace_root_left(it, signals.at(i));
284 break;
285 }
286 if (get_signal_level(it.data()) > get_signal_level(signals.at(i))) {
287 tree.emplace_root_left(it, signals.at(i));
288 break;
289 }
290 }
291 }
292 for (typename tree_type<token_base *>::iterator it = tree.root(); it.usable(); it = it.right()) {
293 if (!it.right().usable()) {
294 tree.emplace_right_right(it, objects.back());
295 break;
296 }
297 }
298 }
299
300 void compiler_type::gen_tree(tree_type<token_base *> &tree, std::deque<token_base *> &raw)
301 {

Callers

nothing calls this directly

Calls 13

compile_errorClass · 0.85
sizeMethod · 0.80
emplace_root_leftMethod · 0.80
emplace_left_leftMethod · 0.80
rightMethod · 0.80
emplace_right_rightMethod · 0.80
dataMethod · 0.80
emplace_right_leftMethod · 0.80
emptyMethod · 0.45
get_typeMethod · 0.45
clearMethod · 0.45
rootMethod · 0.45

Tested by

no test coverage detected