File: parser_2.civet

package info (click to toggle)
cloc 2.04-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 7,776 kB
  • sloc: perl: 29,368; cpp: 1,219; ansic: 334; asm: 267; makefile: 240; sh: 186; sql: 144; java: 136; ruby: 111; cs: 104; python: 84; pascal: 52; lisp: 50; cobol: 35; f90: 35; haskell: 35; objc: 25; php: 22; javascript: 15; fortran: 9; ml: 8; xml: 7; tcl: 2
file content (37 lines) | stat: -rw-r--r-- 1,429 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
civet coffeeComment
{ fail } from node:assert
{ tokens, type Token } from ./tokens.civet
           /*
type * as Ast from ./astTypes.civet
assert from ./assert.civet
           */

/// TokenType ::= keyof typeof tokens
/// tokenEntries := Object.entries(tokens) as [TokenType, Token][]

class TokenStream <: Iterable<[string, TokenType, readonly [number, number]]>
    #sourceLocation = [1, 1] as tuple
    @(#program: string)

    :iterator() ###
        :outer while #program# ###
            for [type, token] of tokenEntries
                length := token.matchLength #program
            /// if length > 0
            //      chunk := #program[..<length]        // comment
            ///     #program |>= &[length<=..]
            ///     yield [chunk, type, #sourceLocation] as tuple
            ///     linesInChunk := chunk.split '\n'
            //      if linesInChunk# > 1        // comment
                        #sourceLocation.0 += linesInChunk# - 1
                        #sourceLocation.1 = 1
                    #sourceLocation.1 += linesInChunk.-1#
                    continue outer
            throw new SyntaxError
                `Unrecognized token starting with '${#program.0}' at input:${#sourceLocation.join ':'}`

#function collectUntil<T>(iter: Iterator<T>, pred: (arg: T) => boolean)
#    loop
#        next := iter.next()
#        break if next.done or pred next.value
#        yield next.value