From addd54dc31603dc204773d3108dba4e000cd7657 Mon Sep 17 00:00:00 2001 From: A404M Date: Tue, 8 Oct 2024 04:16:27 +0330 Subject: added fasm support added compiler options tried to compile to fasm first --- src/compiler/parser/parser.c | 87 +++++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 37 deletions(-) (limited to 'src/compiler/parser/parser.c') diff --git a/src/compiler/parser/parser.c b/src/compiler/parser/parser.c index ee9e69b..b60dd60 100644 --- a/src/compiler/parser/parser.c +++ b/src/compiler/parser/parser.c @@ -287,6 +287,20 @@ ParsedNode *parser(SourceCode *code, size_t sourceIndex) { return root; } +ParsedNode *parserWithPrint(SourceCode *code, size_t sourceIndex) { + Nodes nodes = lexer(code, sourceIndex); + if (nodes.size == ERROR_SIZE) { + fprintf(stderr, "Error in lexer"); + return NULL; + } + printf("----lexed '%s'\n", code->codes[sourceIndex]->filePath); + printNodes(nodes); + ParsedNode *root = _parser(nodes, code); + + deleteNodes(nodes); + return root; +} + ParsedNode *_parser(Nodes lexedNodes, SourceCode *code) { ParsedNode *root = a404m_malloc(sizeof(*root)); root->token = PARSED_TOKEN_ROOT; @@ -303,6 +317,12 @@ ParsedNode *_parser(Nodes lexedNodes, SourceCode *code) { ParserScopeMetadata *parserScope( Node *nodesBegin, Node *nodesEnd, ParsedNode *parent, bool (*isAllowed)(ParsedToken token, bool isLast), SourceCode *code) { + if (nodesBegin == nodesEnd) { + ParserScopeMetadata *metadata = a404m_malloc(sizeof(*metadata)); + metadata->operands = a404m_malloc(0); + metadata->operands_size = 0; + return metadata; + } ParsedNode **nodes = a404m_malloc(0); size_t nodes_inserted = 0; @@ -314,7 +334,7 @@ ParserScopeMetadata *parserScope( for (size_t order_tokens_index = 0; order_tokens_index < order->size; ++order_tokens_index) { if (node->token == order->tokens[order_tokens_index]) { - ParsedNode *parsedNode = + ParsedNode *const parsedNode = parseNode(nodesBegin, nodesEnd, node, parent, code); if (parsedNode == NULL) { goto RETURN_ERROR; @@ -344,26 +364,25 @@ ParserScopeMetadata *parserScope( 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; - } + const Node *lastNode = (nodesEnd - 1); + ParsedNode *last = getUntilCommonFather(lastNode->parsedNode, parent); + if (last == NULL) { + printError("Unexpected token '%s'", code, lastNode->strBegin, + lastNode->strEnd, + PARSED_TOKEN_STRINGS[lastNode->parsedNode->token]); + goto RETURN_ERROR; } for (size_t i = 0; i < nodes_size; ++i) { ParsedNode *currentNode = nodes[i]; if (currentNode->parent == parent) { if (!isAllowed(currentNode->token, currentNode == last)) { - printError("Token '%s' is not allowed here", code, - currentNode->strBegin, currentNode->strEnd, - PARSED_TOKEN_STRINGS[currentNode->token]); + printError( + "Token '%s' is not allowed here at %ld current = %p, last = %p", + code, currentNode->strBegin, currentNode->strEnd, + PARSED_TOKEN_STRINGS[currentNode->token], i, currentNode, last); goto RETURN_ERROR; - } - if (nodes_inserted != i) { + } else if (nodes_inserted != i) { nodes[nodes_inserted] = currentNode; } ++nodes_inserted; @@ -378,6 +397,11 @@ ParserScopeMetadata *parserScope( return metadata; RETURN_ERROR: + for (size_t i = 0; i < nodes_inserted; ++i) { + if (nodes[i]->parent == parent) { + deleteParsedNode(nodes[i]); + } + } free(nodes); return NULL; } @@ -641,8 +665,8 @@ ParsedNode *parseParenthesis(Node *nodesBegin, Node *nodesEnd, Node *closing, root->metadata = metadata; } - closing->parsedNode = opening->parsedNode = root; opening->token = closing->token = TOKEN_PARSED; + closing->parsedNode = opening->parsedNode = root; return root; RETURN_ERROR: @@ -676,8 +700,8 @@ ParsedNode *parseCurly(Node *nodesBegin, Node *closing, ParsedNode *parent, root->strEnd = opening->strEnd; root->parent = parent; root->token = PARSED_TOKEN_CODE_BODY; - closing->parsedNode = opening->parsedNode = root; opening->token = closing->token = TOKEN_PARSED; + closing->parsedNode = opening->parsedNode = root; return root; @@ -775,6 +799,7 @@ ParsedNode *parseVariable(Node *nodesBegin, Node *nodesEnd, Node *node, follow->strEnd); goto RETURN_ERROR; } + type->parent = root; ++follow; while (follow->token == TOKEN_PARSED && getUntilCommonFather(follow->parsedNode, type) != NULL) { @@ -794,8 +819,8 @@ ParsedNode *parseVariable(Node *nodesBegin, Node *nodesEnd, Node *node, else root->token = PARSED_TOKEN_DEFINE_CONSTANT; - follow->parsedNode = root; follow->token = TOKEN_PARSED; + follow->parsedNode = root; ++follow; if (follow == nodesEnd) { --follow; @@ -804,8 +829,8 @@ ParsedNode *parseVariable(Node *nodesBegin, Node *nodesEnd, Node *node, goto RETURN_ERROR; } else if (follow->token == TOKEN_PARSED) { value = getUntilCommonFather(follow->parsedNode, parent); + value->parent = root; } else { - BAD_VALUE: printError("Expected value after assignment but got something else", code, follow->strBegin, follow->strEnd); goto RETURN_ERROR; @@ -817,21 +842,8 @@ ParsedNode *parseVariable(Node *nodesBegin, Node *nodesEnd, Node *node, node->strBegin, node->strEnd); goto RETURN_ERROR; } - if (type != NULL) { - metadata->type = type; - type->parent = root; - } else { - metadata->type = NULL; - } - if (value != NULL) { - metadata->value = value = getUntilCommonFather(value, parent); - if (value == NULL) { - goto BAD_VALUE; - } - value->parent = root; - } else { - metadata->value = NULL; - } + metadata->type = type; + metadata->value = value; root->strBegin = variableName->strBegin; root->strEnd = follow->strEnd; @@ -938,6 +950,7 @@ ParsedNode *parseFunction(Node *nodesBegin, Node *nodesEnd, Node *node, metadata->params = params->parsedNode; metadata->params->parent = root; } + if (type >= nodesEnd || type->token != TOKEN_PARSED || type->parsedNode->token != PARSED_TOKEN_IDENTIFIER) { printError("Function definition needs a type to be identifier (for now)", @@ -957,9 +970,9 @@ ParsedNode *parseFunction(Node *nodesBegin, Node *nodesEnd, Node *node, body->token = TOKEN_PARSED; body->parsedNode = root; metadata->body = NULL; - } else if (type->token == TOKEN_PARSED && - type->parsedNode->token == PARSED_TOKEN_CODE_BODY) { - metadata->body = type->parsedNode; + } else if (body->token == TOKEN_PARSED && + body->parsedNode->token == PARSED_TOKEN_CODE_BODY) { + metadata->body = body->parsedNode; metadata->body->parent = root; } else { goto NEED_BODY; @@ -974,7 +987,7 @@ ParsedNode *parseFunction(Node *nodesBegin, Node *nodesEnd, Node *node, return root; RETURN_ERROR: - + // TODO: doesn't delete all free(metadata); free(root); return NULL; -- cgit v1.2.3