Start work on function calling
This commit is contained in:
@@ -1406,6 +1406,103 @@ static inline ResultType(Nothing, charptr) parseDef(SolsParser* parser) {
|
||||
return Success(Nothing, charptr, {});
|
||||
}
|
||||
|
||||
static inline ResultType(Nothing, charptr) parseFunctionCall(SolsParser* parser) {
|
||||
|
||||
ResultType(SolsNode, charptr) node = createSolsNode(SNT_FUNCTION_CALL);
|
||||
if (node.error) {
|
||||
return Error(Nothing, charptr, node.as.error);
|
||||
}
|
||||
|
||||
ResultType(SolsToken, Nothing) idToken = parserPeek(parser, -1);
|
||||
if (idToken.error) {
|
||||
return Error(Nothing, charptr, "Couldn't get id token for some odd reason");
|
||||
}
|
||||
|
||||
node.as.success.as.idName = idToken.as.success.as.idName;
|
||||
|
||||
// create a node for each expression between commas
|
||||
ResultType(SolsToken, Nothing) peek = parserPeek(parser, 1);
|
||||
if (peek.error) {
|
||||
return Error(Nothing, charptr, "Expecting ')' or a value");
|
||||
}
|
||||
SolsTokens tokens;
|
||||
for (;;) {
|
||||
ResultType(SolsTokens, charptr) resultTokens = createSolsTokens();
|
||||
if (resultTokens.error) {
|
||||
return Error(Nothing, charptr, resultTokens.as.error);
|
||||
}
|
||||
tokens = resultTokens.as.success;
|
||||
size_t curlys = 0;
|
||||
size_t parens = 0;
|
||||
for (;;) {
|
||||
peek = parserPeek(parser, 1);
|
||||
if (peek.error) {
|
||||
return Error(Nothing, charptr, "Expecting ')'");
|
||||
}
|
||||
if (peek.as.success.type == STT_OPEN_PAREN) {
|
||||
parens++;
|
||||
}
|
||||
if (peek.as.success.type == STT_CLOSE_PAREN) {
|
||||
if (parens == 0) {
|
||||
break;
|
||||
}
|
||||
parens--;
|
||||
}
|
||||
if (peek.as.success.type == STT_OPEN_CURLY) {
|
||||
curlys++;
|
||||
}
|
||||
if (peek.as.success.type == STT_CLOSE_CURLY) {
|
||||
curlys--;
|
||||
}
|
||||
|
||||
if (curlys == 0 && parens == 0 && peek.as.success.type == STT_COMMA) {
|
||||
break;
|
||||
}
|
||||
|
||||
addTokenToSolsTokens(&tokens, peek.as.success);
|
||||
parserConsume(parser);
|
||||
}
|
||||
|
||||
ResultType(SolsParser, charptr) newParser = createSolsParser(&tokens);
|
||||
if (newParser.error) {
|
||||
return Error(Nothing, charptr, newParser.as.error);
|
||||
}
|
||||
newParser.as.success.currentParent = &newParser.as.success.output;
|
||||
ResultType(Nothing, charptr) parsed = parse(&newParser.as.success);
|
||||
if (parsed.error) {
|
||||
addToParserErrors(parser, parsed.as.error);
|
||||
return Success(Nothing, charptr, {});
|
||||
}
|
||||
|
||||
if (newParser.as.success.output.children.count < 1) {
|
||||
return Error(Nothing, charptr, "Expecting a value before ',' or ')'");
|
||||
}
|
||||
addChildToSolsNode(&node.as.success, newParser.as.success.output.children.at[0]);
|
||||
|
||||
peek = parserConsume(parser);
|
||||
if (peek.error) {
|
||||
return Error(Nothing, charptr, "Expecting ')' or ','");
|
||||
}
|
||||
if (peek.as.success.type == STT_CLOSE_PAREN) {
|
||||
break;
|
||||
}
|
||||
|
||||
addChildToSolsNode(parser->currentParent, node.as.success);
|
||||
|
||||
}
|
||||
|
||||
return Success(Nothing, charptr, {});
|
||||
}
|
||||
|
||||
static inline ResultType(Nothing, charptr) parseOpenParen(SolsParser* parser) {
|
||||
return Error(Nothing, charptr, "WIP");
|
||||
}
|
||||
|
||||
static inline ResultType(Nothing, charptr) parseCloseParen(SolsParser* parser) {
|
||||
(void)parser;
|
||||
return Error(Nothing, charptr, "Extra closing parenthases");
|
||||
}
|
||||
|
||||
ResultType(Nothing, charptr) parse(SolsParser* parser) {
|
||||
parser->currentParent = &parser->output;
|
||||
for (;;) {
|
||||
@@ -1434,6 +1531,14 @@ ResultType(Nothing, charptr) parse(SolsParser* parser) {
|
||||
case STT_OP_EQLESSER: PARSER_HANDLE(EqLesser);
|
||||
case STT_OPEN_CURLY: PARSER_HANDLE(CodeBlock);
|
||||
case STT_CLOSE_CURLY: PARSER_HANDLE(CloseCurly);
|
||||
case STT_OPEN_PAREN: {
|
||||
if (parser->output.children.count > 0 && parser->output.children.at[parser->output.children.count - 1].type == SNT_IDENTIFIER) {
|
||||
PARSER_HANDLE(FunctionCall);
|
||||
} else {
|
||||
PARSER_HANDLE(OpenParen);
|
||||
}
|
||||
}
|
||||
case STT_CLOSE_PAREN: PARSER_HANDLE(CloseParen);
|
||||
}
|
||||
}
|
||||
if (parser->errors.count > 0) {
|
||||
|
||||
Reference in New Issue
Block a user