+
+base_type
+ = {primitive:} primitive_base_type
+ | {class:} full_class_name
+ | {extends:} generic_identifier 'extends' type_bound
+ | {super:} generic_identifier 'super' type_bound
+ | {wildcard:} wildcard
+ | {void:} 'void';
+
+primitive_base_type = 'boolean'|'byte'|'char'|'short'|'int'|'float'|'long'|'double';
+
+type_bound
+ = {tail:} type_bound '&' full_class_name
+ | {head:} full_class_name;
+
+generic_identifier
+ = {class:} full_class_name
+ | {wildcard:} wildcard;
+
+class_name = identifier generic_parameters?;
+
+full_class_name
+ = {tail:} full_class_name separator class_name
+ | {head:} class_name;
+
+generic_parameters = '<' types '>';