Iterating over a DEPEND expression

There are two ways of iterating over a dependency-style expression:

  • A shallow iteration over all top-level nodes via the DependExpr.nodes member.

  • A deep iteration over all nodes via the DependExpr object itself.

>>> expr = pms_utils.depend.DependExpr('''
...     foo/bar1
...     use1? (
...         foo/bar2
...     )
...     || (
...         foo/bar3
...         foo/bar4
...     )
...     (
...         foo/bar5
...     )
...     ''')
>>> for elem in expr.nodes:
...     if isinstance(elem, pms_utils.atom.Atom):
...         print(f"top-level atom {elem}")
...     else:
...         print(f"sub-expression of size {len(elem.nodes)} with conditional {elem.conditional}")
top-level atom foo/bar1
sub-expression of size 1 with conditional use1?
sub-expression of size 2 with conditional ||
sub-expression of size 1 with conditional None
>>> for elem in expr:
...     print(type(elem))
<class 'pms_utils.atom.Atom'>
<class 'pms_utils.depend.DependExpr'>
<class 'pms_utils.atom.Atom'>
<class 'pms_utils.depend.DependExpr'>
<class 'pms_utils.atom.Atom'>
<class 'pms_utils.atom.Atom'>
<class 'pms_utils.depend.DependExpr'>
<class 'pms_utils.atom.Atom'>