diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2024-09-26 05:01:30 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2024-09-26 05:01:30 +0330 |
commit | 3b5df1794867ccffc56ac5633af6c77a0b3952c8 (patch) | |
tree | 83810bba9ad9645946282c05b4bd6efd61f62d8b | |
parent | c409b8aaf6b6f63bd68a3356e146ab80b2ec8c4b (diff) |
some speed improvement
-rw-r--r-- | src/compiler/error_helper/error_helper.c | 2 | ||||
-rw-r--r-- | src/compiler/parser/parser.c | 22 | ||||
-rw-r--r-- | src/vm/runner/runner.c | 2 |
3 files changed, 19 insertions, 7 deletions
diff --git a/src/compiler/error_helper/error_helper.c b/src/compiler/error_helper/error_helper.c index 2a9b209..42e3745 100644 --- a/src/compiler/error_helper/error_helper.c +++ b/src/compiler/error_helper/error_helper.c @@ -21,7 +21,7 @@ void printError(char const *error, SourceCode *sourceCode, char const *begin, } } if (code == NULL) { - fprintf(stderr, "Bad Error: the error is in no source code"); + fprintf(stderr, "Bad Error: the error is in no source code\n"); return; } diff --git a/src/compiler/parser/parser.c b/src/compiler/parser/parser.c index 2ffde16..fcee276 100644 --- a/src/compiler/parser/parser.c +++ b/src/compiler/parser/parser.c @@ -277,7 +277,7 @@ FREE: } ParsedNode *parser(SourceCode *code, size_t sourceIndex) { - Nodes nodes = lexer(code,sourceIndex); + Nodes nodes = lexer(code, sourceIndex); if (nodes.size == ERROR_SIZE) { return NULL; } @@ -303,8 +303,7 @@ ParsedNode *_parser(Nodes lexedNodes, SourceCode *code) { ParserScopeMetadata *parserScope( Node *nodesBegin, Node *nodesEnd, ParsedNode *parent, bool (*isAllowed)(ParsedToken token, bool isLast), SourceCode *code) { - size_t nodes_size = 0; - ParsedNode **nodes = a404m_malloc(nodes_size * sizeof(ParsedNode *)); + ParsedNode **nodes = a404m_malloc(0); size_t nodes_inserted = 0; for (size_t order_index = 0; order_index < PARSE_ORDER_SIZE; ++order_index) { @@ -320,12 +319,15 @@ ParserScopeMetadata *parserScope( if (parsedNode == NULL) { goto RETURN_ERROR; } + size_t nodes_size = + a404m_malloc_usable_size(nodes) / sizeof(ParsedNode *); if (nodes_size == nodes_inserted) { nodes_size += nodes_size / 2 + 1; nodes = a404m_realloc(nodes, nodes_size * sizeof(ParsedNode *)); } nodes[nodes_inserted] = parsedNode; ++nodes_inserted; + break; } } } @@ -340,13 +342,23 @@ ParserScopeMetadata *parserScope( } ParsedNode **operands = a404m_malloc(nodes_inserted * sizeof(ParsedNode *)); - nodes_size = nodes_inserted; + size_t nodes_size = nodes_inserted; nodes_inserted = 0; + ParsedNode *last = NULL; + + for(size_t i = nodes_size-1;i != (typeof(i))-1;++i){ + ParsedNode *currentNode = nodes[i]; + if (currentNode->parent == parent) { + last = currentNode; + break; + } + } + for (size_t i = 0; i < nodes_size; ++i) { ParsedNode *currentNode = nodes[i]; if (currentNode->parent == parent) { - if (!isAllowed(currentNode->token, i + 1 == nodes_size)) { + if (!isAllowed(currentNode->token, currentNode == last)) { printError("Token '%s' is not allowed here", code, currentNode->strBegin, currentNode->strEnd, PARSED_TOKEN_STRINGS[currentNode->token]); diff --git a/src/vm/runner/runner.c b/src/vm/runner/runner.c index 3dcab9b..9836ad0 100644 --- a/src/vm/runner/runner.c +++ b/src/vm/runner/runner.c @@ -178,5 +178,5 @@ void pushToStack(void *value, void ***restrict stack, void print(void ***restrict stack, size_t *restrict stack_inserted) { const SizedString *string = popFromStack(stack, stack_inserted); - printf("%.*s", (int)string->size, string->str); + fwrite(string->str, string->size, 1, stdout); } |