tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

c1a93c90d15915cbb017a9776c420b305ad4365157be364cf94ac5255ce19f09.tri (4391B)


      1 !import prelude *
      2 !import source_lexer *
      3 !export *
      4 
      5 -- Gate-profile surface AST. Every node has a half-open source span.
      6 -- node = pair kind (pair payload (pair start end))
      7 sourceAstNode kind payload start end =
      8   pair kind (pair payload (pair start end))
      9 sourceAstKind node = fst node
     10 sourceAstPayload node = fst (snd node)
     11 sourceAstStart node = fst (snd (snd node))
     12 sourceAstEnd node = snd (snd (snd node))
     13 
     14 sourceAstLeafKind = 1
     15 sourceAstNameKind = 2
     16 sourceAstApplyKind = 3
     17 sourceAstLambdaKind = 4
     18 sourceAstGroupKind = 5
     19 sourceAstNumberKind = 6
     20 sourceAstStringKind = 7
     21 sourceAstListKind = 8
     22 sourceAstLetKind = 9
     23 sourceAstPipeKind = 10
     24 sourceAstDoKind = 11
     25 sourceAstEquationsKind = 12
     26 sourceAstPatternKind = 13
     27 
     28 -- Each equation is (located argument patterns, located body).
     29 sourceAstEquations equations start end =
     30   sourceAstNode sourceAstEquationsKind equations start end
     31 
     32 sourceAstDoOperator node = fst (sourceAstPayload node)
     33 sourceAstDoStatements node = snd (sourceAstPayload node)
     34 sourceAstDoStatementBinder statement = fst statement
     35 sourceAstDoStatementValue statement = snd statement
     36 
     37 sourceAstPipeDirection node = fst (sourceAstPayload node)
     38 sourceAstPipeLeft node = fst (snd (sourceAstPayload node))
     39 sourceAstPipeRight node = snd (snd (sourceAstPayload node))
     40 
     41 sourceAstLetName node = sourceTokenPayload (fst (sourceAstPayload node))
     42 sourceAstLetValue node = fst (snd (sourceAstPayload node))
     43 sourceAstLetBody node = snd (snd (sourceAstPayload node))
     44 
     45 sourceAstLeaf token =
     46   sourceAstNode sourceAstLeafKind t
     47     (sourceTokenStart token) (sourceTokenEnd token)
     48 
     49 sourceAstName token =
     50   sourceAstNode sourceAstNameKind (sourceTokenPayload token)
     51     (sourceTokenStart token) (sourceTokenEnd token)
     52 
     53 sourceAstNumber token =
     54   sourceAstNode sourceAstNumberKind (sourceTokenPayload token)
     55     (sourceTokenStart token) (sourceTokenEnd token)
     56 
     57 sourceAstString token =
     58   sourceAstNode sourceAstStringKind (sourceTokenPayload token)
     59     (sourceTokenStart token) (sourceTokenEnd token)
     60 
     61 sourceAstList openToken elements closeToken =
     62   sourceAstNode sourceAstListKind elements
     63     (sourceTokenStart openToken) (sourceTokenEnd closeToken)
     64 
     65 sourceAstApply left right =
     66   sourceAstNode sourceAstApplyKind (pair left right)
     67     (sourceAstStart left) (sourceAstEnd right)
     68 
     69 -- Keep pipe direction and source order until core elaboration.
     70 sourceAstPipe operator left right =
     71   sourceAstNode sourceAstPipeKind
     72     (pair (sourceTokenKind operator) (pair left right))
     73     (sourceAstStart left) (sourceAstEnd right)
     74 
     75 sourceAstLambda nameToken body =
     76   sourceAstNode sourceAstLambdaKind (pair (sourceTokenPayload nameToken) body)
     77     (sourceTokenStart nameToken) (sourceAstEnd body)
     78 
     79 sourceAstGroup openToken body closeToken =
     80   sourceAstNode sourceAstGroupKind body
     81     (sourceTokenStart openToken) (sourceTokenEnd closeToken)
     82 
     83 -- A local binding is nonrecursive: the binder is in scope only for the body.
     84 -- Both `let x = value in body` and `body where x = value` use this node.
     85 sourceAstLocal nameToken value body start end =
     86   sourceAstNode sourceAstLetKind (pair nameToken (pair value body)) start end
     87 
     88 -- A do statement is pair (Maybe locatedNameToken) locatedExpression.
     89 -- Keep the whole block explicit until the elaboration boundary.
     90 sourceAstDo keyword operator statements last =
     91   sourceAstNode sourceAstDoKind (pair operator statements)
     92     (sourceTokenStart keyword) (sourceAstEnd last)
     93 
     94 -- The bootstrap uses an ignored "_" binder for non-final expression
     95 -- statements; retain that convention so lexical shadowing is identical.
     96 sourceAstDoIgnored statement =
     97   sourceToken sourceTokenName "_"
     98     (sourceAstStart (sourceAstDoStatementValue statement))
     99     (sourceAstEnd (sourceAstDoStatementValue statement))
    100 
    101 sourceAstDoBinderToken statement =
    102   lazyMaybe
    103     (_ : sourceAstDoIgnored statement)
    104     (name : name)
    105     (sourceAstDoStatementBinder statement)
    106 
    107 sourceAstDoLower_ self statements operator =
    108   lazyList
    109     (_ : operator)
    110     (statement rest :
    111       lazyList
    112         (_ : sourceAstDoStatementValue statement)
    113         (next tail :
    114           sourceAstApply
    115             (sourceAstApply operator (sourceAstDoStatementValue statement))
    116             (sourceAstLambda (sourceAstDoBinderToken statement)
    117               (self rest operator)))
    118         rest)
    119     statements
    120 
    121 sourceAstDoLower = (node :
    122   y sourceAstDoLower_ (sourceAstDoStatements node)
    123     (sourceAstDoOperator node))
    124