//////////////////////////////////////////////////////////////////////////////
//
// ME Notes
//
//////////////////////////////////////////////////////////////////////////////

- Components
    - AST Editor
    - Syntax checking
    - Type checking
    - Evaluator
    - Renderer

//////////////////////////////////////////////////////////////////////////////
//
// MDL Examples
//
//////////////////////////////////////////////////////////////////////////////

- patterns

x             =      identifier
x : float     =      pattern : type
(x, y : type) =      (pattern, pattern)
(x, y) : type =
head :: tail  =      pattern :: pattern
Point x y     =      function pattern

//////////////////////////////////////////////////////////////////////////////
//
// MDL Grammer
//
//////////////////////////////////////////////////////////////////////////////

typeList =
    type [typeList]

type = 
    identifier
    _
    identifier typeList
    type, type
    [type]
    type -> type
    (type)

pattern =
    identifier
    pattern : type
    pattern, pattern
    pattern :: pattern
    identifier pattern
    pattern as pattern
    (pattern)

patternList =
    pattern [patternList]

statement =

statements =
    statement [; statements]

block =
    { statements }


terminal =
    identifier
    number
    "string"
    'a'

numericOperator    = + - * / ^ &
comparisonOperator = == != < <= > >= 
booleanOperator    = not and or
bitwiseOperator    = ! & | xor diff test
pairOperator       = ,
consOperator       = ::
applyOperator      = .
composeOperator    = o

operator = ...

expression = 
    terminal
    expression expression       
    expression operator expression
    \pattern -> expression
    '[' [expressionList] ']'
    (expression)
    expression : type
    if expression then expression else expression
    let definitions in expression
    expression where defintions
    block

expressionList =
    expression [, expression]

definition =
    patternList = expression

declaration =
    pattern : type

def = 
    definition
    declaration

defList:
    def [; defList]

program = 
    defList;
    
// types, classes

//////////////////////////////////////////////////////////////////////////////
//
// AST Editor
//
//////////////////////////////////////////////////////////////////////////////

    - Token list
    - User defined layouts per production
 
    