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