Compilers often construct an abstract syntax tree (AST) for the semantic analysis.
Its nodes are programming language constructs and its edges express the
hierarchical relation between these constructs. From [Koschke 1998]: ``The
structure of an AST is a simplification of the underlying grammar of the
programming language, e.g., by generalization or by suppressing chain rules. (...)
This structure can be generalized so that it can be used to represent programs of
different languages.''