diff --git a/syntax/midas.ebnf b/syntax/midas.ebnf index 526e122..4626412 100644 --- a/syntax/midas.ebnf +++ b/syntax/midas.ebnf @@ -19,16 +19,24 @@ Comparison ::= Unary (ComparisonOp Unary)* Equality ::= Comparison (EqualityOp Comparison)* Constraint ::= Equality ("&" Equality)* -SimpleType ::= Identifier "?"? -Template ::= "[" Type "]" -Type ::= Identifier Template? "?"? +TemplateParam ::= Identifier ("<:" Type)? +Template ::= "[" (TemplateParam ("," TemplateParam)*)? "]" + + +TypeProperty ::= Identifier ":" Type +ComplexType ::= "{" TypeProperty* "}" +NamedType ::= Identifier +TypeParams ::= "[" (Type ("," Type)*)? "]" +GenericType ::= NamedType TypeParams? +GroupedType ::= "(" Type ")" +BaseType ::= GroupedType | ComplexType | GenericType +ConstraintType ::= BaseType ("where" Constraint)? +Type ::= ConstraintType -TypeProperty ::= Identifier ":" Type ("where" Constraints)? -ComplexTypeBody ::= "{" TypeProperty* "}" OpDefinition ::= "op" Identifier "(" Type ")" "->" Type ExtendBody ::= "{" OpDefinition* "}" -TypeStatement ::= "type" Identifier Template? ("(" Type ")" ("where" Constraint)? | ComplexTypeBody) +TypeStatement ::= "type" Identifier Template? "=" Type ExtendStatement ::= "extend" Type ExtendBody PredicateStatement ::= "predicate" Identifier "(" Identifier ":" Type ")" "=" Constraint diff --git a/syntax/midas.typ b/syntax/midas.typ index 3e16f19..71ad465 100644 --- a/syntax/midas.typ +++ b/syntax/midas.typ @@ -47,24 +47,52 @@ svg.railroad .terminal rect { {[`simple-type` 'identifier' ]} ``` -#let template = ``` -{[`template` "[" 'type' "]"]} +#let template-param = ``` +{[`template-param` 'identifier' ]} ``` -#let type = ``` -{[`type` 'identifier' ]} +#let template = ``` +{[`template` "[" "]"]} ``` #let type-property = ``` -{[`type-property` 'identifier' ":" 'type' ]} +{[`type-property` 'identifier' ":" 'type']} ``` -#let type-body = ``` -{[`type-body` "{" "}"]} +#let complex-type = ``` +{[`complex-type` "{" "}"]} +``` + +#let named-type = ``` +{[`named-type` 'identifier']} +``` + +#let type-params = ``` +{[`type-params` "[" "]"]} +``` + +#let generic-type = ``` +{[`generic-type` 'named-type' ]} +``` + +#let grouped-type = ``` +{[`grouped-type` "(" 'type' ")"]} +``` + +#let base-type = ``` +{[`base-type` <'grouped-type', 'complex-type', 'generic-type'>]} +``` + +#let constraint-type = ``` +{[`constraint-type` 'base-type' ]} +``` + +#let type = ``` +{[`type` 'constraint-type']} ``` #let type-statement = ``` -{[`type-statement` "type" 'identifier' <[["(" 'type' ")"] ], 'type-body'>]} +{[`type-statement` "type" 'identifier' "=" 'type']} ``` #let op-definition = ``` @@ -93,10 +121,17 @@ svg.railroad .terminal rect { equality: equality, constraint: constraint, simple-type: simple-type, + template-param: template-param, template: template, - type: type, type-property: type-property, - type-body: type-body, + complex-type: complex-type, + named-type: named-type, + type-params: type-params, + generic-type: generic-type, + grouped-type: grouped-type, + base-type: base-type, + constraint-type: constraint-type, + type: type, type-statement: type-statement, op-definition: op-definition, extend-statement: extend-statement, @@ -107,10 +142,17 @@ svg.railroad .terminal rect { #let inline = ( "grouping", "value", + "template-param", "template", "simple-type", "type-property", - "type-body", + "complex-type", + "type-params", + "named-type", + "grouped-type", + "generic-type", + "base-type", + "constraint-type", "op-definition", "type-statement", "extend-statement",