0f422a051593affb5083641cab1316a250b6302ebd81fd84ea582b8168ca4865.tri (10955B)
1 !import prelude * 2 !import parser * 3 !import lexer * 4 !import native_math as N 5 !export * 6 7 -- Located source profile: t, ASCII names, literals, lists, grouping, 8 -- application, lambdas, local bindings, pipes, do blocks, and definitions. 9 -- Indentation-sensitive bodies use token columns, not rewritten source. 10 -- External names are supplied as resolved trees, not lexed as imports here. 11 -- Positions are one-based line/column and zero-based character offset. 12 sourcePosition = lexerPosition 13 sourcePositionLine = lexerPositionLine 14 sourcePositionColumn = lexerPositionColumn 15 sourcePositionOffset = lexerPositionOffset 16 sourceStart = lexerStart 17 sourcePositionAdvance = lexerAdvance 18 19 sourceToken = lexerToken 20 sourceTokenKind = lexerTokenKind 21 sourceTokenPayload = lexerTokenPayload 22 sourceTokenStart = lexerTokenStart 23 sourceTokenEnd = lexerTokenEnd 24 25 sourceTokenT = 1 26 sourceTokenName = 2 27 sourceTokenOpen = 3 28 sourceTokenClose = 4 29 sourceTokenColon = 5 30 sourceTokenNewline = 6 31 sourceTokenNumber = 7 32 sourceTokenString = 8 33 sourceTokenLeftBracket = 9 34 sourceTokenRightBracket = 10 35 sourceTokenAssign = 11 36 sourceTokenLet = 12 37 sourceTokenIn = 13 38 sourceTokenWhere = 14 39 sourceTokenPipeBackward = 15 40 sourceTokenPipeForward = 16 41 sourceTokenDo = 17 42 sourceTokenBindArrow = 18 43 sourceTokenAt = 19 44 sourceTokenComma = 20 45 sourceTokenBar = 21 46 sourceTokenLeftBrace = 22 47 sourceTokenRightBrace = 23 48 sourceTokenPin = 24 49 50 -- Character codes and decimal accumulators are canonical natural numbers. 51 -- Use binary TC math here; general tree equality and position arithmetic remain 52 -- the prelude operations. The math module is namespaced to avoid shadowing them. 53 sourceAsciiLetter? character = N.letter character 54 sourceAsciiDigit? character = N.digit character 55 56 sourceNameStart? character = 57 or? (sourceAsciiLetter? character) (equal? character 95) 58 59 sourceNameContinue? character = 60 or? (sourceNameStart? character) 61 (or? (sourceAsciiDigit? character) 62 (or? (equal? character 45) 63 (or? (equal? character 63) 64 (or? (equal? character 36) 65 (or? (equal? character 37) 66 (or? (equal? character 39) (equal? character 46))))))) 67 68 sourceGateSpace? character = equal? character 32 69 70 sourceScanName input position first = 71 lexerMapScan reverse 72 (lexerScanWhile input position (pair first t) sourceNameContinue? 73 (reversed character : pair character reversed)) 74 75 -- The character already consumed is the first decimal digit. Leading zeroes 76 -- are accepted. The generic scan also preserves the first non-digit. 77 sourceScanNumber input position first = 78 lexerScanWhile input position (N.subtract first 48) sourceAsciiDigit? 79 (value character : N.decimal value (N.subtract character 48)) 80 81 -- Leave the newline in the input so it remains an explicit gate token. 82 sourceSkipLineComment input position = 83 lexerScanWhile input position t 84 (character : not? (equal? character 10)) 85 (ignored character : t) 86 87 sourceGateEscape character = 88 lexerDispatch 89 [ (pair (c : equal? c 110) (c : just 10)) 90 (pair (c : equal? c 116) (c : just 9)) 91 (pair (c : equal? c 114) (c : just 13)) 92 (pair (c : equal? c 102) (c : just 12)) 93 (pair (c : equal? c 98) (c : just 8)) 94 (pair (c : equal? c 92) (c : just 92)) 95 (pair (c : equal? c 34) (c : just 34)) 96 (pair (c : equal? c 39) (c : just 39)) 97 ] 98 (c : nothing) character 99 100 sourceScanString input position start = 101 lexerScanQuoted input position 34 92 sourceGateEscape 102 (parserDiagnostic 5 34 t start t) 103 (character location : parserDiagnostic 6 34 character location t) 104 105 sourceGateToken character start end = 106 lazyBool 107 (_ : sourceToken sourceTokenOpen t start end) 108 (_ : lazyBool 109 (_ : sourceToken sourceTokenClose t start end) 110 (_ : lazyBool 111 (_ : sourceToken sourceTokenColon t start end) 112 (_ : lazyBool 113 (_ : sourceToken sourceTokenNewline t start end) 114 (_ : lazyBool 115 (_ : sourceToken sourceTokenLeftBracket t start end) 116 (_ : lazyBool 117 (_ : sourceToken sourceTokenRightBracket t start end) 118 (_ : lazyBool 119 (_ : sourceToken sourceTokenAssign t start end) 120 (_ : lazyBool (_ : sourceToken sourceTokenComma t start end) 121 (_ : lazyBool (_ : sourceToken sourceTokenLeftBrace t start end) 122 (_ : lazyBool (_ : sourceToken sourceTokenRightBrace t start end) 123 (_ : lazyBool (_ : sourceToken sourceTokenPin t start end) 124 (_ : sourceToken sourceTokenAt t start end) 125 (equal? character 94)) (equal? character 125)) 126 (equal? character 123)) (equal? character 44)) 127 (equal? character 61)) 128 (equal? character 93)) 129 (equal? character 91)) 130 (equal? character 10)) 131 (equal? character 58)) 132 (equal? character 41)) 133 (equal? character 40) 134 135 sourceGatePunctuation? character = 136 or? (equal? character 40) 137 (or? (equal? character 41) 138 (or? (equal? character 58) 139 (or? (equal? character 10) 140 (or? (equal? character 91) 141 (or? (equal? character 93) 142 (or? (equal? character 61) 143 (or? (equal? character 64) 144 (or? (equal? character 44) 145 (or? (equal? character 123) 146 (or? (equal? character 125) (equal? character 94))))))))))) 147 148 sourceLexGateDash self input rest position reversed = 149 lazyList 150 (_ : parserReplyFail 151 (parserDiagnostic 4 t 45 position t) input 152 (not? (isZero_? (sourcePositionOffset position))) false) 153 (next tail : 154 lazyBool 155 (_ : lexerResumeScan 156 (sourceSkipLineComment tail 157 (sourcePositionAdvance (sourcePositionAdvance position 45) 45)) 158 (remaining end : self remaining end reversed)) 159 (_ : parserReplyFail 160 (parserDiagnostic 4 t 45 position t) input 161 (not? (isZero_? (sourcePositionOffset position))) false) 162 (equal? next 45)) 163 rest 164 165 sourceLexGateBlock self input rest position reversed = 166 lazyList 167 (_ : self rest (sourcePositionAdvance position 124) 168 (pair (sourceToken sourceTokenBar t position 169 (sourcePositionAdvance position 124)) reversed)) 170 (next tail : 171 lazyBool 172 (_ : lexerResumeScan 173 (lexerSkipUntilPair tail 174 (sourcePositionAdvance (sourcePositionAdvance position 124) 45) 175 45 124 (parserDiagnostic 5 "-|" t position t)) 176 (remaining end : self remaining end reversed)) 177 (_ : lazyBool 178 (_ : self tail (sourcePositionAdvance 179 (sourcePositionAdvance position 124) 62) 180 (pair (sourceToken sourceTokenPipeForward t position 181 (sourcePositionAdvance 182 (sourcePositionAdvance position 124) 62)) reversed)) 183 (_ : self rest (sourcePositionAdvance position 124) 184 (pair (sourceToken sourceTokenBar t position 185 (sourcePositionAdvance position 124)) reversed)) 186 (equal? next 62)) 187 (equal? next 45)) 188 rest 189 190 sourceLexGatePipeBackward self input rest position reversed = 191 lazyList 192 (_ : parserReplyFail 193 (parserDiagnostic 4 t 60 position t) input 194 (not? (isZero_? (sourcePositionOffset position))) false) 195 (next tail : 196 lazyBool 197 (_ : self tail (sourcePositionAdvance 198 (sourcePositionAdvance position 60) 124) 199 (pair (sourceToken sourceTokenPipeBackward t position 200 (sourcePositionAdvance 201 (sourcePositionAdvance position 60) 124)) reversed)) 202 (_ : lazyBool 203 (_ : self tail (sourcePositionAdvance 204 (sourcePositionAdvance position 60) 45) 205 (pair (sourceToken sourceTokenBindArrow t position 206 (sourcePositionAdvance 207 (sourcePositionAdvance position 60) 45)) reversed)) 208 (_ : parserReplyFail 209 (parserDiagnostic 4 t 60 position t) input 210 (not? (isZero_? (sourcePositionOffset position))) false) 211 (equal? next 45)) 212 (equal? next 124)) 213 rest 214 215 sourceGateNameClassify name = 216 pair 217 (lazyBool 218 (_ : sourceTokenT) 219 (_ : lazyBool 220 (_ : sourceTokenLet) 221 (_ : lazyBool 222 (_ : sourceTokenIn) 223 (_ : lazyBool 224 (_ : sourceTokenWhere) 225 (_ : lazyBool 226 (_ : sourceTokenDo) 227 (_ : sourceTokenName) 228 (equal? name "do")) 229 (equal? name "where")) 230 (equal? name "in")) 231 (equal? name "let")) 232 (equal? name "t")) 233 name 234 235 sourceLexGateName self rest position reversed character = 236 lexerEmitScan 237 (sourceScanName rest (sourcePositionAdvance position character) character) 238 position reversed sourceGateNameClassify 239 (remaining end tokens : self remaining end tokens) 240 241 sourceLexGateNumber self rest position reversed character = 242 lexerEmitScan 243 (sourceScanNumber rest (sourcePositionAdvance position character) character) 244 position reversed (value : pair sourceTokenNumber value) 245 (remaining end tokens : self remaining end tokens) 246 247 sourceLexGateString self rest position reversed character = 248 lexerEmitScan 249 (sourceScanString rest (sourcePositionAdvance position character) position) 250 position reversed (value : pair sourceTokenString value) 251 (remaining end tokens : self remaining end tokens) 252 253 sourceLexGatePunctuation self rest position reversed character = 254 self rest (sourcePositionAdvance position character) 255 (pair (sourceGateToken character position 256 (sourcePositionAdvance position character)) reversed) 257 258 sourceLexGate_ self input position reversed = 259 lazyList 260 (_ : parserReplyOk (reverse reversed) input 261 (not? (isZero_? (sourcePositionOffset position))) false) 262 (character rest : 263 lexerDispatch 264 [ (pair sourceGateSpace? 265 (c : self rest (sourcePositionAdvance position c) reversed)) 266 (pair (c : equal? c 45) 267 (c : sourceLexGateDash self input rest position reversed)) 268 (pair (c : equal? c 124) 269 (c : sourceLexGateBlock self input rest position reversed)) 270 (pair (c : equal? c 60) 271 (c : sourceLexGatePipeBackward self input rest position reversed)) 272 (pair (c : equal? c 34) 273 (c : sourceLexGateString self rest position reversed c)) 274 (pair sourceAsciiDigit? 275 (c : sourceLexGateNumber self rest position reversed c)) 276 (pair sourceNameStart? 277 (c : sourceLexGateName self rest position reversed c)) 278 (pair sourceGatePunctuation? 279 (c : sourceLexGatePunctuation self rest position reversed c)) 280 ] 281 (c : parserReplyFail 282 (parserDiagnostic 4 t c position t) input 283 (not? (isZero_? (sourcePositionOffset position))) false) 284 character) 285 input 286 287 lexGateSource = (input : y sourceLexGate_ input sourceStart t)