Abstract syntax structures for the FeatherweightJava language. The parser, if successful, creates a syntax tree with a Program as the root. All objects of these classes are immutable--after the parser creates abstract syntax, it cannot be modified in place. The typechecker and evaluator do not require syntax tree rewriting and thus it is not supported.