Language "OCaml Light" #A Disambiguation Lexis SDF
*/ Syntax SDF
/*
// Integer literals
context-free restrictions
``integer-literal`` -/- [0-9eE]
*/ Syntax SDF
/*
// Floating-point literals
context-free restrictions
``float-literal`` -/- [0-9eE]
// String literals
syntax
``string-character-star ::= string-character _ string-character-star`` {avoid}
*/ Lexis SDF
/*
// Keywords
lexical restrictions
"and" "as" "assert" "asr" "begin" "class"
"constraint" "do" "done" "downto" "else" "end"
"exception" "external" "false" "for" "fun" "function"
"functor" "if" "in" "include" "inherit" "initializer"
"land" "lazy" "let" "lor" "lsl" "lsr"
"lxor" "match" "method" "mod" "module" "mutable"
"new" "nonrec" "object" "of" "open" "or"
"private" "rec" "sig" "struct" "then" "to"
"true" "try" "type" "val" "virtual" "when"
"while" "with"
-/- [A-Za-z0-9\_]
// Key symbols
``infix-op-1`` ``infix-op-2`` ``infix-op-3`` ``infix-op-4``
``infix-op-5`` ``infix-op-6`` ``infix-op-7`` ``infix-op-8``
-/- [\!\$\%\&\*\+\-\.\/\:\<\=\>\?\@\^\|\~]
"[" -/- [\|]
"|" -/- [\]]
":" -/- [\:]
";" -/- [\;]
lexical syntax
``infix-op-3`` = "->" {reject}
``infix-op-5`` = "<-" {reject}
*/ Syntax SDF
/*
// 4 Type expressions
context-free syntax
``typexpr ::= typexpr '->' typexpr`` {right}
``typexpr ::= typexpr star-typexpr+`` {non-assoc}
context-free priorities
``typexpr ::= typexpr typeconstr``
>
``constr-args ::= typexpr star-typexpr*``
>
``typexpr ::= typexpr star-typexpr+``
>
``typexpr ::= typexpr '->' typexpr``
context-free priorities
``star-typexpr ::= '*' typexpr``
>
``typexpr ::= typexpr star-typexpr+``
// 6 Patterns
context-free syntax
``pattern ::= pattern '|' pattern`` {left}
``pattern ::= pattern comma-pattern+`` {non-assoc}
``pattern ::= pattern '::' pattern`` {right}
context-free priorities
``pattern ::= constr pattern``
>
``pattern ::= pattern '::' pattern``
>
``pattern ::= pattern comma-pattern+``
>
``pattern ::= pattern '|' pattern``
>
``pattern ::= pattern 'as' value-name``
context-free priorities
{
``comma-pattern ::= ',' pattern``
``(pattern comma-pattern*)``
} >
``pattern ::= pattern comma-pattern+``
// 7 Expressions
context-free syntax
``expr ::= expr argument+`` {non-assoc,avoid}
``expr ::= '-' expr`` {avoid}
``expr ::= expr infix-op-1 expr`` {right}
``expr ::= expr infix-op-2 expr`` {left}
``expr ::= expr infix-op-3 expr`` {left,prefer}
``expr ::= expr '::' expr`` {right}
``expr ::= expr infix-op-4 expr`` {right}
``expr ::= expr infix-op-5 expr`` {left}
``expr ::= expr infix-op-6 expr`` {right}
``expr ::= expr infix-op-7 expr`` {right}
``expr ::= expr comma-expr+`` {non-assoc}
``expr ::= expr infix-op-8 expr`` {right}
``expr ::= expr '.' field '<-' expr``{right}
``expr ::= expr '.(' expr ')' '<-' expr``{right}
``expr ::= expr ';' expr`` {right}
context-free priorities
``argument ::= expr``
>
``expr ::= prefix-symbol expr``
>
``expr ::= expr '.' field``
> {
``expr ::= expr argument+``
``expr ::= 'assert' expr``
} > {
``expr ::= '-' expr``
``expr ::= '-.' expr``
} >
``expr ::= expr infix-op-1 expr``
>
``expr ::= expr infix-op-2 expr``
>
``expr ::= expr infix-op-3 expr``
>
``expr ::= expr '::' expr``
>
``expr ::= expr infix-op-4 expr``
>
``expr ::= expr infix-op-5 expr``
>
``expr ::= expr infix-op-6 expr``
>
``expr ::= expr infix-op-7 expr``
>
``expr ::= expr comma-expr+``
> {
``expr ::= expr '.' field '<-' expr``
``expr ::= expr '.(' expr ')' '<-' expr``
``expr ::= expr infix-op-8 expr``
} >
``expr ::= expr ';' expr``
context-free priorities
``expr ::= prefix-symbol expr``
>
``expr ::= expr '.(' expr ')'``
<0> >
``expr ::= expr argument+``
context-free priorities
{
``argument ::= expr``
``expr ::= expr '.' field``
``expr ::= expr '.(' expr ')'``
``expr ::= expr argument+``
``expr ::= 'assert' expr``
``expr ::= expr infix-op-1 expr``
``expr ::= expr infix-op-2 expr``
``expr ::= expr infix-op-3 expr``
``expr ::= expr '::' expr``
``expr ::= expr infix-op-4 expr``
``expr ::= expr infix-op-5 expr``
``expr ::= expr infix-op-6 expr``
``expr ::= expr infix-op-7 expr``
``expr ::= expr comma-expr+``
``expr ::= expr '.' field '<-' expr``
``expr ::= expr '.(' expr ')' '<-' expr``
``expr ::= expr infix-op-8 expr``
``expr ::= expr ';' expr``
} <0>. > {
``expr ::= 'if' expr 'then' expr ('else' expr)?``
``expr ::= 'match' expr 'with' pattern-matching``
``expr ::= 'function' pattern-matching``
``expr ::= 'fun' pattern+ '->' expr``
``expr ::= 'try' expr 'with' pattern-matching``
``expr ::= let-definition 'in' expr``
}
context-free priorities
{
``comma-expr ::= ',' expr``
``(expr comma-expr*)``
} >
``expr ::= expr comma-expr+``
context-free priorities
{
``expr ::= '[' expr semic-expr* ']'``
``expr ::= '[' expr semic-expr* ';' ']'``
``expr ::= '[|' expr semic-expr* '|]'``
``expr ::= '[|' expr semic-expr* ';' '|]'``
``semic-expr ::= ';' expr``
``(expr semic-expr*)``
``expr ::= '{' field '=' expr semic-field-expr* '}'``
``expr ::= '{' field '=' expr semic-field-expr* ';' '}'``
``expr ::= '{' expr 'with' field '=' expr semic-field-expr* '}'``
``expr ::= '{' expr 'with' field '=' expr semic-field-expr* ';' '}'``
``semic-field-expr ::= ';' field '=' expr``
} >
``expr ::= expr ';' expr``
*/
/*
// 1 Lexical conventions // Comments lexical syntax LAYOUT = LEX-block-comment LEX-block-comment = "(*" LEX-comment-part* "*)" LEX-comment-part = ~[\(\)\*] LEX-comment-part = LEX-asterisk LEX-comment-part = LEX-left-paren LEX-comment-part = LEX-right-paren LEX-comment-part = LEX-block-comment LEX-asterisk = [\*] LEX-left-paren = [\(] LEX-right-paren = [\)] lexical restrictions LEX-asterisk -/- [\)] LEX-left-paren -/- [\*] context-free restrictions LAYOUT? -/- [\(].[\*] // Identifiers lexical syntax ``ident`` = ``keyword`` {reject} ``lowercase-ident`` = ``keyword`` {reject} lexical restrictions ``ident`` ``lowercase-ident`` ``capitalized-ident`` -/- [A-Za-z0-9\_\']