Skip to main content

src/webql/compiler/lexer/lex_upper_identifier.gleam

import webql/compiler/lexer/token
import webql/compiler/source

/// Lexes upper identifiers.
pub fn lex(bytes: BitArray, start: Int, size: Int) -> #(token.Token, BitArray) {
  lex_upper_identifier(bytes, start, size)
}

// PRIVATE FUNCTIONS
// =================
fn lex_upper_identifier(bytes: BitArray, start: Int, size: Int) {
  case bytes {
    <<"A", rest:bytes>>
    | <<"B", rest:bytes>>
    | <<"C", rest:bytes>>
    | <<"D", rest:bytes>>
    | <<"E", rest:bytes>>
    | <<"F", rest:bytes>>
    | <<"G", rest:bytes>>
    | <<"H", rest:bytes>>
    | <<"I", rest:bytes>>
    | <<"J", rest:bytes>>
    | <<"K", rest:bytes>>
    | <<"L", rest:bytes>>
    | <<"M", rest:bytes>>
    | <<"N", rest:bytes>>
    | <<"O", rest:bytes>>
    | <<"P", rest:bytes>>
    | <<"Q", rest:bytes>>
    | <<"R", rest:bytes>>
    | <<"S", rest:bytes>>
    | <<"T", rest:bytes>>
    | <<"U", rest:bytes>>
    | <<"V", rest:bytes>>
    | <<"W", rest:bytes>>
    | <<"X", rest:bytes>>
    | <<"Y", rest:bytes>>
    | <<"Z", rest:bytes>>
    | <<"a", rest:bytes>>
    | <<"b", rest:bytes>>
    | <<"c", rest:bytes>>
    | <<"d", rest:bytes>>
    | <<"e", rest:bytes>>
    | <<"f", rest:bytes>>
    | <<"g", rest:bytes>>
    | <<"h", rest:bytes>>
    | <<"i", rest:bytes>>
    | <<"j", rest:bytes>>
    | <<"k", rest:bytes>>
    | <<"l", rest:bytes>>
    | <<"m", rest:bytes>>
    | <<"n", rest:bytes>>
    | <<"o", rest:bytes>>
    | <<"p", rest:bytes>>
    | <<"q", rest:bytes>>
    | <<"r", rest:bytes>>
    | <<"s", rest:bytes>>
    | <<"t", rest:bytes>>
    | <<"u", rest:bytes>>
    | <<"v", rest:bytes>>
    | <<"w", rest:bytes>>
    | <<"x", rest:bytes>>
    | <<"y", rest:bytes>>
    | <<"z", rest:bytes>>
    | <<"0", rest:bytes>>
    | <<"1", rest:bytes>>
    | <<"2", rest:bytes>>
    | <<"3", rest:bytes>>
    | <<"4", rest:bytes>>
    | <<"5", rest:bytes>>
    | <<"6", rest:bytes>>
    | <<"7", rest:bytes>>
    | <<"8", rest:bytes>>
    | <<"9", rest:bytes>> -> {
      lex_upper_identifier(rest, start, size + 1)
    }

    _rest -> {
      let end = start + size

      #(
        token.Token(
          kind: token.UpperIdentifier,
          span: source.Span(start: start, end: end),
        ),
        bytes,
      )
    }
  }
}