@@ -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; |
@@ -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"); | |||
} |
@@ -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); |