dfe628dcc1be66b2ea645295398d0d4c0357ad3312da2578298cb3c5fc30fd7d.tri (10187B)
1 !import prelude * 2 !import parser * 3 !import source_parser * 4 !import source_lexer * 5 !import source_ast * 6 !import source_equations * 7 !export * 8 9 -- Program = pair definitions (Maybe finalExpression). 10 -- Definition = pair locatedNameToken body. Contiguous plain equations 11 -- coalesce into one located equation body; unique all-name singleton heads 12 -- take the ordinary lambda path. Program parsing is distinct from the 13 -- single-expression gate. 14 sourceProgramDefinitions program = fst program 15 sourceProgramFinal program = snd program 16 sourceDefinitionName definition = sourceTokenPayload (fst definition) 17 sourceDefinitionPosition definition = sourceTokenStart (fst definition) 18 sourceDefinitionBody definition = snd definition 19 20 sourceProgramSkipNewlines = 21 parserMap (_ : t) (parserMany (sourceGateExpect sourceTokenNewline)) 22 23 -- Both definition and local-binding bodies use the same located transition: 24 -- unindented lines are top-level; indented values may continue on lines whose 25 -- first token starts in a strictly deeper column. 26 sourceProgramDefinitionValue = 27 sourceGateParseLayoutValue sourceGateExpr sourceGateExprIndented 28 "definition body" 29 30 -- Look ahead across the head (including delimited pattern newlines). This 31 -- distinguishes `f t` (expression) from `f x = x` (definition), without 32 -- consuming tokens or trying a partially consumed alternative. 33 sourceProgramAssignOnLine? tokens = sourceEquationAssignLine? tokens 34 35 sourceProgramDefinitionHead? tokens = 36 lazyList 37 (_ : false) 38 (token rest : 39 lazyBool 40 (_ : sourceProgramAssignOnLine? rest) 41 (_ : false) 42 (equal? (sourceTokenKind token) sourceTokenName)) 43 tokens 44 45 -- Bootstrap contract profile: definition heads only. Contract expressions 46 -- are ordinary names or parenthesized applications, never static types. 47 -- Keep the runtime Result checks (including short-circuit and value passing) 48 -- identical to Frontend.ContractDesugar's supported base-library forms. 49 sourceProgramContract = 50 parserOr (sourceGateParseGroup sourceGateExpr) 51 (parserMap sourceAstName (sourceGateExpect sourceTokenName)) 52 53 -- Argument = pair (Maybe namedBinderToken) (Maybe contractExpression). 54 sourceProgramArgNamed input = 55 parserBind (sourceGateExpect sourceTokenName) (name : 56 parserMap (contract : pair (just name) contract) 57 (parserOptional (parserThen (sourceGateExpect sourceTokenAt) 58 sourceProgramContract))) input 59 60 sourceProgramArgPhantom = 61 parserMap (contract : pair nothing (just contract)) 62 (parserThen (sourceGateExpect sourceTokenAt) sourceProgramContract) 63 64 sourceProgramArgument = parserOr sourceProgramArgPhantom sourceProgramArgNamed 65 66 sourceProgramSynthetic name node = 67 sourceToken sourceTokenName name 68 (sourceAstStart node) (sourceAstStart node) 69 70 sourceProgramName name node = sourceAstName (sourceProgramSynthetic name node) 71 sourceProgramApply2 function first second = 72 sourceAstApply (sourceAstApply function first) second 73 sourceProgramApply3 function first second third = 74 sourceAstApply (sourceProgramApply2 function first second) third 75 76 sourceProgramChecked contract value = 77 sourceProgramApply2 (sourceProgramName "withContract" contract) contract value 78 79 sourceProgramFailure msg = 80 sourceProgramApply2 81 (sourceProgramName "err" msg) msg 82 (sourceAstLeaf (sourceProgramSynthetic "t" msg)) 83 84 sourceProgramOnFailure node = 85 sourceAstLambda 86 (sourceProgramSynthetic "msg" node) 87 (sourceAstLambda (sourceProgramSynthetic "_" node) 88 (sourceProgramFailure (sourceProgramName "msg" node))) 89 90 -- Earlier failed arguments must still accept the remaining arguments before 91 -- producing the error, just like the historical Haskell lowering. 92 sourceProgramAbsorbFailure node = 93 sourceAstLambda 94 (sourceProgramSynthetic "msg" node) 95 (sourceAstLambda (sourceProgramSynthetic "_" node) 96 (sourceAstLambda (sourceProgramSynthetic "_" node) 97 (sourceProgramFailure (sourceProgramName "msg" node)))) 98 99 sourceProgramReturn contract body = 100 lazyMaybe 101 (_ : body) 102 (c : sourceProgramApply3 103 (sourceProgramName "matchResult" c) 104 (sourceProgramOnFailure c) 105 (sourceAstLambda (sourceProgramSynthetic "r" c) 106 (sourceAstLambda (sourceProgramSynthetic "_" c) 107 (sourceProgramName "r" c))) 108 (sourceProgramChecked c body)) 109 contract 110 111 sourceProgramArgName arg index anchor = 112 lazyMaybe 113 (_ : sourceProgramSynthetic 114 (if (isZero_? index) "x" (if (equal? index 1) "y" "z")) anchor) 115 (token : token) 116 (fst arg) 117 118 sourceProgramRawApply_ self args raw index = 119 lazyList 120 (_ : raw) 121 (arg rest : self rest 122 (sourceAstApply raw 123 (sourceAstName (sourceProgramArgName arg index raw))) 124 (succ index)) 125 args 126 sourceProgramRawApply = (args raw : y sourceProgramRawApply_ args raw 0) 127 128 sourceProgramWrapArgs_ self args body index = 129 lazyList 130 (_ : body) 131 (arg rest : 132 sourceAstLambda (sourceProgramArgName arg index body) 133 (lazyMaybe 134 (_ : self rest body (succ index)) 135 (c : sourceProgramApply3 136 (sourceProgramName "matchResult" c) 137 (lazyList 138 (_ : sourceProgramOnFailure c) 139 (other tail : sourceProgramAbsorbFailure c) 140 rest) 141 (sourceAstLambda (sourceProgramArgName arg index body) 142 (sourceAstLambda (sourceProgramSynthetic "_" c) 143 (self rest body (succ index)))) 144 (sourceProgramChecked c 145 (sourceAstName (sourceProgramArgName arg index body)))) 146 (snd arg))) 147 args 148 sourceProgramWrapArgs = (args body : y sourceProgramWrapArgs_ args body 0) 149 150 sourceProgramAnyContract_ self args = 151 lazyList 152 (_ : false) 153 (arg rest : lazyMaybe 154 (_ : self rest) 155 (contract : true) 156 (snd arg)) 157 args 158 sourceProgramAnyContract? = (args : y sourceProgramAnyContract_ args) 159 160 sourceProgramAnyPhantom_ self args = 161 lazyList 162 (_ : false) 163 (arg rest : lazyMaybe 164 (_ : true) 165 (name : self rest) 166 (fst arg)) 167 args 168 sourceProgramAnyPhantom? = (args : y sourceProgramAnyPhantom_ args) 169 170 sourceProgramAllPhantom_ self args = 171 lazyList 172 (_ : true) 173 (arg rest : lazyMaybe 174 (_ : self rest) 175 (name : false) 176 (fst arg)) 177 args 178 sourceProgramAllPhantom? = (args : y sourceProgramAllPhantom_ args) 179 180 sourceProgramPlainArgs_ self args body = 181 lazyList 182 (_ : body) 183 (arg rest : sourceAstLambda (sourceProgramArgName arg 0 body) 184 (self rest body)) 185 args 186 sourceProgramPlainArgs = (args body : y sourceProgramPlainArgs_ args body) 187 188 sourceProgramLowerDefinition name args result body = 189 lazyBool 190 (_ : lazyBool 191 (_ : sourceAstLocal 192 (sourceToken sourceTokenName 193 (append "_" (append (sourceTokenPayload name) "_raw")) 194 (sourceTokenStart name) (sourceTokenEnd name)) 195 body 196 (sourceProgramWrapArgs args 197 (sourceProgramReturn result 198 (sourceProgramRawApply args 199 (sourceProgramName 200 (append "_" (append (sourceTokenPayload name) "_raw")) 201 body)))) 202 (sourceTokenStart name) (sourceAstEnd body)) 203 (_ : sourceProgramWrapArgs args (sourceProgramReturn result body)) 204 (sourceProgramAnyPhantom? args)) 205 (_ : sourceProgramPlainArgs args body) 206 (or? (sourceProgramAnyContract? args) 207 (lazyMaybe (_ : false) (contract : true) result)) 208 209 sourceProgramParseAnnotatedBinding input = 210 parserBind (sourceGateExpect sourceTokenName) (name : 211 parserBind (parserMany sourceProgramArgument) (args : 212 (remaining : lazyBool 213 (_ : parserThen (sourceGateExpect sourceTokenAssign) 214 (parserBind (parserOptional 215 (parserThen (sourceGateExpect sourceTokenAt) 216 sourceProgramContract)) (result : 217 parserMap (body : pair name 218 (sourceProgramLowerDefinition name args result body)) 219 sourceProgramDefinitionValue)) remaining) 220 (_ : parserReplyFail 221 (parserDiagnostic 47 "supported contract head" t 222 (sourceTokenStart name) t) remaining true false) 223 (or? (not? (sourceProgramAnyPhantom? args)) 224 (and? (sourceProgramAllPhantom? args) 225 (lte_? (length args) 2)))))) input 226 227 -- Preserve the existing bounded annotated-head path. Plain heads now retain 228 -- located equations; annotated definitions cannot merge with those groups. 229 sourceProgramAnnotated_ self input = (lazyList (_ : false) 230 (token rest : let kind = sourceTokenKind token in (lazyBool (_ : true) 231 (_ : lazyBool (_ : lazyList (_ : false) 232 (next unused : equal? (sourceTokenKind next) sourceTokenAt) rest) 233 (_ : lazyBool (_ : false) (_ : self rest) 234 (equal? kind sourceTokenNewline)) 235 (equal? kind sourceTokenAssign)) (equal? kind sourceTokenAt))) input) 236 sourceProgramAnnotated? input = y sourceProgramAnnotated_ input 237 sourceProgramParsePlainBinding input = (lazyList 238 (_ : sourceGateAtomError input) 239 (token rest : sourceEquationBinding 240 (sourceGateParseLayoutValue 241 (sourceGateExprIndented (sourcePositionColumn (sourceTokenStart token))) 242 sourceGateExprIndented "definition body") input) input) 243 sourceProgramParseDefinition input = 244 lazyBool 245 (_ : lazyBool (_ : sourceProgramParseAnnotatedBinding input) 246 (_ : sourceProgramParsePlainBinding input) (sourceProgramAnnotated? input)) 247 (_ : parserReplyFail 248 (parserDiagnostic 2 sourceTokenAssign t t t) input false false) 249 (sourceProgramDefinitionHead? input) 250 251 sourceProgramParseTokens = 252 parserThen sourceProgramSkipNewlines 253 (parserBind 254 (parserMany 255 (parserBefore sourceProgramParseDefinition sourceProgramSkipNewlines)) 256 (definitions : parserBind 257 (input : lazyResult 258 (diagnostic rest : parserReplyFail diagnostic input false false) 259 (groups unused : parserReplyOk groups input false false) 260 (sourceEquationGroups definitions)) 261 (groups : parserBind 262 (parserOptional 263 (parserBefore sourceGateExpr sourceProgramSkipNewlines)) 264 (final : parserMap (_ : pair groups final) sourceGateEof)))) 265 266 parseGateProgram = parserWithLexer lexGateSource sourceProgramParseTokens 267