    [NAME]
    ALL.dao.grammar.routine

    [TITLE]
    Routines (Functions)

    [DESCRIPTION]

       1  ParamItem1 ::= Identifier [ ':' Type ]
       2  ParamItem2 ::= Identifier [ ':' Type ] '=' ConstExpression
       3
       4  ParamList1 ::= ParamItem1 { ',' ParamItem1 }
       5  ParamList2 ::= ParamList1 { ',' ParamItem2 } [ ',' '...' ]
       6  ParamList3 ::= ParamItem2 { ',' ParamItem2 } [ ',' '...' ]
       7  ParamList  ::= ( ParamList2 | ParamList3 | '...' ) [ 'as' Identifier ]
       8
       9  OverloadableOperator ::= Operator | 'cast' | '.' Identifier [ '=' ] | '[' ']' [ '=' ]
      10
      11  ParamReturn ::= '(' [ ParamList ] ')' [ '=>' Type ]
      12
      13  RoutineSig   ::= Identifier '(' [ ParamList ] ')' [ '=>' Type ]
      14  CodeBlockSig ::= Identifier '(' [ ParamList ] ')' '[' [ ParamList1 ] ']' [ '=>' Type ]
      15  DecoratorSig ::= TypeHolder '(' Identifier '(' Identifier ')' [ ',' ParamList ] ')'
      16
      17  RoutineDecl1 ::= 'routine' { Identifier '::' } ( RoutineSig | CodeBlockSig | DecoratorSig )
      18  RoutineDecl2 ::= 'operator' { Identifier '::' } OverloadableOperator ParamReturn
      19
      20  RoutineDecl ::= RoutineDecl1 | RoutineDecl2
      21
      22  Routine ::= RoutineDecl '{' StatementBlock '}'