From a2097e53d48b3779d92d8de1ae8b923ff8b79811 Mon Sep 17 00:00:00 2001 From: kdx Date: Sun, 22 Jan 2023 22:35:16 +0100 Subject: lex all single char tokens --- README.md | 23 ++++++++++----------- Token.c | 71 ++++++++++++++++++++++++++++++++++++--------------------------- Token.h | 19 ++++++++++++----- lexer.c | 13 ++++++++++-- 4 files changed, 77 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 51695a7..0098b90 100644 --- a/README.md +++ b/README.md @@ -99,21 +99,20 @@ I fucking wanted to make it. * `[ ]` `&=` * `[ ]` `|=` * `[ ]` `^=` -* `[ ]` `+` -* `[ ]` `-` -* `[ ]` `*` -* `[ ]` `/` -* `[ ]` `%` -* `[ ]` `&` -* `[ ]` `|` -* `[ ]` `^` -* `[ ]` `~` -* `[ ]` `$` -* `[ ]` `!` +* `[x]` `+` +* `[x]` `-` +* `[x]` `*` +* `[x]` `/` +* `[x]` `%` +* `[x]` `&` +* `[x]` `|` +* `[x]` `^` +* `[x]` `$` +* `[x]` `!` * `[x]` `==` * `[x]` `!=` * `[x]` `<` -* `[ ]` `>` +* `[x]` `>` * `[x]` `<=` * `[x]` `>=` * `[x]` `||` diff --git a/Token.c b/Token.c index ac549bb..e1e5e50 100644 --- a/Token.c +++ b/Token.c @@ -21,37 +21,48 @@ void token_print(const Token *tok) putchar('\n'); } -const char *token_type_str(unsigned int type) +#define CAS(t) case t: return #t +const char *token_type_str(TokenType type) { switch (type) { - case TOK_WORD: return "TOK_WORD"; - case TOK_STRING: return "TOK_STRING"; - case TOK_INTEGER: return "TOK_INTEGER"; - case TOK_PAREN_OPEN: return "TOK_PAREN_OPEN"; - case TOK_PAREN_CLOS: return "TOK_PAREN_CLOS"; - case TOK_CURL_OPEN: return "TOK_CURL_OPEN"; - case TOK_CURL_CLOS: return "TOK_CURL_CLOS"; - case TOK_SQUAR_OPEN: return "TOK_SQUAR_OPEN"; - case TOK_SQUAR_CLOS: return "TOK_SQUAR_CLOS"; - case TOK_COLON: return "TOK_COLON"; - case TOK_SEMICOLON: return "TOK_SEMICOLON"; - case TOK_ASSIGN: return "TOK_ASSIGN"; - case TOK_COMMA: return "TOK_COMMA"; - case TOK_COMP_LESS: return "TOK_COMP_LESS"; - case TOK_MODULO: return "TOK_MODULO"; - case TOK_MULT: return "TOK_MULT"; - case TOK_COMP_EQ: return "TOK_COMP_EQ"; - case TOK_COMP_NEQ: return "TOK_COMP_NEQ"; - case TOK_COMP_LESSEQ: return "TOK_COMP_LESSEQ"; - case TOK_COMP_MOREEQ: return "TOK_COMP_MOREEQ"; - case TOK_COMP_OR: return "TOK_COMP_OR"; - case TOK_COMP_AND: return "TOK_COMP_AND"; - case TOK_KW_CONST: return "TOK_KW_CONST"; - case TOK_KW_VAR: return "TOK_KW_VAR"; - case TOK_KW_FN: return "TOK_KW_FN"; - case TOK_KW_IF: return "TOK_KW_IF"; - case TOK_KW_ELSE: return "TOK_KW_ELSE"; - case TOK_KW_WHILE: return "TOK_KW_WHILE"; - default: return "TOK_?"; + CAS(TOK_NONE); + CAS(TOK_WORD); + CAS(TOK_STRING); + CAS(TOK_INTEGER); + CAS(TOK_PAREN_OPEN); + CAS(TOK_PAREN_CLOS); + CAS(TOK_CURL_OPEN); + CAS(TOK_CURL_CLOS); + CAS(TOK_SQUAR_OPEN); + CAS(TOK_SQUAR_CLOS); + CAS(TOK_COLON); + CAS(TOK_SEMICOLON); + CAS(TOK_ASSIGN); + CAS(TOK_COMMA); + CAS(TOK_COMP_LESS); + CAS(TOK_COMP_MORE); + CAS(TOK_ADD); + CAS(TOK_SUB); CAS(TOK_MUL); + CAS(TOK_DIV); + CAS(TOK_MOD); + CAS(TOK_AND); + CAS(TOK_OR); + CAS(TOK_XOR); + CAS(TOK_REF); + CAS(TOK_NOT); + CAS(TOK_COMMENT); + CAS(TOK_COMP_EQ); + CAS(TOK_COMP_NEQ); + CAS(TOK_COMP_LESSEQ); + CAS(TOK_COMP_MOREEQ); + CAS(TOK_COMP_OR); + CAS(TOK_COMP_AND); + CAS(TOK_KW_CONST); + CAS(TOK_KW_VAR); + CAS(TOK_KW_FN); + CAS(TOK_KW_IF); + CAS(TOK_KW_ELSE); + CAS(TOK_KW_WHILE); } + return "TOK_?"; } diff --git a/Token.h b/Token.h index 0cd7b21..da135ad 100644 --- a/Token.h +++ b/Token.h @@ -1,7 +1,7 @@ #pragma once #include -enum { +typedef enum TokenType { TOK_NONE, TOK_WORD, TOK_STRING, @@ -18,8 +18,17 @@ enum { TOK_ASSIGN, TOK_COMMA, TOK_COMP_LESS, - TOK_MODULO, - TOK_MULT, + TOK_COMP_MORE, + TOK_ADD, + TOK_SUB, + TOK_MUL, + TOK_DIV, + TOK_MOD, + TOK_AND, + TOK_OR, + TOK_XOR, + TOK_REF, + TOK_NOT, /* double char toks */ TOK_COMMENT, TOK_COMP_EQ, @@ -35,7 +44,7 @@ enum { TOK_KW_IF, TOK_KW_ELSE, TOK_KW_WHILE, -}; +} TokenType; union TokenValue { char c; @@ -54,4 +63,4 @@ typedef struct Token { void token_free(Token *tok); void token_print(const Token *tok); -const char *token_type_str(const unsigned int type); +const char *token_type_str(TokenType type); diff --git a/lexer.c b/lexer.c index ff63bff..19fb41b 100644 --- a/lexer.c +++ b/lexer.c @@ -30,8 +30,17 @@ static unsigned int one_wide_tok(const char *s) case '=': return TOK_ASSIGN; case ',': return TOK_COMMA; case '<': return TOK_COMP_LESS; - case '%': return TOK_MODULO; - case '*': return TOK_MULT; + case '>': return TOK_COMP_MORE; + case '+': return TOK_ADD; + case '-': return TOK_SUB; + case '*': return TOK_MUL; + case '/': return TOK_DIV; + case '%': return TOK_MOD; + case '&': return TOK_AND; + case '|': return TOK_OR; + case '^': return TOK_XOR; + case '$': return TOK_REF; + case '!': return TOK_NOT; default: return TOK_NONE; } } -- cgit v1.2.3