diff --git a/src/parser/parentheses-and-anonymous-function/parentheses-and-anonymous-function.c b/src/parser/parentheses-and-anonymous-function/parentheses-and-anonymous-function.c new file mode 100644 index 0000000..5e7eca7 --- /dev/null +++ b/src/parser/parentheses-and-anonymous-function/parentheses-and-anonymous-function.c @@ -0,0 +1,96 @@ +#include "parentheses-and-anonymous-function.h" +#include "../assignable/identifier/identifier.h" +#include "../function/function.h" +#include "../../memory.h" +#include +#include + +ParsedValueReturn parse_parentheses(char *file, DArray *tokens, size_t *index) { + (*index)++; + skip_newlines_and_indents(tokens, index); + ArErr err = error_if_finished(file, tokens, index); + if (err.exists) { + // darray_free(&list, free_parsed); + return (ParsedValueReturn){err, NULL}; + } + DArray list; + darray_init(&list, sizeof(ParsedValue)); + Token *token = darray_get(tokens, *index); + if (token->type != TOKEN_RPAREN) { + while (*index < tokens->size) { + ParsedValueReturn parsedItem = parse_token(file, tokens, index, true); + if (parsedItem.err.exists) { + darray_free(&list, free_parsed); + return parsedItem; + } + darray_push(&list, parsedItem.value); + free(parsedItem.value); + skip_newlines_and_indents(tokens, index); + ArErr err = error_if_finished(file, tokens, index); + if (err.exists) { + darray_free(&list, free_parsed); + return (ParsedValueReturn){err, NULL}; + } + token = darray_get(tokens, *index); + if (token->type == TOKEN_RPAREN) { + break; + } else if (token->type != TOKEN_COMMA) { + darray_free(&list, free_parsed); + return (ParsedValueReturn){create_err(token->line, token->column, + token->length, file, + "Syntax Error", "expected comma"), + NULL}; + } + skip_newlines_and_indents(tokens, index); + err = error_if_finished(file, tokens, index); + if (err.exists) { + darray_free(&list, free_parsed); + return (ParsedValueReturn){err, NULL}; + } + } + } + (*index)++; + if (*index < tokens->size) { + token = darray_get(tokens, *index); + if (token->type == TOKEN_ASSIGN) { + (*index)++; + ArErr err = error_if_finished(file, tokens, index); + if (err.exists) { + darray_free(&list, free_parsed); + return (ParsedValueReturn){err, NULL}; + } + DArray parameters; + darray_init(¶meters, sizeof(char *)); + for (size_t i = 0; i < list.size; i++) { + ParsedValue *item = darray_get(&list, i); + if (item->type != AST_IDENTIFIER) { + return (ParsedValueReturn){ + create_err(token->line, token->column, token->length, file, + "Syntax Error", "expected identifier"), + NULL}; + } + char *param = strdup(((ParsedIdentifier *)item->data)->name); + darray_push(¶meters, ¶m); + } + darray_free(&list, free_parsed); + ParsedValueReturn parsedBody = parse_token(file, tokens, index, true); + if (parsedBody.err.exists) { + darray_free(¶meters, free_parameter); + return parsedBody; + } + return (ParsedValueReturn){ + no_err, + create_parsed_function("anonymous", parameters, parsedBody.value)}; + } + } + if (list.size != 1) { + return (ParsedValueReturn){create_err(token->line, token->column, + token->length, file, "Syntax Error", + "expected 1 body"), + NULL}; + } + ParsedValue *parsedValue = checked_malloc(sizeof(ParsedValue)); + memcpy(parsedValue, darray_get(&list, 0), sizeof(ParsedValue)); + darray_free(&list, NULL); + return (ParsedValueReturn){no_err, parsedValue}; +} \ No newline at end of file diff --git a/src/parser/parentheses-and-anonymous-function/parentheses-and-anonymous-function.h b/src/parser/parentheses-and-anonymous-function/parentheses-and-anonymous-function.h new file mode 100644 index 0000000..1b99cc9 --- /dev/null +++ b/src/parser/parentheses-and-anonymous-function/parentheses-and-anonymous-function.h @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2025 William Bell + * + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#ifndef parentheses_and_anonymous_function_H +#define parentheses_and_anonymous_function_H +#include "../parser.h" +#include "../../lexer/token.h" + +ParsedValueReturn parse_parentheses(char *file, DArray *tokens, size_t *index); + +#endif // parentheses_and_anonymous_function_H \ No newline at end of file diff --git a/src/parser/parser.c b/src/parser/parser.c index 1d69034..a3ca3bc 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -13,6 +13,7 @@ #include "assignable/identifier/identifier.h" #include "declaration/declaration.h" #include "dictionary/dictionary.h" +#include "parentheses-and-anonymous-function/parentheses-and-anonymous-function.h" #include "dowrap/dowrap.h" #include "function/function.h" #include "if/if.h" @@ -128,6 +129,9 @@ ParsedValueReturn parse_token_full(char *file, DArray *tokens, size_t *index, case TOKEN_LBRACKET: output = parse_list(file, tokens, index); break; + case TOKEN_LPAREN: + output = parse_parentheses(file, tokens, index); + break; case TOKEN_LBRACE: output = parse_dictionary(file, tokens, index); break; diff --git a/testing.ar b/testing.ar index 76d5a44..936e48a 100644 --- a/testing.ar +++ b/testing.ar @@ -5,11 +5,33 @@ let say_hi(name) = do do return name ) - return "hello "+u+", how are you?" -term.log(say_hi("william")) + return "hello "+u+", how are you?" +term.log(say_hi("william") +, say_hi) let a = 9 let b = 10 +term.log(string(a)+'+'+string(b)+'='+string(a+b)) -term.log(string(a)+'+'+string(b)+'='+string(a+b)) \ No newline at end of file + +let call(f) = do + term.log(f) + + return f() + + +term.log( +call( +()=call( +()=call( +()=call( +()=do + term.log("hello this is a test of anonymous functions. hopefully this works :)") + + return say_hi("test") +) +) +) +) +) \ No newline at end of file