summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kdx@42l.fr>2023-01-22 22:35:16 +0100
committerkdx <kdx@42l.fr>2023-01-22 22:35:16 +0100
commita2097e53d48b3779d92d8de1ae8b923ff8b79811 (patch)
tree28da6a4c169fddb75657412e501a1e15947bef2f
parent7f46f6eb685a9baef491b714aa940e199d446ee1 (diff)
downloadgolem-a2097e53d48b3779d92d8de1ae8b923ff8b79811.tar.gz
lex all single char tokens
-rw-r--r--README.md23
-rw-r--r--Token.c71
-rw-r--r--Token.h19
-rw-r--r--lexer.c13
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 <stdbool.h>
-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;
}
}