diff options
Diffstat (limited to 'src/compiler/parser')
-rw-r--r-- | src/compiler/parser/parser.c | 22 |
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]); |