75 lines
2.7 KiB
C
75 lines
2.7 KiB
C
|
|
#include "lexer.h"
|
||
|
|
#include <string.h>
|
||
|
|
|
||
|
|
typedef struct {
|
||
|
|
const char *keyword;
|
||
|
|
RavaTokenType_e type;
|
||
|
|
} RavaKeyword_t;
|
||
|
|
|
||
|
|
static const RavaKeyword_t KEYWORDS[] = {
|
||
|
|
{"abstract", RAVA_TOKEN_KEYWORD_ABSTRACT},
|
||
|
|
{"assert", RAVA_TOKEN_KEYWORD_ASSERT},
|
||
|
|
{"boolean", RAVA_TOKEN_KEYWORD_BOOLEAN},
|
||
|
|
{"break", RAVA_TOKEN_KEYWORD_BREAK},
|
||
|
|
{"byte", RAVA_TOKEN_KEYWORD_BYTE},
|
||
|
|
{"case", RAVA_TOKEN_KEYWORD_CASE},
|
||
|
|
{"catch", RAVA_TOKEN_KEYWORD_CATCH},
|
||
|
|
{"char", RAVA_TOKEN_KEYWORD_CHAR},
|
||
|
|
{"class", RAVA_TOKEN_KEYWORD_CLASS},
|
||
|
|
{"const", RAVA_TOKEN_KEYWORD_CONST},
|
||
|
|
{"continue", RAVA_TOKEN_KEYWORD_CONTINUE},
|
||
|
|
{"default", RAVA_TOKEN_KEYWORD_DEFAULT},
|
||
|
|
{"do", RAVA_TOKEN_KEYWORD_DO},
|
||
|
|
{"double", RAVA_TOKEN_KEYWORD_DOUBLE},
|
||
|
|
{"else", RAVA_TOKEN_KEYWORD_ELSE},
|
||
|
|
{"enum", RAVA_TOKEN_KEYWORD_ENUM},
|
||
|
|
{"extends", RAVA_TOKEN_KEYWORD_EXTENDS},
|
||
|
|
{"false", RAVA_TOKEN_LITERAL_FALSE},
|
||
|
|
{"final", RAVA_TOKEN_KEYWORD_FINAL},
|
||
|
|
{"finally", RAVA_TOKEN_KEYWORD_FINALLY},
|
||
|
|
{"float", RAVA_TOKEN_KEYWORD_FLOAT},
|
||
|
|
{"for", RAVA_TOKEN_KEYWORD_FOR},
|
||
|
|
{"goto", RAVA_TOKEN_KEYWORD_GOTO},
|
||
|
|
{"if", RAVA_TOKEN_KEYWORD_IF},
|
||
|
|
{"implements", RAVA_TOKEN_KEYWORD_IMPLEMENTS},
|
||
|
|
{"import", RAVA_TOKEN_KEYWORD_IMPORT},
|
||
|
|
{"instanceof", RAVA_TOKEN_KEYWORD_INSTANCEOF},
|
||
|
|
{"int", RAVA_TOKEN_KEYWORD_INT},
|
||
|
|
{"interface", RAVA_TOKEN_KEYWORD_INTERFACE},
|
||
|
|
{"long", RAVA_TOKEN_KEYWORD_LONG},
|
||
|
|
{"native", RAVA_TOKEN_KEYWORD_NATIVE},
|
||
|
|
{"new", RAVA_TOKEN_KEYWORD_NEW},
|
||
|
|
{"null", RAVA_TOKEN_LITERAL_NULL},
|
||
|
|
{"package", RAVA_TOKEN_KEYWORD_PACKAGE},
|
||
|
|
{"private", RAVA_TOKEN_KEYWORD_PRIVATE},
|
||
|
|
{"protected", RAVA_TOKEN_KEYWORD_PROTECTED},
|
||
|
|
{"public", RAVA_TOKEN_KEYWORD_PUBLIC},
|
||
|
|
{"return", RAVA_TOKEN_KEYWORD_RETURN},
|
||
|
|
{"short", RAVA_TOKEN_KEYWORD_SHORT},
|
||
|
|
{"static", RAVA_TOKEN_KEYWORD_STATIC},
|
||
|
|
{"strictfp", RAVA_TOKEN_KEYWORD_STRICTFP},
|
||
|
|
{"super", RAVA_TOKEN_KEYWORD_SUPER},
|
||
|
|
{"switch", RAVA_TOKEN_KEYWORD_SWITCH},
|
||
|
|
{"synchronized", RAVA_TOKEN_KEYWORD_SYNCHRONIZED},
|
||
|
|
{"this", RAVA_TOKEN_KEYWORD_THIS},
|
||
|
|
{"throw", RAVA_TOKEN_KEYWORD_THROW},
|
||
|
|
{"throws", RAVA_TOKEN_KEYWORD_THROWS},
|
||
|
|
{"transient", RAVA_TOKEN_KEYWORD_TRANSIENT},
|
||
|
|
{"true", RAVA_TOKEN_LITERAL_TRUE},
|
||
|
|
{"try", RAVA_TOKEN_KEYWORD_TRY},
|
||
|
|
{"void", RAVA_TOKEN_KEYWORD_VOID},
|
||
|
|
{"volatile", RAVA_TOKEN_KEYWORD_VOLATILE},
|
||
|
|
{"while", RAVA_TOKEN_KEYWORD_WHILE},
|
||
|
|
};
|
||
|
|
|
||
|
|
static const size_t KEYWORDS_COUNT = sizeof(KEYWORDS) / sizeof(KEYWORDS[0]);
|
||
|
|
|
||
|
|
RavaTokenType_e rava_lexer_lookup_keyword(const char *identifier) {
|
||
|
|
for (size_t i = 0; i < KEYWORDS_COUNT; i++) {
|
||
|
|
if (strcmp(identifier, KEYWORDS[i].keyword) == 0) {
|
||
|
|
return KEYWORDS[i].type;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return RAVA_TOKEN_IDENTIFIER;
|
||
|
|
}
|