b02775615a2af5e46b6588674a70ccbe111bb99c99afa860886a035f9a07b560.tri (11237B)
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 sourceTokenCase = 25 50 sourceTokenOf = 26 51 sourceTokenRec = 27 52 53 -- Character codes and decimal accumulators are canonical natural numbers. 54 -- Use binary TC math here; general tree equality and position arithmetic remain 55 -- the prelude operations. The math module is namespaced to avoid shadowing them. 56 sourceAsciiLetter? character = N.letter character 57 sourceAsciiDigit? character = N.digit character 58 59 sourceNameStart? character = 60 or? (sourceAsciiLetter? character) (equal? character 95) 61 62 sourceNameContinue? character = 63 or? (sourceNameStart? character) 64 (or? (sourceAsciiDigit? character) 65 (or? (equal? character 45) 66 (or? (equal? character 63) 67 (or? (equal? character 36) 68 (or? (equal? character 37) 69 (or? (equal? character 39) (equal? character 46))))))) 70 71 sourceGateSpace? character = equal? character 32 72 73 sourceScanName input position first = 74 lexerMapScan reverse 75 (lexerScanWhile input position (pair first t) sourceNameContinue? 76 (reversed character : pair character reversed)) 77 78 -- The character already consumed is the first decimal digit. Leading zeroes 79 -- are accepted. The generic scan also preserves the first non-digit. 80 sourceScanNumber input position first = 81 lexerScanWhile input position (N.subtract first 48) sourceAsciiDigit? 82 (value character : N.decimal value (N.subtract character 48)) 83 84 -- Leave the newline in the input so it remains an explicit gate token. 85 sourceSkipLineComment input position = 86 lexerScanWhile input position t 87 (character : not? (equal? character 10)) 88 (ignored character : t) 89 90 sourceGateEscape character = 91 lexerDispatch 92 [ (pair (c : equal? c 110) (c : just 10)) 93 (pair (c : equal? c 116) (c : just 9)) 94 (pair (c : equal? c 114) (c : just 13)) 95 (pair (c : equal? c 102) (c : just 12)) 96 (pair (c : equal? c 98) (c : just 8)) 97 (pair (c : equal? c 92) (c : just 92)) 98 (pair (c : equal? c 34) (c : just 34)) 99 (pair (c : equal? c 39) (c : just 39)) 100 ] 101 (c : nothing) character 102 103 sourceScanString input position start = 104 lexerScanQuoted input position 34 92 sourceGateEscape 105 (parserDiagnostic 5 34 t start t) 106 (character location : parserDiagnostic 6 34 character location t) 107 108 sourceGateToken character start end = 109 lazyBool 110 (_ : sourceToken sourceTokenOpen t start end) 111 (_ : lazyBool 112 (_ : sourceToken sourceTokenClose t start end) 113 (_ : lazyBool 114 (_ : sourceToken sourceTokenColon t start end) 115 (_ : lazyBool 116 (_ : sourceToken sourceTokenNewline t start end) 117 (_ : lazyBool 118 (_ : sourceToken sourceTokenLeftBracket t start end) 119 (_ : lazyBool 120 (_ : sourceToken sourceTokenRightBracket t start end) 121 (_ : lazyBool 122 (_ : sourceToken sourceTokenAssign t start end) 123 (_ : lazyBool (_ : sourceToken sourceTokenComma t start end) 124 (_ : lazyBool (_ : sourceToken sourceTokenLeftBrace t start end) 125 (_ : lazyBool (_ : sourceToken sourceTokenRightBrace t start end) 126 (_ : lazyBool (_ : sourceToken sourceTokenPin t start end) 127 (_ : sourceToken sourceTokenAt t start end) 128 (equal? character 94)) (equal? character 125)) 129 (equal? character 123)) (equal? character 44)) 130 (equal? character 61)) 131 (equal? character 93)) 132 (equal? character 91)) 133 (equal? character 10)) 134 (equal? character 58)) 135 (equal? character 41)) 136 (equal? character 40) 137 138 sourceGatePunctuation? character = 139 or? (equal? character 40) 140 (or? (equal? character 41) 141 (or? (equal? character 58) 142 (or? (equal? character 10) 143 (or? (equal? character 91) 144 (or? (equal? character 93) 145 (or? (equal? character 61) 146 (or? (equal? character 64) 147 (or? (equal? character 44) 148 (or? (equal? character 123) 149 (or? (equal? character 125) (equal? character 94))))))))))) 150 151 sourceLexGateDash self input rest position reversed = 152 lazyList 153 (_ : parserReplyFail 154 (parserDiagnostic 4 t 45 position t) input 155 (not? (isZero_? (sourcePositionOffset position))) false) 156 (next tail : 157 lazyBool 158 (_ : lexerResumeScan 159 (sourceSkipLineComment tail 160 (sourcePositionAdvance (sourcePositionAdvance position 45) 45)) 161 (remaining end : self remaining end reversed)) 162 (_ : parserReplyFail 163 (parserDiagnostic 4 t 45 position t) input 164 (not? (isZero_? (sourcePositionOffset position))) false) 165 (equal? next 45)) 166 rest 167 168 sourceLexGateBlock self input rest position reversed = 169 lazyList 170 (_ : self rest (sourcePositionAdvance position 124) 171 (pair (sourceToken sourceTokenBar t position 172 (sourcePositionAdvance position 124)) reversed)) 173 (next tail : 174 lazyBool 175 (_ : lexerResumeScan 176 (lexerSkipUntilPair tail 177 (sourcePositionAdvance (sourcePositionAdvance position 124) 45) 178 45 124 (parserDiagnostic 5 "-|" t position t)) 179 (remaining end : self remaining end reversed)) 180 (_ : lazyBool 181 (_ : self tail (sourcePositionAdvance 182 (sourcePositionAdvance position 124) 62) 183 (pair (sourceToken sourceTokenPipeForward t position 184 (sourcePositionAdvance 185 (sourcePositionAdvance position 124) 62)) reversed)) 186 (_ : self rest (sourcePositionAdvance position 124) 187 (pair (sourceToken sourceTokenBar t position 188 (sourcePositionAdvance position 124)) reversed)) 189 (equal? next 62)) 190 (equal? next 45)) 191 rest 192 193 sourceLexGatePipeBackward self input rest position reversed = 194 lazyList 195 (_ : parserReplyFail 196 (parserDiagnostic 4 t 60 position t) input 197 (not? (isZero_? (sourcePositionOffset position))) false) 198 (next tail : 199 lazyBool 200 (_ : self tail (sourcePositionAdvance 201 (sourcePositionAdvance position 60) 124) 202 (pair (sourceToken sourceTokenPipeBackward t position 203 (sourcePositionAdvance 204 (sourcePositionAdvance position 60) 124)) reversed)) 205 (_ : lazyBool 206 (_ : self tail (sourcePositionAdvance 207 (sourcePositionAdvance position 60) 45) 208 (pair (sourceToken sourceTokenBindArrow t position 209 (sourcePositionAdvance 210 (sourcePositionAdvance position 60) 45)) reversed)) 211 (_ : parserReplyFail 212 (parserDiagnostic 4 t 60 position t) input 213 (not? (isZero_? (sourcePositionOffset position))) false) 214 (equal? next 45)) 215 (equal? next 124)) 216 rest 217 218 sourceGateNameClassify name = 219 pair 220 (lazyBool 221 (_ : sourceTokenT) 222 (_ : lazyBool 223 (_ : sourceTokenLet) 224 (_ : lazyBool 225 (_ : sourceTokenIn) 226 (_ : lazyBool 227 (_ : sourceTokenWhere) 228 (_ : lazyBool 229 (_ : sourceTokenDo) 230 (_ : lazyBool (_ : sourceTokenCase) 231 (_ : lazyBool (_ : sourceTokenOf) 232 (_ : lazyBool (_ : sourceTokenRec) (_ : sourceTokenName) 233 (equal? name "rec")) (equal? name "of")) (equal? name "case")) 234 (equal? name "do")) 235 (equal? name "where")) 236 (equal? name "in")) 237 (equal? name "let")) 238 (equal? name "t")) 239 name 240 241 sourceLexGateName self rest position reversed character = 242 lexerEmitScan 243 (sourceScanName rest (sourcePositionAdvance position character) character) 244 position reversed sourceGateNameClassify 245 (remaining end tokens : self remaining end tokens) 246 247 sourceLexGateNumber self rest position reversed character = 248 lexerEmitScan 249 (sourceScanNumber rest (sourcePositionAdvance position character) character) 250 position reversed (value : pair sourceTokenNumber value) 251 (remaining end tokens : self remaining end tokens) 252 253 sourceLexGateString self rest position reversed character = 254 lexerEmitScan 255 (sourceScanString rest (sourcePositionAdvance position character) position) 256 position reversed (value : pair sourceTokenString value) 257 (remaining end tokens : self remaining end tokens) 258 259 sourceLexGatePunctuation self rest position reversed character = 260 self rest (sourcePositionAdvance position character) 261 (pair (sourceGateToken character position 262 (sourcePositionAdvance position character)) reversed) 263 264 sourceLexGate_ self input position reversed = 265 lazyList 266 (_ : parserReplyOk (reverse reversed) input 267 (not? (isZero_? (sourcePositionOffset position))) false) 268 (character rest : 269 lexerDispatch 270 [ (pair sourceGateSpace? 271 (c : self rest (sourcePositionAdvance position c) reversed)) 272 (pair (c : equal? c 45) 273 (c : sourceLexGateDash self input rest position reversed)) 274 (pair (c : equal? c 124) 275 (c : sourceLexGateBlock self input rest position reversed)) 276 (pair (c : equal? c 60) 277 (c : sourceLexGatePipeBackward self input rest position reversed)) 278 (pair (c : equal? c 34) 279 (c : sourceLexGateString self rest position reversed c)) 280 (pair sourceAsciiDigit? 281 (c : sourceLexGateNumber self rest position reversed c)) 282 (pair sourceNameStart? 283 (c : sourceLexGateName self rest position reversed c)) 284 (pair sourceGatePunctuation? 285 (c : sourceLexGatePunctuation self rest position reversed c)) 286 ] 287 (c : parserReplyFail 288 (parserDiagnostic 4 t c position t) input 289 (not? (isZero_? (sourcePositionOffset position))) false) 290 character) 291 input 292 293 lexGateSource = (input : y sourceLexGate_ input sourceStart t)