Browse Source

l2_token_kind_name()

master
Martin Dørum 3 years ago
parent
commit
4856e8a711
3 changed files with 42 additions and 8 deletions
  1. 4
    1
      include/lang2/parse/lex.h
  2. 9
    7
      src/main.c
  3. 29
    0
      src/parse/lex.c

+ 4
- 1
include/lang2/parse/lex.h View File

@@ -12,12 +12,14 @@ enum l2_token_kind {
L2_TOK_CLOSE_BRACKET,
L2_TOK_COMMA,
L2_TOK_PERIOD,
L2_TOK_NUMBER,
L2_TOK_EOF,
L2_TOK_NUMBER,
L2_TOK_STRING,
L2_TOK_ERROR,
};

const char *l2_token_kind_name(enum l2_token_kind kind);

struct l2_token {
enum l2_token_kind kind;
int line;
@@ -31,6 +33,7 @@ struct l2_token {

void l2_token_free(struct l2_token *tok);
struct l2_token l2_token_move(struct l2_token *tok);
void l2_token_print(struct l2_token *tok, struct l2_io_writer *w);

struct l2_lexer {
struct l2_token currtok;

+ 9
- 7
src/main.c View File

@@ -1,17 +1,19 @@
#include "io.h"
#include "parse/lex.h"

int main() {
struct l2_io_mem_reader r = { l2_io_mem_read };
r.mem = "Hello World";
r.mem = " \"Hello\", [], {}.";
r.len = strlen(r.mem);

struct l2_bufio_reader rb;
l2_bufio_reader_init(&rb, &r.r);
struct l2_lexer lexer;
l2_lexer_init(&lexer, &r.r);

while (1) {
int ch = l2_bufio_get(&rb);
if (ch == EOF) break;
printf("%c", (char)ch);
struct l2_token *tok = l2_lexer_get(&lexer);
printf("%s\n", l2_token_kind_name(tok->kind));
if (tok->kind == L2_TOK_EOF) {
break;
}
}
printf("\n");
}

+ 29
- 0
src/parse/lex.c View File

@@ -2,6 +2,35 @@

#include <stdlib.h>

const char *l2_token_kind_name(enum l2_token_kind kind) {
switch (kind) {
case L2_TOK_OPEN_PAREN:
return "open-paren";
case L2_TOK_CLOSE_PAREN:
return "close-paren";
case L2_TOK_OPEN_BRACE:
return "open-brace";
case L2_TOK_CLOSE_BRACE:
return "close-brace";
case L2_TOK_OPEN_BRACKET:
return "open-bracket";
case L2_TOK_CLOSE_BRACKET:
return "close-bracket";
case L2_TOK_COMMA:
return "comma";
case L2_TOK_PERIOD:
return "period";
case L2_TOK_EOF:
return "end-of-file";
case L2_TOK_NUMBER:
return "number";
case L2_TOK_STRING:
return "string";
case L2_TOK_ERROR:
return "error";
}
}

void l2_token_free(struct l2_token *tok) {
if (tok->kind == L2_TOK_STRING) {
free(tok->v.str);

Loading…
Cancel
Save