| 1425 | } |
| 1426 | |
| 1427 | vector<Transform> parse(string_view buf) { |
| 1428 | vector<Transform> ret; |
| 1429 | |
| 1430 | yylex_init(buf); |
| 1431 | |
| 1432 | while (!tokenizer.empty()) { |
| 1433 | auto &t = ret.emplace_back(); |
| 1434 | sym_num = struct_num = 0; |
| 1435 | parse_src = true; |
| 1436 | |
| 1437 | parse_name(t); |
| 1438 | parse_pre(t); |
| 1439 | parse_fn(t.src); |
| 1440 | parse_arrow(); |
| 1441 | |
| 1442 | // copy inputs from src to target |
| 1443 | decltype(identifiers) identifiers_tgt; |
| 1444 | for (auto &val : t.src.getInputs()) { |
| 1445 | auto &name = val.getName(); |
| 1446 | if (dynamic_cast<const Input*>(&val)) { |
| 1447 | auto input = make_unique<Input>(val.getType(), string(name)); |
| 1448 | identifiers_tgt.emplace(name, input.get()); |
| 1449 | t.tgt.addInput(std::move(input)); |
| 1450 | } else { |
| 1451 | assert(dynamic_cast<const ConstantInput*>(&val)); |
| 1452 | auto input = make_unique<ConstantInput>(val.getType(), string(name)); |
| 1453 | identifiers_tgt.emplace(name, input.get()); |
| 1454 | t.tgt.addInput(std::move(input)); |
| 1455 | } |
| 1456 | } |
| 1457 | identifiers_src = std::move(identifiers); |
| 1458 | identifiers = std::move(identifiers_tgt); |
| 1459 | |
| 1460 | parse_src = false; |
| 1461 | parse_fn(t.tgt); |
| 1462 | |
| 1463 | // copy any missing instruction in tgt from src |
| 1464 | for (auto &[name, val] : identifiers_src) { |
| 1465 | get_or_copy_instr(name); |
| 1466 | } |
| 1467 | |
| 1468 | identifiers.clear(); |
| 1469 | identifiers_src.clear(); |
| 1470 | } |
| 1471 | |
| 1472 | return ret; |
| 1473 | } |
| 1474 | |
| 1475 | |
| 1476 | parser_initializer::parser_initializer() { |
no test coverage detected