expr | ::= |
value-path
|
| ∣ | constant
|
| ∣ | ( expr )
|
| ∣ | begin expr end
|
| ∣ | ( expr : typexpr )
|
| ∣ | expr {, expr}+
|
| ∣ | constr expr
|
| ∣ | `tag-name expr
|
| ∣ | expr :: expr
|
| ∣ | [ expr { ; expr } [;] ]
|
| ∣ | [| expr { ; expr } [;] |]
|
| ∣ | { field = expr { ; field = expr } [;] }
|
| ∣ | { expr with field = expr { ; field = expr } [;] }
|
| ∣ | expr { argument }+
|
| ∣ | prefix-symbol expr
|
| ∣ | - expr
|
| ∣ | -. expr
|
| ∣ | expr infix-op expr
|
| ∣ | expr . field
|
| ∣ | expr . field <- expr
|
| ∣ | expr .( expr )
|
| ∣ | expr .( expr ) <- expr
|
| ∣ | expr .[ expr ]
|
| ∣ | expr .[ expr ] <- expr
|
| ∣ | if expr then expr [ else expr ]
|
| ∣ | while expr do expr done
|
| ∣ | for value-name = expr ( to ∣ downto ) expr do expr done
|
| ∣ | expr ; expr
|
| ∣ | match expr with pattern-matching
|
| ∣ | function pattern-matching
|
| ∣ | fun multiple-matching
|
| ∣ | try expr with pattern-matching
|
| ∣ | let [rec] let-binding { and let-binding } in expr
|
| ∣ | new class-path
|
| ∣ | object class-body end
|
| ∣ | expr # method-name
|
| ∣ | inst-var-name
|
| ∣ | inst-var-name <- expr
|
| ∣ | ( expr :> typexpr )
|
| ∣ | ( expr : typexpr :> typexpr )
|
| ∣ | {< [ inst-var-name = expr { ; inst-var-name = expr } [;] ] >}
|
|
extension for Method definition: |
| ∣ | inst-var-name <- expr
|
| ∣ | {< [ inst-var-name = expr { ; inst-var-name = expr } [;] ] >}
|
|
extension for Assertion checking: |
| ∣ | assert expr
|
|
extension for Lazy expressions: |
| ∣ | lazy expr
|
|
extension for Local modules: |
| ∣ | let module module-name { ( module-name : module-type ) }
[ : module-type ] = module-expr in expr
|
|
extension for Local opens: |
| ∣ | let open module-path in expr
|
| ∣ | module-path .( expr )
|
|
extension for Record notations: |
| ∣ | { field [= expr] { ; field [= expr] } [;] }
|
| ∣ | { expr with field [= expr] { ; field [= expr] } [;] }
|
|
extension for First-class modules: |
| ∣ | (module module-expr [: package-type])
|
|
extension for Overriding in open statements: |
| ∣ | let open! module-path in expr
|
|
extension for Syntax for Bigarray access: |
| ∣ | expr .{ expr { , expr } }
|
| ∣ | expr .{ expr { , expr } } <- expr
|
|
extension for Attributes: |
| ∣ | expr attribute
|
|
extension for Extension nodes: |
| ∣ | extension
|
|
argument | ::= |
expr
|
| ∣ | ~ label-name
|
| ∣ | ~ label-name : expr
|
| ∣ | ? label-name
|
| ∣ | ? label-name : expr
|
|
pattern-matching | ::= |
[ | ] pattern [when expr] -> expr
{ | pattern [when expr] -> expr }
|
|
multiple-matching | ::= |
{ parameter }+ [when expr] -> expr
|
|
let-binding | ::= |
pattern = expr
|
| ∣ | value-name { parameter } [: typexpr] [:> typexpr] = expr
|
|
extension for Explicit polymorphic type annotations: |
| ∣ | value-name : poly-typexpr = expr
|
|
extension for Polymorphic syntax: |
| ∣ | value-name : type { typeconstr-name }+ . typexpr = expr
|
|
parameter | ::= |
pattern
|
| ∣ | ~ label-name
|
| ∣ | ~ ( label-name [: typexpr] )
|
| ∣ | ~ label-name : pattern
|
| ∣ | ? label-name
|
| ∣ | ? ( label-name [: typexpr] [= expr] )
|
| ∣ | ? label-name : pattern
|
| ∣ | ? label-name : ( pattern [: typexpr] [= expr] )
|
|
extension for Locally abstract types: |
| ∣ | ( type typeconstr-name )
|