public inbox for ~johnnyrichard/olang-devel@lists.sr.ht
 help / color / mirror / code / Atom feed
c5a342a080755524c9ba9e4dbbd412dca60bde39 blob 2313 bytes (raw)

  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
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
 
/*
 * Copyright (C) 2024 olang maintainers
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
#ifndef LEXER_H
#define LEXER_H

#include "source_code.h"
#include "string_view.h"
#include <stdint.h>
#include <stdio.h>

typedef struct lexer_cursor
{
    size_t offset;
    size_t row;
    size_t bol;
} lexer_cursor_t;

typedef struct lexer
{
    source_code_t src;
    lexer_cursor_t cur;
} lexer_t;

typedef enum token_kind
{
    TOKEN_UNKNOWN,
    TOKEN_ID,
    TOKEN_NUMBER,

    // Keywords
    TOKEN_FN,
    TOKEN_RETURN,
    TOKEN_IF,
    TOKEN_ELSE,
    TOKEN_VAR,

    // Equality operators
    TOKEN_CMP_EQ,
    TOKEN_CMP_NEQ,
    TOKEN_CMP_LEQ,
    TOKEN_CMP_GEQ,

    // Logical Operators
    TOKEN_LOGICAL_OR,
    TOKEN_LOGICAL_AND,

    // Bitwise Operators
    TOKEN_BITWISE_LSHIFT,
    TOKEN_BITWISE_RSHIFT,

    // Single char
    TOKEN_BANG,
    TOKEN_GT,
    TOKEN_LT,
    TOKEN_PERCENT,
    TOKEN_AND,
    TOKEN_PIPE,
    TOKEN_CIRCUMFLEX,
    TOKEN_EQ,
    TOKEN_PLUS,
    TOKEN_DASH,
    TOKEN_SLASH,
    TOKEN_STAR,
    TOKEN_LF,
    TOKEN_OPAREN,
    TOKEN_CPAREN,
    TOKEN_COLON,
    TOKEN_COMMA,
    TOKEN_OCURLY,
    TOKEN_CCURLY,
    TOKEN_EOF
} token_kind_t;

typedef struct token
{
    token_kind_t kind;
    string_view_t value;
    lexer_cursor_t cur;
} token_t;

void
lexer_init(lexer_t *lexer, source_code_t src);

void
lexer_next_token(lexer_t *lexer, token_t *token);

void
lexer_peek_next(lexer_t *lexer, token_t *token);

void
lexer_lookahead(lexer_t *lexer, token_t *token, size_t n);

char *
token_kind_to_cstr(token_kind_t kind);

bool
token_kind_is_binary_op(token_kind_t kind);

string_view_t
lexer_get_token_line(lexer_t *lexer, token_t *token);

#endif /* LEXER_H */
debug log:

solving c5a342a ...
found c5a342a in https://git.johnnyrichard.com/olang.git

Code repositories for project(s) associated with this public inbox

	https://git.johnnyrichard.com/olang.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox