[NAME]
ALL.dao.grammar.typename

[TITLE]
Type Name

[DESCRIPTION]

Drafting in progress.

 0.1   Special Types  

     
   1  NoneType       ::= [ 'dao' '::' ] 'none'
   2  AnyType        ::= [ 'dao' '::' ] 'any'
   3  VariantHolder  ::= TypeHolder '<' VariantType '>'
   4  SpecialType    ::= NoneType | AnyType | TypeHolder | VariantHolder
     


 0.2   Primitive Types  

     
   1  PrimitiveType ::= 'int' | 'float' | 'complex' | 'string'
     


 0.3   Enum Symbol Types  

     
   1  SymbolItem ::= Identifier [ '=' Integer ]
   2  
   3  SymbolType ::= 'enum' '<' [ SymbolItem { ',' SymbolItem } ] '>'
   4  FlagType   ::= 'enum' '<' [ SymbolItem { ';' SymbolItem } ] '>'
   5  BoolType   ::= 'enum' '<' [ SymbolItem  ':' SymbolItem ] '>'
   6  
   7  EnumSymbolType ::= 'enum' | SymbolType | FlagType | BoolType
     


 0.4   Array Type  

     
   1  ArrayNumType ::= 'int' | 'float' | 'complex'
   2  ArrayType ::= 'array' [ '<' ( ArrayNumType | TypeHolder ) '>' ]
     


 0.5   List Type  

     
   1  ListType ::= 'list' [ '<' Type '>' ]
     


 0.6   Map Type  

     
   1  MapType ::= 'map' [ '<' Type, Type '>' ]
     


 0.7   Tuple Type  

     
   1  TupleItemType ::= [ 'invar' ] [ Identifier ':' ] Type
   2  TupleType ::= 'tuple' [ '<' TupleItemType { ',' TupleItemType } '>' ]
     


 0.8   Routine Type  

     
   1  ParamTypeItem1 ::= [ 'invar' ] 'Identifier' [ ':' Type ]
   2  ParamTypeItem2 ::= [ 'invar' ] 'Identifier' [ '=' Type ]
   3  ParamTypeList1 ::= ParamTypeItem1 { ',' ParamTypeItem1 } { ',' ParamTypeItem2 } [ ',' '...' ]
   4  ParamTypeList2 ::= ParamTypeItem2 { ',' ParamTypeItem2 } [ ',' '...' ]
   5  ParamTypeList  ::= ParamTypeList1 | ParamTypeList2 | '...'
   6  
   7  ParamTypeItem3 ::= 'Identifier' ':' Type
   8  ParamTypeList3 ::= ParamTypeItem3 { ',' ParamTypeItem3 } 
   9  CodeBlockReturn ::= '[' ParamTypeList3 ']'
  10  
  11  RoutineType ::= 'routine' [ '<' [ ParamTypeList ] [ '=>' Type ] '>' [ CodeBlockReturn ] ]
     


 0.9   User Type  

     
   1  # For unspecialized C data types:
   2  TemplParamList1 ::= TypeHolder { ',' TypeHolder } { ',' TypeHolder '=' Type }
   3  TemplParamList2 ::= TypeHolder '=' Type { ',' TypeHolder '=' Type }
   4  
   5  
   6  # For specialized C data types:
   7  TemplArgList   ::= ( Type | ConstExpression) { ',' Type | ConstExpression }
   8  
   9  TemplType ::= Identifier '<' ( TemplParamList1 | TemplParamList2 | TemplType ) '>'
  10  
  11  UserType ::= Identifier
  12             | UserType '::' Identifier
  13             | UserType '::' TemplType
     


 0.10   Variant Type  

     
   1  VariantType ::= Type ( '|' Type )+
     


 0.11   Type  

     
   1  Type ::= SpecialType 
   2         | [ 'dao' '::' ] PrimitiveType
   3         | [ 'dao' '::' ] EnumSymbolType
   4         | [ 'dao' '::' ] ArrayType
   5         | [ 'dao' '::' ] ListType
   6         | [ 'dao' '::' ] MapType
   7         | [ 'dao' '::' ] TupleType
   8         | [ 'dao' '::' ] RoutineType
   9         | { Identifier '::' } UserType
  10         | ( 'var' | 'invar' ) '<' Type '>'