log-e-sappho/src/msph/README.md

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