Beispiel #1
0
 def _parse_unit(self, unit: Unit) -> None:
     make_opt: bool = unit.min == 0
     # ? The optional arm is handling 0, so other arm is set 1
     unit.min = 1 if unit.min == 0 else unit.min
     make_var: bool = unit.max != 1
     optionals: list = []
     for parent in self.parents:
         new_node = addict({"key": unit.atts})
         if make_var:
             ln = 1
             var_key: int = make_key([[new_node]])
             if var_key not in self.vars:
                 new_var = new_node
                 new_var.vars = [addict({"DEF": var_key, "LENGTH": ln})]
                 new_var.data._.var_end = True
                 self.vars[var_key] = [[new_var]]
             new_node = addict({
                 "vars": [{
                     "REF": var_key,
                     "LENGTH": ln,
                     "MIN": unit.min,
                     "MAX": unit.max,
                 }]
             })
         if make_opt:
             optionals.append(deepcopy(parent))
         parent.append(new_node)
         if unit.label:
             self._parse_labeled_element(unit.label, parent)
     self.parents.extend(optionals)
Beispiel #2
0
 def _add_var(self, children: list, length: int, min_: int,
              max_: int) -> Any:
     var_key: int = make_key(children)
     if var_key not in self.vars:
         self.vars[var_key] = []
         for var_part in children:
             new_var = deepcopy(var_part)
             if "vars" not in new_var[0]:
                 new_var[0].vars = []
             new_var[0].vars.insert(
                 0, addict({
                     "DEF": var_key,
                     "LENGTH": length
                 }))
             new_var[-1].data._.var_end = True
             self.vars[var_key].append(new_var)
         for p in self.vars[var_key]:
             # block_length is 1 by default and lists are already handled
             if len(p) == 1 or type(p[0]) == list:
                 continue
             p[0].data._.update(addict({"block_length": len(p)}))
     var = addict()
     var.vars = [
         addict({
             "REF": var_key,
             "LENGTH": length,
             "MIN": min_,
             "MAX": max_
         })
     ]
     return var
Beispiel #3
0
def test_node_make_set_key(test):
    set_attributes = test["set_attributes"]
    data = test["data"]
    assert make_key((set_attributes,
                     data)) == hash(FrozenMap.recurse((set_attributes, data)))