diff options
Diffstat (limited to 'src/compiler/lexer/lexer.c')
-rw-r--r-- | src/compiler/lexer/lexer.c | 56 |
1 files changed, 30 insertions, 26 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); } |