Skip to content

Commit

Permalink
Merge pull request #183 from KennyOliver/issue-175
Browse files Browse the repository at this point in the history
Issue 175: Added Support for Arrays (1D)
  • Loading branch information
KennyOliver authored Jan 8, 2025
2 parents ea5027e + c3c791c commit 51955b0
Show file tree
Hide file tree
Showing 22 changed files with 2,088 additions and 600 deletions.
30 changes: 29 additions & 1 deletion docs/language_design.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ This `docs/` page details the core design of FlavorLang's syntax, the various da

2. [Data Types](#data-types)

3. [Extended Backus-Naur Form (EBNF)](#ebnf)
3. [Arrays](#arrays)

4. [Extended Backus-Naur Form (EBNF)](#ebnf)

---

Expand Down Expand Up @@ -73,6 +75,32 @@ This `docs/` page details the core design of FlavorLang's syntax, the various da

---

## Arrays

> [!Note]
>
> All array operations do not mutate original array to reduce confusion.
| **Operation** | **Syntax** | **Explanation** |
| ------------------------ | --------------- | ----------------------------------------------------------------------------------- |
| **Element Access** | `array[5]` | Accesses element at index `5`. |
| **Append** | `array[^+]` | Appends an element to end. |
| **Prepend** | `array[+^]` | Prepends an element to beginning. |
| **Remove Last Element** | `array[^-]` | Removes last element. |
| **Remove First Element** | `array[-^]` | Removes first element. |
| **Slicing** | `array[0:5]` | Slices from index `0` (incl.) to `5` (excl.). |
| | `array[::-1]` | Reverses using step of `-1`. |
| | `array[3:]` | Slices from index `3` (incl.) to end. |
| | `array[:8]` | Slices from start to index `8` (excl.). |
| | `array[3:8:2]` | Slices from index `3` (incl.) to `8` (excl.), skipping every 2nd element. |
| | `array[8:3:-2]` | Slices from index `8` (incl.) to `3` (excl.), skipping every 2nd element (reverse). |
| | `array[3::-1]` | Slices from index `3` (incl.) to start (reversed). |
| | `array[:8:-1]` | Slices from end towards index `8` (excl., reversed). |
| | `array[::2]` | Slices entire array, skipping every 2nd element. |
| | `array[::-3]` | Reverses entire array, skipping every 3rd element. |

---

## Extended Backus-Naur Form (EBNF) of FlavorLang's Syntax <a id="ebnf"></a>

```ebnf
Expand Down
55 changes: 55 additions & 0 deletions src/interpreter/builtins.c
Original file line number Diff line number Diff line change
Expand Up @@ -241,13 +241,56 @@ InterpretResult builtin_random(ASTNode *node, Environment *env) {
return make_result(result, false, false);
}

void print_literal_value(LiteralValue lv) {
switch (lv.type) {
case TYPE_FLOAT:
if ((INT_SIZE)lv.data.floating_point == lv.data.floating_point) {
printf("%.1Lf", lv.data.floating_point);
} else {
printf("%Lf", lv.data.floating_point);
}
break;
case TYPE_INTEGER:
printf("%lld", lv.data.integer);
break;
case TYPE_STRING:
printf("\"%s\"", lv.data.string);
break;
case TYPE_BOOLEAN:
printf("%s", lv.data.boolean ? "True" : "False");
break;
case TYPE_ARRAY:
printf("[");
for (size_t i = 0; i < lv.data.array.count; i++) {
print_literal_value(lv.data.array.elements[i]);
if (i < lv.data.array.count - 1) {
printf(", ");
}
}
printf("]");
break;
case TYPE_FUNCTION:
printf("<Function %s>", lv.data.function_ptr->name);
break;
case TYPE_ERROR:
printf("<Error>");
break;
default:
printf("<Unknown>");
}
}

// Built-in `serve()` function for printing
InterpretResult builtin_output(ASTNode *node, Environment *env) {
debug_print_int("builtin_output() called\n");

ASTNode *arg_node = node->function_call.arguments;
while (arg_node != NULL) {
InterpretResult r = interpret_node(arg_node, env);
if (r.is_error) {
return r; // propagate error
}

LiteralValue lv = r.value;

switch (lv.type) {
Expand All @@ -267,6 +310,18 @@ InterpretResult builtin_output(ASTNode *node, Environment *env) {
case TYPE_BOOLEAN:
printf("%s", lv.data.boolean ? "True" : "False");
break;
case TYPE_ARRAY:
printf("[");
for (size_t i = 0; i < lv.data.array.count; i++) {
LiteralValue elem = lv.data.array.elements[i];
print_literal_value(elem);

if (i < lv.data.array.count - 1) {
printf(", ");
}
}
printf("]");
break;
case TYPE_ERROR:
fprintf(
stderr,
Expand Down
1 change: 1 addition & 0 deletions src/interpreter/builtins.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,6 @@ void print_formatted_string(const char *str);
bool is_valid_int(const char *str, INT_SIZE *out_value);
bool is_valid_float(const char *str, FLOAT_SIZE *out_value);
char *process_escape_sequences(const char *input);
void print_literal_value(LiteralValue lv);

#endif
Loading

0 comments on commit 51955b0

Please sign in to comment.