26 lines
850 B
EBNF
26 lines
850 B
EBNF
identifier ::= '[a-zA-Z][a-zA-Z_]*'
|
|
|
|
integer ::= '\d+'
|
|
number ::= integer ["." integer]
|
|
boolean ::= "False" | "True"
|
|
none ::= "None"
|
|
|
|
value ::= number | boolean | none
|
|
lambda-value ::= "_" | value
|
|
lambda-operator ::= ">" | "<" | ">=" | "<=" | "==" | "!="
|
|
lambda ::= lambda-value lambda-operator lambda-value
|
|
|
|
constraint ::= identifier | "(" lambda ")"
|
|
base-type ::= identifier
|
|
type ::= base-type { "+" constraint }
|
|
|
|
type-property ::= 'identifier' ":" 'type'
|
|
type-body ::= "{" { 'type-property' } "}"
|
|
|
|
operation-type ::= "<" 'type' ">"
|
|
|
|
type-statement ::= "type" 'identifier' "<" 'type' {"," 'type'} ">" ['type-body']
|
|
operation-statement ::= "op" 'operation-type' 'operator' 'operation-type' "=" 'operation-type'
|
|
constraint-statement ::= "constraint" 'identifier' "=" 'lambda'
|
|
|
|
statement ::= type-statement | operation-statement | constraint-statement |