%%%
%% Section 4.3: Reference Types and Values
%%
%% @author Martin Bravenboer <martin.bravenboer@gmail.com>
%%%
module languages/java-15/types/ReferenceTypes
imports
languages/java-15/lexical/Identifiers
languages/java-15/names/Main
languages/java-15/types/Main
languages/java-15/types/ParameterizedTypes
languages/java-15/types/TypeVariables
exports
sorts
RefType
ClassOrInterfaceType
ClassType
InterfaceType
TypeDecSpec
ArrayType
TypeVar
context-free syntax
ClassOrInterfaceType -> RefType
ArrayType -> RefType
%% This production rule is highly ambiguous, since every
%% TypeVar can be a ClassOrInterfaceType. A later disambiguation
%% phase has to find out if a ClassOrInterfaceType is in fact
%% a TypeVar.
%% TypeVar -> RefType {avoid}
context-free syntax
%% ClassType and InterfaceType are ambiguous. We modify the
%% production of ClassOrInterfaceType to make this ambiguity explicit.
TypeDecSpec TypeArgs? -> ClassOrInterfaceType {cons("ClassOrInterfaceType")}
TypeDecSpec TypeArgs? -> ClassType {cons("ClassType")}
TypeDecSpec TypeArgs? -> InterfaceType {cons("InterfaceType")}
TypeName -> TypeDecSpec
TypeDecSpec TypeArgs "." Id -> TypeDecSpec {cons("Member")}
context-free syntax
TypeVarId -> TypeVar {cons("TypeVar")}
context-free syntax
Type "[" "]" -> ArrayType {cons("ArrayType")}