Change syntax for tuple indexing

This commit is contained in:
germax26 2024-11-21 10:33:34 +11:00
parent e3e6c6a411
commit 6f5c5c3f62
Signed by: germax26
SSH Key Fingerprint: SHA256:N3w+8798IMWBt7SYH8G1C0iJlIa2HIIcRCXwILT5FvM
4 changed files with 16 additions and 5 deletions

View File

@ -123,11 +123,13 @@ for i in range(0, 10) {
## While loops ## While loops
```
a: int = 0; a: int = 0;
while a < 10 { while a < 10 {
print(int_to_str(a)+"\n"); print(int_to_str(a)+"\n");
a = a + 1; a = a + 1;
} }
```
## Reading files ## Reading files
@ -136,3 +138,8 @@ while a < 10 {
## Assertions ## Assertions
## Tuples ## Tuples
```
a: (int, str) = (0, "hello");
print(int_to_str(a.0)+" "+a.1+"\n");
```

View File

@ -7,7 +7,7 @@
- [x] Make Return just a regular statement - [x] Make Return just a regular statement
- [x] `StructType.{args=...}` syntax - [x] `StructType.{args=...}` syntax
- [x] `[:ElementType, elements...]` syntax - [x] `[:ElementType, elements...]` syntax
- [ ] Tuple element syntax `a.0, a.1`, instead of allowing arbitrary indices into the tuple. This will allow for easier typechecking for tuples - [x] Tuple element syntax `a.0, a.1`, instead of allowing arbitrary indices into the tuple. This will allow for easier typechecking for tuples
- [ ] Make Typechecking a step before anything is interpreted - [ ] Make Typechecking a step before anything is interpreted
- [ ] Implicit `[elements...]`/`.{args=...}`/`.Member(values...)` syntax - [ ] Implicit `[elements...]`/`.{args=...}`/`.Member(values...)` syntax
- [ ] Destructring of tuples and structs - [ ] Destructring of tuples and structs

View File

@ -254,6 +254,11 @@ def calculate_expression(expression: Expression, program: ProgramState) -> Objec
case Struct(type, fields): case Struct(type, fields):
assert field in fields, f"Struct '{type.represent()}' does not have the field '{field}'!" assert field in fields, f"Struct '{type.represent()}' does not have the field '{field}'!"
return fields[field] return fields[field]
case TupleObject(type, tuple_):
assert field.isdigit(), field
tuple_index = int(field)
assert 0 <= tuple_index < len(type.types), f"Index {tuple_index} out of bounds for tuple of length {len(type.types)}"
return tuple_[tuple_index]
case _: assert False, ("Unimplemented", value, field) case _: assert False, ("Unimplemented", value, field)
case ArrayAccess(array_, index_): case ArrayAccess(array_, index_):
array = calculate_expression(array_, program) array = calculate_expression(array_, program)
@ -264,10 +269,7 @@ def calculate_expression(expression: Expression, program: ProgramState) -> Objec
assert 0 <= index.num < len(array.str), f"Index out of bounds. Str of length {len(array.str)} accessed at index {index.num}. {array_, index_}" assert 0 <= index.num < len(array.str), f"Index out of bounds. Str of length {len(array.str)} accessed at index {index.num}. {array_, index_}"
return Str(array.str[index.num]) return Str(array.str[index.num])
elif isinstance(array, TupleObject): elif isinstance(array, TupleObject):
index = calculate_expression(index_, program) assert False, f"Cannot use array index for tuple. Use `<tuple>.<index>` (e.g., `{array_.represent()}.0`) syntax instead"
assert isinstance(index, Int), f"Index must be '{IntType.represent()}', got '{index.get_type().represent()}'!"
assert 0 <= index.num <= len(array.tuple), f"Index out of bounds. Tuple of length {len(array.tuple)} accessed at index {index.num}. {array_, index_}"
return array.tuple[index.num]
elif isinstance(array, ListObject): elif isinstance(array, ListObject):
array_type = array.type.type array_type = array.type.type
index = calculate_expression(index_, program) index = calculate_expression(index_, program)

View File

@ -143,6 +143,8 @@ def parse_primary(lexer: Lexer) -> Expression:
match next_token.contents: match next_token.contents:
case IdentifierToken(identifier=field): case IdentifierToken(identifier=field):
base_expression = FieldAccess(base_expression, field) base_expression = FieldAccess(base_expression, field)
case NumberToken(number=number):
base_expression = FieldAccess(base_expression, str(number))
case SymbolToken(symbol=symbol): case SymbolToken(symbol=symbol):
match symbol: match symbol:
case Symbol.OpenCurly: case Symbol.OpenCurly: