diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-09 15:05:09 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-09 15:05:09 +0330 |
commit | 27ac6c6f9b7f108b8b0e91f6e45a95ecc218934f (patch) | |
tree | b24bd726bdeb492fbf30d246a679058a9314b1a5 /src/compiler/parser.c | |
parent | 213762ef09380566e3db99834f33f6686750095f (diff) |
changed the way of parsing order finding to speed it up
Diffstat (limited to 'src/compiler/parser.c')
-rw-r--r-- | src/compiler/parser.c | 88 |
1 files changed, 32 insertions, 56 deletions
diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 0146650..5a0d00b 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -86,88 +86,71 @@ const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_NONE", }; -#define ORDER_ARRAY(...) \ - .size = sizeof((LexerToken[]){__VA_ARGS__}) / sizeof(LexerToken), \ - .data = {__VA_ARGS__} - static const ParserOrder PARSER_ORDER[] = { { .ltr = true, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_CLOSE_CURLY_BRACKET, ), + .begin = LEXER_TOKEN_ORDER0, + .end = LEXER_TOKEN_ORDER1, }, { .ltr = true, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_CLOSE_PARENTHESIS, - LEXER_TOKEN_IDENTIFIER, LEXER_TOKEN_KEYWORD_TYPE, - LEXER_TOKEN_KEYWORD_VOID, LEXER_TOKEN_KEYWORD_I8, - LEXER_TOKEN_KEYWORD_U8, LEXER_TOKEN_KEYWORD_I16, - LEXER_TOKEN_KEYWORD_U16, LEXER_TOKEN_KEYWORD_I32, - LEXER_TOKEN_KEYWORD_U32, LEXER_TOKEN_KEYWORD_I64, -#ifdef FLOAT_16_SUPPORT - LEXER_TOKEN_KEYWORD_F16, -#endif - LEXER_TOKEN_KEYWORD_F32, LEXER_TOKEN_KEYWORD_F64, - LEXER_TOKEN_KEYWORD_F128, LEXER_TOKEN_KEYWORD_U64, - LEXER_TOKEN_KEYWORD_BOOL, LEXER_TOKEN_KEYWORD_TRUE, - LEXER_TOKEN_KEYWORD_FALSE, LEXER_TOKEN_KEYWORD_NULL, - LEXER_TOKEN_NUMBER, LEXER_TOKEN_CHAR, - LEXER_TOKEN_KEYWORD_UNDEFINED, ), + .begin = LEXER_TOKEN_ORDER1, + .end = LEXER_TOKEN_ORDER2, }, { .ltr = false, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_FUNCTION_ARROW, - LEXER_TOKEN_SYMBOL_POINTER, LEXER_TOKEN_KEYWORD_STRUCT, ), + .begin = LEXER_TOKEN_ORDER2, + .end = LEXER_TOKEN_ORDER3, }, { .ltr = true, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_DEREFERENCE, - LEXER_TOKEN_SYMBOL_ACCESS, ), + .begin = LEXER_TOKEN_ORDER3, + .end = LEXER_TOKEN_ORDER4, }, { .ltr = false, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_PLUS, LEXER_TOKEN_SYMBOL_MINUS, - LEXER_TOKEN_SYMBOL_ADDRESS, ), + .begin = LEXER_TOKEN_ORDER4, + .end = LEXER_TOKEN_ORDER5, }, { .ltr = true, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_MULTIPLY, LEXER_TOKEN_SYMBOL_DIVIDE, - LEXER_TOKEN_SYMBOL_MODULO, ), + .begin = LEXER_TOKEN_ORDER5, + .end = LEXER_TOKEN_ORDER6, }, { .ltr = true, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_SUM, LEXER_TOKEN_SYMBOL_SUB, ), + .begin = LEXER_TOKEN_ORDER6, + .end = LEXER_TOKEN_ORDER7, }, { .ltr = true, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_EQUAL, LEXER_TOKEN_SYMBOL_NOT_EQUAL, - LEXER_TOKEN_SYMBOL_GREATER, LEXER_TOKEN_SYMBOL_SMALLER, - LEXER_TOKEN_SYMBOL_GREATER_OR_EQUAL, - LEXER_TOKEN_SYMBOL_SMALLER_OR_EQUAL, ), + .begin = LEXER_TOKEN_ORDER7, + .end = LEXER_TOKEN_ORDER8, }, { .ltr = true, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_COLON, ), + .begin = LEXER_TOKEN_ORDER8, + .end = LEXER_TOKEN_ORDER9, }, { .ltr = false, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_ASSIGN, LEXER_TOKEN_SYMBOL_SUM_ASSIGN, - LEXER_TOKEN_SYMBOL_SUB_ASSIGN, - LEXER_TOKEN_SYMBOL_MULTIPLY_ASSIGN, - LEXER_TOKEN_SYMBOL_DIVIDE_ASSIGN, - LEXER_TOKEN_SYMBOL_MODULO_ASSIGN, ), + .begin = LEXER_TOKEN_ORDER9, + .end = LEXER_TOKEN_ORDER10, }, { .ltr = false, - ORDER_ARRAY(LEXER_TOKEN_KEYWORD_RETURN, LEXER_TOKEN_KEYWORD_PUTC, - LEXER_TOKEN_KEYWORD_COMPTIME, ), + .begin = LEXER_TOKEN_ORDER10, + .end = LEXER_TOKEN_ORDER11, }, { .ltr = true, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_EOL, LEXER_TOKEN_SYMBOL_COMMA, ), + .begin = LEXER_TOKEN_ORDER11, + .end = LEXER_TOKEN_ORDER12, }, { .ltr = false, - ORDER_ARRAY(LEXER_TOKEN_KEYWORD_IF, LEXER_TOKEN_KEYWORD_WHILE, ), + .begin = LEXER_TOKEN_ORDER12, + .end = LEXER_TOKEN_END_ORDERS, }, }; @@ -640,19 +623,12 @@ bool parserNodeArray(LexerNode *begin, LexerNode *end, ParserNode *parent) { for (LexerNode *iter = orders.ltr ? begin : end - 1; iter < end && iter >= begin; orders.ltr ? ++iter : --iter) { - - if (iter->parserNode != NULL) { - continue; - } - - for (size_t order_index = 0; order_index < orders.size; ++order_index) { - const LexerToken order = orders.data[order_index]; - if (iter->token == order) { - bool conti = false; - ParserNode *parserNode = parseNode(iter, begin, end, parent, &conti); - if (parserNode == NULL && !conti) { - goto RETURN_ERROR; - } + if (iter->parserNode == NULL && orders.begin <= iter->token && + iter->token < orders.end) { + bool conti = false; + ParserNode *parserNode = parseNode(iter, begin, end, parent, &conti); + if (parserNode == NULL && !conti) { + goto RETURN_ERROR; } } } |