aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/lexer
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/lexer')
-rw-r--r--src/compiler/lexer/lexer.c56
-rw-r--r--src/compiler/lexer/lexer.h4
2 files changed, 33 insertions, 27 deletions
diff --git a/src/compiler/lexer/lexer.c b/src/compiler/lexer/lexer.c
index eee5ec3..b48be3c 100644
--- a/src/compiler/lexer/lexer.c
+++ b/src/compiler/lexer/lexer.c
@@ -3,13 +3,11 @@
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include <utils/memory/memory.h>
const char *TOKEN_STRINGS[] = {
"TOKEN_NONE",
"TOKEN_IDENTIFIER",
- "TOKEN_KEYWORD_PRINT",
"TOKEN_NUMBER",
"TOKEN_STRING",
"TOKEN_OPERATOR",
@@ -25,12 +23,8 @@ const char *TOKEN_STRINGS[] = {
"TOKEN_PARSED",
};
-static const char *KEYWORDS_STRINGS[] = {
- "print",
-};
-static const Token KEYWORDS_TOKENS[] = {
- TOKEN_KEYWORD_PRINT,
-};
+static const char *KEYWORDS_STRINGS[] = {};
+static const Token KEYWORDS_TOKENS[] = {};
static const size_t KEYWORDS_SIZE = sizeof(KEYWORDS_STRINGS) / sizeof(char *);
static const char *OPERATORS_STRINGS[] = {
@@ -46,7 +40,7 @@ static const Token OPERATORS_TOKENS[] = {
TOKEN_OPERATOR_COLON,
TOKEN_OPERATOR_EOL,
};
-static const size_t OPERATOR_SIZE = sizeof(OPERATORS_STRINGS) / sizeof(char *);
+static const size_t OPERATORS_SIZE = sizeof(OPERATORS_STRINGS) / sizeof(char *);
void printNodes(Nodes nodes) {
for (size_t i = 0; i < nodes.size; ++i) {
@@ -174,7 +168,7 @@ Nodes lexer(char const *restrict str) {
const char current = str[i];
if (current == c) {
break;
- }else if(current == '\\'){
+ } else if (current == '\\') {
++i;
} else if (current == '\0') {
fprintf(stderr, "expected %c to end\n", c);
@@ -311,27 +305,37 @@ bool isOperator(char c) {
bool isSymbol(char c) { return c == '#'; }
-Token getKeyword(char const *strBegin, char const *strEnd) {
+Token getTokenInStrings(char const *strBegin, char const *strEnd,
+ const char *strings[], const Token tokens[],
+ size_t size) {
const size_t strSize = strEnd - strBegin;
- for (size_t i = 0; i < KEYWORDS_SIZE; ++i) {
- const char *search = KEYWORDS_STRINGS[i];
- if (strlen(search) == strSize && strncmp(search, strBegin, strSize) == 0) {
- return KEYWORDS_TOKENS[i];
+ for (size_t i = 0; i < size; ++i) {
+ const char *search = strings[i];
+ // faster than strlen+strncpy
+ for (size_t j = 0;; ++j) {
+ const char searchChar = search[j];
+ if (j == strSize) {
+ if (searchChar == '\0') {
+ return tokens[i];
+ } else {
+ break;
+ }
+ } else if (searchChar == '\0') {
+ break;
+ } else if (searchChar != strBegin[j]) {
+ break;
+ }
}
}
-
return TOKEN_NONE;
}
-Token getOperator(char const *strBegin, char const *strEnd) {
- const size_t strSize = strEnd - strBegin;
-
- for (size_t i = 0; i < OPERATOR_SIZE; ++i) {
- const char *search = OPERATORS_STRINGS[i];
- if (strlen(search) == strSize && strncmp(search, strBegin, strSize) == 0) {
- return OPERATORS_TOKENS[i];
- }
- }
- return TOKEN_NONE;
+Token getKeyword(char const *strBegin, char const *strEnd) {
+ return getTokenInStrings(strBegin, strEnd, KEYWORDS_STRINGS, KEYWORDS_TOKENS,
+ KEYWORDS_SIZE);
+}
+Token getOperator(char const *strBegin, char const *strEnd) {
+ return getTokenInStrings(strBegin, strEnd, OPERATORS_STRINGS,
+ OPERATORS_TOKENS, OPERATORS_SIZE);
}
diff --git a/src/compiler/lexer/lexer.h b/src/compiler/lexer/lexer.h
index d6eef17..802b50c 100644
--- a/src/compiler/lexer/lexer.h
+++ b/src/compiler/lexer/lexer.h
@@ -7,7 +7,6 @@
typedef enum Token {
TOKEN_NONE = 0,
TOKEN_IDENTIFIER,
- TOKEN_KEYWORD_PRINT,
TOKEN_NUMBER,
TOKEN_STRING,
TOKEN_OPERATOR,
@@ -61,5 +60,8 @@ extern bool isString(char c);
extern bool isOperator(char c);
extern bool isSymbol(char c);
+extern Token getTokenInStrings(char const *strBegin, char const *strEnd,
+ const char *strings[], const Token tokens[],
+ const size_t size);
extern Token getKeyword(char const *strBegin, char const *strEnd);
extern Token getOperator(char const *strBegin, char const *strEnd);