summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-01-10 12:11:38 +0100
committerEugen Wissner <belka@caraus.de>2026-01-10 12:11:38 +0100
commit30e18517abf7bfabdedcb62400e2fd148a414a92 (patch)
treedc69a77ac0a91e6b36cedf9844ea0a1ff2ee1458
parent396c329b63e40eae6ee752b6ce3c050d9281cbec (diff)
downloadelna-30e18517abf7bfabdedcb62400e2fd148a414a92.tar.gz
Fix static arrays in type expressions
-rw-r--r--boot/stage17/cl.elna24
-rw-r--r--boot/stage18/cl.elna31
2 files changed, 34 insertions, 21 deletions
diff --git a/boot/stage17/cl.elna b/boot/stage17/cl.elna
index e1a8e81..70c0348 100644
--- a/boot/stage17/cl.elna
+++ b/boot/stage17/cl.elna
@@ -1841,18 +1841,22 @@ var
integer_token: Word;
integer_length: Word;
result: ^ElnaTreeIntegerLiteral;
+ buffer: Word;
begin
result := malloc(ElnaTreeIntegerLiteral_size());
(* TODO: Convert the integer string to a number. *)
integer_token := _elna_lexer_global_get_start();
- integer_length := _elna_lexer_global_get_end();
- integer_length := integer_length - integer_token;
+ integer_length := _elna_lexer_global_get_end() - integer_token;
+
_elna_lexer_skip_token();
+ buffer := malloc(integer_length + 1);
+ bzero(buffer, integer_length + 1);
+ memcpy(buffer, integer_token, integer_length);
result^.kind := ElnaTreeKind.integer_literal;
- result^.value := integer_token;
- result^.length := integer_length;
+ result^.value := atoi(buffer);
+ result^.length := 0;
result^.type_decoration := nil;
return result
@@ -3382,12 +3386,12 @@ begin
result := malloc(ElnaTypeArray_size());
base := elna_name_type_expression(parser_node^.base);
- (* Expected to be an integer literal for now. *)
+ (* TODO: Expected to be an integer literal for now. *)
length := parser_node^.length;
- result^.kind := ElnaTypeKind.pointer;
+ result^.kind := ElnaTypeKind.array;
(* Array size in bytes. *)
- result^.size := base^.size * length;
+ result^.size := base^.size * length^.value;
result^.base := base;
result^.length := length^.value;
@@ -3476,7 +3480,7 @@ begin
result := malloc(ElnaTreeArrayTypeExpression_size());
result^.kind := ElnaTreeKind.array_type_expression;
- result^.base := elna_parser_binary_expression();
+ result^.length := elna_parser_binary_expression();
(* Read and skip square bracket. *)
_elna_lexer_read_token(@token_kind);
@@ -5457,6 +5461,10 @@ begin
result := ElnaLexerKind.dot
elsif character = '^' then
result := ElnaLexerKind.hat
+ elsif character = '[' then
+ result := ElnaLexerKind.left_square
+ elsif character = ']' then
+ result := ElnaLexerKind.right_square
end;
return result
end;
diff --git a/boot/stage18/cl.elna b/boot/stage18/cl.elna
index ea1292b..4783700 100644
--- a/boot/stage18/cl.elna
+++ b/boot/stage18/cl.elna
@@ -104,8 +104,7 @@ type
ElnaTreeIntegerLiteral = record
kind: ElnaTreeKind;
type_decoration: ^ElnaType;
- value: Word;
- length: Word
+ value: Word
end;
ElnaTreeCharacterLiteral = record
kind: ElnaTreeKind;
@@ -1846,18 +1845,20 @@ var
integer_token: Word;
integer_length: Word;
result: ^ElnaTreeIntegerLiteral;
+ buffer: Word;
begin
result := malloc(#size(ElnaTreeIntegerLiteral));
- (* TODO: Convert the integer string to a number. *)
integer_token := _elna_lexer_global_get_start();
- integer_length := _elna_lexer_global_get_end();
- integer_length := integer_length - integer_token;
+ integer_length := _elna_lexer_global_get_end() - integer_token;
+
_elna_lexer_skip_token();
+ buffer := malloc(integer_length + 1);
+ bzero(buffer, integer_length + 1);
+ memcpy(buffer, integer_token, integer_length);
result^.kind := ElnaTreeKind.integer_literal;
- result^.value := integer_token;
- result^.length := integer_length;
+ result^.value := atoi(buffer);
result^.type_decoration := nil;
return result
@@ -1897,7 +1898,7 @@ proc elna_tac_integer_literal(integer_literal_node: ^ElnaTreeIntegerLiteral, ope
begin
operand_type^ := ElnaTacOperand.immediate;
operand_value^ := integer_literal_node^.value;
- operand_length^ := integer_literal_node^.length;
+ operand_length^ := 0;
return nil
end;
@@ -1924,7 +1925,7 @@ proc elna_parser_character_literal();
var
character: Word;
character_length: Word;
- result: ^ElnaTreeIntegerLiteral;
+ result: ^ElnaTreeCharacterLiteral;
begin
result := malloc(#size(ElnaTreeCharacterLiteral));
@@ -3375,12 +3376,12 @@ begin
result := malloc(#size(ElnaTypeArray));
base := elna_name_type_expression(parser_node^.base);
- (* Expected to be an integer literal for now. *)
+ (* TODO: Expected to be an integer literal for now. *)
length := parser_node^.length;
- result^.kind := ElnaTypeKind.pointer;
+ result^.kind := ElnaTypeKind.array;
(* Array size in bytes. *)
- result^.size := base^.size * length;
+ result^.size := base^.size * length^.value;
result^.base := base;
result^.length := length^.value;
@@ -3468,7 +3469,7 @@ begin
result := malloc(#size(ElnaTreeArrayTypeExpression));
result^.kind := ElnaTreeKind.array_type_expression;
- result^.base := elna_parser_binary_expression();
+ result^.length := elna_parser_binary_expression();
(* Read and skip square bracket. *)
_elna_lexer_read_token(@token_kind);
@@ -5363,6 +5364,10 @@ begin
result := ElnaLexerKind.dot
elsif character = '^' then
result := ElnaLexerKind.hat
+ elsif character = '[' then
+ result := ElnaLexerKind.left_square
+ elsif character = ']' then
+ result := ElnaLexerKind.right_square
end;
return result
end;