aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/parser
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-26 05:01:30 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-26 05:01:30 +0330
commit3b5df1794867ccffc56ac5633af6c77a0b3952c8 (patch)
tree83810bba9ad9645946282c05b4bd6efd61f62d8b /src/compiler/parser
parentc409b8aaf6b6f63bd68a3356e146ab80b2ec8c4b (diff)
some speed improvement
Diffstat (limited to 'src/compiler/parser')
-rw-r--r--src/compiler/parser/parser.c22
1 files changed, 17 insertions, 5 deletions
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]);