Abstract syntax of Yul.
We introduce an abstract syntax of Yul based on its concrete syntax; more precisely, on the new grammar (see description there).
The abstract syntax defined here is fairly close to the concrete syntax. The reason for this closeness is to reduce incidental differences between the code before and after a transformation, to facilitate inspection and debugging. (Although our formalization of Yul stands on its own, a major motivation for it is to formalize and verify Yul transformations.) In some cases our abstract syntax may be broader than the concrete syntax, to keep the definition of the abstract syntax slightly simpler; the important thing is that all the concrete syntax is representable in abstract syntax.
It is not yet clear whether the proper handling of Yul dialects will require extending this abstract syntax with types (which are not present in the new grammar). For now we omit types, but we may revisit this at some point.