tricu

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

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)