Change syntax for tuple indexing
This commit is contained in:
parent
e3e6c6a411
commit
6f5c5c3f62
@ -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");
|
||||||
|
```
|
2
TODO.md
2
TODO.md
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user