aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/parser')
-rw-r--r--src/compiler/parser/parser.c87
-rw-r--r--src/compiler/parser/parser.h1
2 files changed, 51 insertions, 37 deletions
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;
diff --git a/src/compiler/parser/parser.h b/src/compiler/parser/parser.h
index 234264b..81a5040 100644
--- a/src/compiler/parser/parser.h
+++ b/src/compiler/parser/parser.h
@@ -74,6 +74,7 @@ extern ParsedNode *getUntilCommonFather(ParsedNode *parsedNode,
extern void deleteParsedNode(ParsedNode *parsedNode);
extern ParsedNode *parser(SourceCode *code,size_t sourceIndex);
+extern ParsedNode *parserWithPrint(SourceCode *code,size_t sourceIndex);
extern ParsedNode *_parser(Nodes lexedNodes, SourceCode *code);
extern ParserScopeMetadata *parserScope(