aboutsummaryrefslogtreecommitdiff
path: root/src/tokens.h
diff options
context:
space:
mode:
authorMustafa Quraish <[email protected]>2022-01-30 01:19:54 -0500
committerMustafa Quraish <[email protected]>2022-01-30 01:19:54 -0500
commit5b87ec6ef2b84f1d319e5376bcf9eedea9829d79 (patch)
treef1afa80f034a1cd73192510046978435252e1160 /src/tokens.h
parentRemove return-0 example (diff)
downloadcup-5b87ec6ef2b84f1d319e5376bcf9eedea9829d79.tar.xz
cup-5b87ec6ef2b84f1d319e5376bcf9eedea9829d79.zip
Rename `cup` directory to `src`
Diffstat (limited to 'src/tokens.h')
-rw-r--r--src/tokens.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/tokens.h b/src/tokens.h
new file mode 100644
index 0000000..44f5e6e
--- /dev/null
+++ b/src/tokens.h
@@ -0,0 +1,83 @@
+#pragma once
+
+#include "common.h"
+#include <stdio.h>
+
+#define ENUM_TOKENS(F) \
+ F(TOKEN_AMPERSAND, "&") \
+ F(TOKEN_AND, "&&") \
+ F(TOKEN_ASSIGN, "=") \
+ F(TOKEN_BAR, "|") \
+ F(TOKEN_CLOSE_BRACE, "}") \
+ F(TOKEN_CLOSE_PAREN, ")") \
+ F(TOKEN_COLON, ":") \
+ F(TOKEN_COMMA, ",") \
+ F(TOKEN_ELSE, "else") \
+ F(TOKEN_EOF, "EOF") \
+ F(TOKEN_EQ, "==") \
+ F(TOKEN_EXCLAMATION, "!") \
+ F(TOKEN_FN, "fn") \
+ F(TOKEN_FOR, "for") \
+ F(TOKEN_GEQ, ">=") \
+ F(TOKEN_GT, ">") \
+ F(TOKEN_IDENTIFIER, "identifier") \
+ F(TOKEN_IF, "if") \
+ F(TOKEN_INT, "int") \
+ F(TOKEN_INTLIT, "integer literal") \
+ F(TOKEN_LEQ, "<=") \
+ F(TOKEN_LSHIFT, "<<") \
+ F(TOKEN_LET, "let") \
+ F(TOKEN_LT, "<") \
+ F(TOKEN_MINUS, "-") \
+ F(TOKEN_MINUSEQUALS, "-=") \
+ F(TOKEN_MINUSMINUS, "--") \
+ F(TOKEN_NEQ, "!=") \
+ F(TOKEN_OPEN_BRACE, "{") \
+ F(TOKEN_OPEN_PAREN, "(") \
+ F(TOKEN_OR, "||") \
+ F(TOKEN_PERCENT, "%") \
+ F(TOKEN_PLUS, "+") \
+ F(TOKEN_PLUSEQUALS, "+=") \
+ F(TOKEN_PLUSPLUS, "++") \
+ F(TOKEN_QUESTION, "?") \
+ F(TOKEN_RETURN, "return") \
+ F(TOKEN_RSHIFT, ">>") \
+ F(TOKEN_SEMICOLON, ";") \
+ F(TOKEN_SLASH, "/") \
+ F(TOKEN_STAR, "*") \
+ F(TOKEN_STRINGLIT, "string literal") \
+ F(TOKEN_TILDE, "~") \
+ F(TOKEN_WHILE, "while") \
+ F(TOKEN_XOR, "^")
+
+typedef enum {
+#define ENUM_TOKEN(name, str) name,
+ ENUM_TOKENS(ENUM_TOKEN)
+#undef ENUM_TOKEN
+} TokenType;
+
+typedef struct {
+ char *filename;
+ int line, col;
+} Location;
+
+void Location_print(FILE *f, Location loc);
+
+typedef struct {
+ TokenType type;
+ Location loc;
+ union tokens {
+ i64 as_int;
+ char *as_string;
+ char as_char;
+ } value;
+} Token;
+
+char *token_type_to_str(TokenType type);
+
+Token Token_from_type(TokenType type, Location loc);
+Token Token_from_int(i64 value, Location loc);
+Token Token_from_string(char *value, Location loc);
+Token Token_from_identifier(char *value, Location loc);
+
+void Token_print(FILE *f, Token *token); \ No newline at end of file