summaryrefslogtreecommitdiff
path: root/src/compiler/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/parser.c')
-rw-r--r--src/compiler/parser.c101
1 files changed, 69 insertions, 32 deletions
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 12c7ca9..7ec9e1c 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -166,7 +166,23 @@ void parserNodePrint(const ParserNode *node, int indent) {
printf(" ");
}
goto RETURN_SUCCESS;
- case PARSER_TOKEN_TYPE_FUNCTION:
+ case PARSER_TOKEN_TYPE_FUNCTION: {
+ const ParserNodeTypeFunctionMetadata *metadata = node->metadata;
+ printf(",\n");
+ for (int i = 0; i < indent; ++i)
+ printf(" ");
+ printf("arguments=\n");
+ parserNodePrint(metadata->arguments, indent + 1);
+ printf(",\n");
+ for (int i = 0; i < indent; ++i)
+ printf(" ");
+ printf("returnType=\n");
+ parserNodePrint(metadata->returnType, indent + 1);
+ printf("\n");
+ for (int i = 0; i < indent; ++i)
+ printf(" ");
+ }
+ goto RETURN_SUCCESS;
case PARSER_TOKEN_NONE:
}
printLog("Bad token '%d'", node->token);
@@ -218,7 +234,14 @@ void parserNodeDelete(ParserNode *node) {
free(metadata);
}
goto RETURN_SUCCESS;
- case PARSER_TOKEN_TYPE_FUNCTION:
+ case PARSER_TOKEN_TYPE_FUNCTION: {
+ ParserNodeTypeFunctionMetadata *metadata = node->metadata;
+ parserNodeDelete(metadata->arguments);
+ parserNodeDelete(metadata->returnType);
+ free(metadata);
+ }
+ goto RETURN_SUCCESS;
+
case PARSER_TOKEN_NONE:
}
printLog("Bad token '%d'", node->token);
@@ -416,7 +439,6 @@ ParserNode *parserComma(LexerNode *node, LexerNode *begin, ParserNode *parent) {
return NULL;
}
}
- printLog("%s", PARSER_TOKEN_STRINGS[parserNodeBefore->token]);
return node->parserNode = parserNodeBefore->parent = newParserNode(
PARSER_TOKEN_SYMBOL_COMMA, node->str_begin, node->str_end,
(ParserNodeEOLMetadata *)parserNodeBefore, parent);
@@ -504,11 +526,6 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end,
if (bodyNode >= end || bodyNode->parserNode == NULL) {
body = NULL;
- // TODO: implement
- // if body is not there then it is a function type not a function
- // definition
- printLog("Not implemented");
- return NULL;
} else {
body = getUntilCommonParent(bodyNode->parserNode, parent);
if (body == NULL || body->token != PARSER_TOKEN_SYMBOL_CURLY_BRACKET) {
@@ -534,16 +551,28 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end,
return NULL;
}
- ParserNodeFunctionDefnitionMetadata *metadata =
- a404m_malloc(sizeof(*metadata));
+ if (body != NULL) {
+ ParserNodeFunctionDefnitionMetadata *metadata =
+ a404m_malloc(sizeof(*metadata));
- metadata->body = body;
- metadata->arguments = params;
- metadata->returnType = retType;
+ metadata->body = body;
+ metadata->arguments = params;
+ metadata->returnType = retType;
- return params->parent = retType->parent = body->parent = node->parserNode =
- newParserNode(PARSER_TOKEN_FUNCTION_DEFINITION, params->str_begin,
- body->str_end, metadata, parent);
+ return params->parent = retType->parent = body->parent = node->parserNode =
+ newParserNode(PARSER_TOKEN_FUNCTION_DEFINITION,
+ params->str_begin, body->str_end, metadata,
+ parent);
+ } else {
+ ParserNodeTypeFunctionMetadata *metadata = a404m_malloc(sizeof(*metadata));
+
+ metadata->arguments = params;
+ metadata->returnType = retType;
+
+ return params->parent = retType->parent = node->parserNode =
+ newParserNode(PARSER_TOKEN_TYPE_FUNCTION, params->str_begin,
+ retType->str_end, metadata, parent);
+ }
}
ParserNode *parserVariable(LexerNode *node, LexerNode *begin, LexerNode *end,
@@ -561,7 +590,8 @@ ParserNode *parserVariable(LexerNode *node, LexerNode *begin, LexerNode *end,
ParserNode *name = getUntilCommonParent(nameNode->parserNode, parent);
if (name->token != PARSER_TOKEN_IDENTIFIER) {
- printLog("Name should be identifier");
+ printLog("Name should be identifier but got '%s'",
+ PARSER_TOKEN_STRINGS[name->token]);
return NULL;
} else {
name->parent = variableNode;
@@ -570,6 +600,7 @@ ParserNode *parserVariable(LexerNode *node, LexerNode *begin, LexerNode *end,
LexerNode *node1 = node + 1;
ParserNode *type;
+ ParserNode *value;
if (node1 >= end) {
printLog("Bad variable definition");
@@ -588,21 +619,31 @@ ParserNode *parserVariable(LexerNode *node, LexerNode *begin, LexerNode *end,
return NULL;
}
type->parent = variableNode;
- printLog("Here is");
+ for (++node1; node1 < end && getUntilCommonParent(node1->parserNode,
+ parent) == variableNode;
+ ++node1) {
+ }
+ if (node1 < end && node1->token == LEXER_TOKEN_SYMBOL_COLON) {
+ node1->parserNode = variableNode;
+ } else {
+ node1 = NULL;
+ value = NULL;
+ }
}
- LexerNode *valueNode = node + 2;
- ParserNode *value;
-
- if (valueNode >= end || valueNode->parserNode == NULL) {
- value = NULL;
- } else {
- value = getUntilCommonParent(valueNode->parserNode, parent);
- if (!isValue(value)) {
+ if (node1 != NULL) {
+ LexerNode *valueNode = node1 + 1;
+ if (valueNode >= end || valueNode->parserNode == NULL) {
printLog("No value");
return NULL;
+ } else {
+ value = getUntilCommonParent(valueNode->parserNode, parent);
+ if (!isValue(value)) {
+ printLog("No value");
+ return NULL;
+ }
+ value->parent = variableNode;
}
- value->parent = variableNode;
}
ParserNodeVariableMetadata *metadata = a404m_malloc(sizeof(*metadata));
@@ -626,13 +667,9 @@ RETURN_ERROR:
}
bool isAllArguments(const ParserNodeArray *nodes) {
- printLog("%d", nodes->size);
for (size_t i = 0; i < nodes->size; ++i) {
const ParserNode *node = nodes->data[i];
if (node->token != PARSER_TOKEN_SYMBOL_COMMA && i + 1 != nodes->size) {
- printLog("%d %s %d %.*s", i, PARSER_TOKEN_STRINGS[node->token],
- node->token, (int)(node->str_end - node->str_begin),
- node->str_begin);
return false;
}
}
@@ -663,6 +700,7 @@ bool isExpression(ParserNode *node) {
bool isType(ParserNode *node) {
switch (node->token) {
case PARSER_TOKEN_TYPE_VOID:
+ case PARSER_TOKEN_TYPE_FUNCTION:
return true;
case PARSER_TOKEN_IDENTIFIER:
case PARSER_TOKEN_CONSTANT:
@@ -670,7 +708,6 @@ bool isType(ParserNode *node) {
case PARSER_TOKEN_FUNCTION_DEFINITION:
case PARSER_TOKEN_KEYWORD_PRINT:
case PARSER_TOKEN_ROOT:
- case PARSER_TOKEN_TYPE_FUNCTION:
case PARSER_TOKEN_SYMBOL_EOL:
case PARSER_TOKEN_SYMBOL_CURLY_BRACKET:
case PARSER_TOKEN_SYMBOL_COMMA: