Languages-beta : OC-L-08-Type-and-Exception-Definitions.cbs | PRETTY | PDF
Language "OCaml Light"
8 Type and exception definitions
Syntax
TDS : type-definition
::= 'type' typedef and-typedef*
ATD : and-typedef ::= 'and' typedef
TD : typedef
::= type-params? typeconstr-name type-information
TI : type-information
::= type-equation? type-representation? type-constraint*
TE : type-equation
::= '=' typexpr
TR : type-representation
::= '=' '|'? constr-decl bar-constr-decl*
| '=' record-decl
BCD : bar-constr-decl ::= '|' constr-decl
TPS : type-params
::= type-param
| '(' type-param (',' type-param)* ')'
TP : type-param
::= variance? '\'' ident
variance ::= '+' | '-'
RD : record-decl
::= '{' field-decl ( ';' field-decl )* ';'? '}'
CD : constr-decl
::= ( constr-name | '[' ']' | '(::)' ) ( 'of' constr-args )?
CA : constr-args
::= typexpr star-typexpr*
FD : field-decl
::= field-name ':' poly-typexpr
ED : exception-definition
::= 'exception' constr-decl
| 'exception' constr-name '=' constr
TC : type-constraint
::= 'constraint' '\'' ident '=' typexpr
Type definitions
Semantics
define-types[[ _:type-definition ]] : =>environments
Rule
define-types[[ 'type' TD ATD* ]] = collateral( define-typedefs[[ TD ATD* ]] )
Semantics
define-typedefs[[ _:(typedef and-typedef*)]] : (=>environments)+
Rule
define-typedefs[[ TD1 'and' TD2 ATD* ]] =
define-typedefs[[ TD2 ]], define-typedefs[[ TD2 ATD* ]]
Rule
define-typedefs[[ TPS? TCN '=' CD BCD* ]] =
define-constrs[[ CD BCD* ]]
Rule
define-typedefs[[ TPS? TCN '=' RD ]] = map( )
Rule
define-typedefs[[ TPS? TCN '=' T ]] = map( )
Semantics
define-constrs[[ _:(constr-decl bar-constr-decl*)]] : (=>environments)+
Rule
define-constrs[[ CD1 '|' CD2 BCD* ]] =
define-constrs[[ CD1 ]], define-constrs[[ CD2 BCD* ]]
Rule
define-constrs[[ CN ]] =
{ constr-name[[ CN ]] |-> variant(constr-name[[ CN ]],tuple( )) }
Rule
define-constrs[[ CN 'of' CA ]] =
{ constr-name[[ CN ]] |->
function closure(variant(constr-name[[ CN ]], given)) }
Exception definitions
Semantics
define-exception[[ _:exception-definition ]] : =>environments
Rule
define-exception[[ 'exception' CD ]] = define-constrs[[ CD ]]
Rule
define-exception[[ 'exception' CN '=' CSTR ]] = map( )