2 KiB
2 KiB
msph/micro sappho
Micro sappho is a minimalistic language for demonstration of the SPHO type system. It is implemented using a simple parser and lexer that implements the grammar below. The indended use is to allow experimentation and familiarization with the SPHO types and subtyping.
Grammar
Grammar in pseudo-bnf
And yes, it is ambiguous at places. More specification coming when there is time.
MSph ::= Body
Body ::= Dirs
Dir ::= Typedef (directives, with lack of a better name)
| Memberdef
| Nominaldecl
| Checkdir
Typedef ::= 'type' Name '=' TExpr (type definition/binding)
| 'type' Name '[' Names ']' '=' TExpr
| 'type' Name (declaration, donno if useful)
Memberdef ::= 'member' Name ':' TExpr
Nominaldecl ::= 'nominal' Name
Checkdir ::= 'check' TExpr '<:' TExpr
TExpr ::= 'True'
| 'False'
| Var
| Nominal
| Trait
| TExpr '&' TExpr
| TExpr '|' TExpr
| TExpr '=>' TExpr
| TExpr '->' TExpr
| 'box' TExpr
| 'forall' Name '.' TExpr
| '(' TExpr ')'
Trait ::= '{' Body '}' (trait, this introduces scoping)
Var ::= Name (type variables)
Nominal ::= Name (nominal type)
Name ::= '[a-zA-Z0-9_]+' & !Reserved (name/identifier)
Reserved ::= 'type' (reserved/keywords)
| 'member'
| 'nominal'
| 'check'
| 'forall'
| 'box'
| 'True'
| 'False'
Precedence of binary operators: '&' < '|' < '->' < '=>'
< means "binds closer"
Example
A simple example msph program
nominal ExampleN
type ExampleDecl
type ExampleDecl2
type Example = {
member example_m : C -> C
type FA = forall X. X -> X
type b = forall X. (box X => ExampleDecl) => ExampleDecl2
}
member example_global : Example & ExampleN
type TripleConj[X, Y, Z] = X & Y & Z