tricu

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

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)