A {@link de.uka.ilkd.key.java.ProgramElement} is a {@link de.uka.ilkd.key.java.SourceElement} and a {@link de.uka.ilkd.key.ModelElement}. It is aware of its parent in the syntax tree, while a pure {@link de.uka.ilkd.key.java.SourceElement} is not considered as a member of the AST even though it is represented in the sources.
{@link de.uka.ilkd.key.java.ProgramElement}s are further classified into {@link de.uka.ilkd.key.java.TerminalProgramElement}s and {@link de.uka.ilkd.key.java.NonTerminalProgramElement}s. While {@link de.uka.ilkd.key.java.TerminalProgramElement} is just a tag class, {@link de.uka.ilkd.key.java.NonTerminalProgramElement}s know their AST children (while it is possible that they do not have any). A complete source file occurs as a {@link de.uka.ilkd.key.java.CompilationUnit}.
{@link de.uka.ilkd.key.java.JavaSourceElement} and {@link de.uka.ilkd.key.java.JavaProgramElement} are abstract classes defining standard implementations that already know their {@link de.uka.ilkd.key.java.JavaProgramFactory}.
Concrete classes and further abstractions are bundled in the {@link de.uka.ilkd.key.java.expression} and {@link de.uka.ilkd.key.java.statement} packages.
These are {@link de.uka.ilkd.key.java.declaration.TypeDeclarationContainer}, {@link de.uka.ilkd.key.java.ExpressionContainer}, {@link de.uka.ilkd.key.java.StatementContainer}, {@link de.uka.ilkd.key.java.ParameterContainer}, {@link de.uka.ilkd.key.java.NamedProgramElement} and {@link de.uka.ilkd.key.java.reference.TypeReferenceContainer}. A An {@link de.uka.ilkd.key.java.ExpressionContainer} contains {@link de.uka.ilkd.key.java.Expression}s, a {@link de.uka.ilkd.key.java.StatementContainer} contains {@link de.uka.ilkd.key.java.Statement}s, a {@link de.uka.ilkd.key.java.ParameterContainer} (either a {@link de.uka.ilkd.key.java.declaration.MethodDeclaration} or a {@link de.uka.ilkd.key.java.statement.Catch} statement) contains {@link de.uka.ilkd.key.java.declaration.ParameterDeclaration}s. A {@link de.uka.ilkd.key.java.NamedProgramElement} is a subtype of {@link de.uka.ilkd.key.java.NamedModelElement}. A {@link de.uka.ilkd.key.java.reference.TypeReferenceContainer} contains one or several names, but these are names of types that are referred to explicitely by a {@link de.uka.ilkd.key.java.reference.TypeReference}.