Fix static arrays in type expressions
This commit is contained in:
@@ -1841,18 +1841,22 @@ var
|
|||||||
integer_token: Word;
|
integer_token: Word;
|
||||||
integer_length: Word;
|
integer_length: Word;
|
||||||
result: ^ElnaTreeIntegerLiteral;
|
result: ^ElnaTreeIntegerLiteral;
|
||||||
|
buffer: Word;
|
||||||
begin
|
begin
|
||||||
result := malloc(ElnaTreeIntegerLiteral_size());
|
result := malloc(ElnaTreeIntegerLiteral_size());
|
||||||
|
|
||||||
(* TODO: Convert the integer string to a number. *)
|
(* TODO: Convert the integer string to a number. *)
|
||||||
integer_token := _elna_lexer_global_get_start();
|
integer_token := _elna_lexer_global_get_start();
|
||||||
integer_length := _elna_lexer_global_get_end();
|
integer_length := _elna_lexer_global_get_end() - integer_token;
|
||||||
integer_length := integer_length - integer_token;
|
|
||||||
_elna_lexer_skip_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^.kind := ElnaTreeKind.integer_literal;
|
||||||
result^.value := integer_token;
|
result^.value := atoi(buffer);
|
||||||
result^.length := integer_length;
|
result^.length := 0;
|
||||||
result^.type_decoration := nil;
|
result^.type_decoration := nil;
|
||||||
|
|
||||||
return result
|
return result
|
||||||
@@ -3382,12 +3386,12 @@ begin
|
|||||||
result := malloc(ElnaTypeArray_size());
|
result := malloc(ElnaTypeArray_size());
|
||||||
base := elna_name_type_expression(parser_node^.base);
|
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;
|
length := parser_node^.length;
|
||||||
|
|
||||||
result^.kind := ElnaTypeKind.pointer;
|
result^.kind := ElnaTypeKind.array;
|
||||||
(* Array size in bytes. *)
|
(* Array size in bytes. *)
|
||||||
result^.size := base^.size * length;
|
result^.size := base^.size * length^.value;
|
||||||
result^.base := base;
|
result^.base := base;
|
||||||
result^.length := length^.value;
|
result^.length := length^.value;
|
||||||
|
|
||||||
@@ -3476,7 +3480,7 @@ begin
|
|||||||
|
|
||||||
result := malloc(ElnaTreeArrayTypeExpression_size());
|
result := malloc(ElnaTreeArrayTypeExpression_size());
|
||||||
result^.kind := ElnaTreeKind.array_type_expression;
|
result^.kind := ElnaTreeKind.array_type_expression;
|
||||||
result^.base := elna_parser_binary_expression();
|
result^.length := elna_parser_binary_expression();
|
||||||
|
|
||||||
(* Read and skip square bracket. *)
|
(* Read and skip square bracket. *)
|
||||||
_elna_lexer_read_token(@token_kind);
|
_elna_lexer_read_token(@token_kind);
|
||||||
@@ -5457,6 +5461,10 @@ begin
|
|||||||
result := ElnaLexerKind.dot
|
result := ElnaLexerKind.dot
|
||||||
elsif character = '^' then
|
elsif character = '^' then
|
||||||
result := ElnaLexerKind.hat
|
result := ElnaLexerKind.hat
|
||||||
|
elsif character = '[' then
|
||||||
|
result := ElnaLexerKind.left_square
|
||||||
|
elsif character = ']' then
|
||||||
|
result := ElnaLexerKind.right_square
|
||||||
end;
|
end;
|
||||||
return result
|
return result
|
||||||
end;
|
end;
|
||||||
|
|||||||
@@ -104,8 +104,7 @@ type
|
|||||||
ElnaTreeIntegerLiteral = record
|
ElnaTreeIntegerLiteral = record
|
||||||
kind: ElnaTreeKind;
|
kind: ElnaTreeKind;
|
||||||
type_decoration: ^ElnaType;
|
type_decoration: ^ElnaType;
|
||||||
value: Word;
|
value: Word
|
||||||
length: Word
|
|
||||||
end;
|
end;
|
||||||
ElnaTreeCharacterLiteral = record
|
ElnaTreeCharacterLiteral = record
|
||||||
kind: ElnaTreeKind;
|
kind: ElnaTreeKind;
|
||||||
@@ -1846,18 +1845,20 @@ var
|
|||||||
integer_token: Word;
|
integer_token: Word;
|
||||||
integer_length: Word;
|
integer_length: Word;
|
||||||
result: ^ElnaTreeIntegerLiteral;
|
result: ^ElnaTreeIntegerLiteral;
|
||||||
|
buffer: Word;
|
||||||
begin
|
begin
|
||||||
result := malloc(#size(ElnaTreeIntegerLiteral));
|
result := malloc(#size(ElnaTreeIntegerLiteral));
|
||||||
|
|
||||||
(* TODO: Convert the integer string to a number. *)
|
|
||||||
integer_token := _elna_lexer_global_get_start();
|
integer_token := _elna_lexer_global_get_start();
|
||||||
integer_length := _elna_lexer_global_get_end();
|
integer_length := _elna_lexer_global_get_end() - integer_token;
|
||||||
integer_length := integer_length - integer_token;
|
|
||||||
_elna_lexer_skip_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^.kind := ElnaTreeKind.integer_literal;
|
||||||
result^.value := integer_token;
|
result^.value := atoi(buffer);
|
||||||
result^.length := integer_length;
|
|
||||||
result^.type_decoration := nil;
|
result^.type_decoration := nil;
|
||||||
|
|
||||||
return result
|
return result
|
||||||
@@ -1897,7 +1898,7 @@ proc elna_tac_integer_literal(integer_literal_node: ^ElnaTreeIntegerLiteral, ope
|
|||||||
begin
|
begin
|
||||||
operand_type^ := ElnaTacOperand.immediate;
|
operand_type^ := ElnaTacOperand.immediate;
|
||||||
operand_value^ := integer_literal_node^.value;
|
operand_value^ := integer_literal_node^.value;
|
||||||
operand_length^ := integer_literal_node^.length;
|
operand_length^ := 0;
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
end;
|
end;
|
||||||
@@ -1924,7 +1925,7 @@ proc elna_parser_character_literal();
|
|||||||
var
|
var
|
||||||
character: Word;
|
character: Word;
|
||||||
character_length: Word;
|
character_length: Word;
|
||||||
result: ^ElnaTreeIntegerLiteral;
|
result: ^ElnaTreeCharacterLiteral;
|
||||||
begin
|
begin
|
||||||
result := malloc(#size(ElnaTreeCharacterLiteral));
|
result := malloc(#size(ElnaTreeCharacterLiteral));
|
||||||
|
|
||||||
@@ -3375,12 +3376,12 @@ begin
|
|||||||
result := malloc(#size(ElnaTypeArray));
|
result := malloc(#size(ElnaTypeArray));
|
||||||
base := elna_name_type_expression(parser_node^.base);
|
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;
|
length := parser_node^.length;
|
||||||
|
|
||||||
result^.kind := ElnaTypeKind.pointer;
|
result^.kind := ElnaTypeKind.array;
|
||||||
(* Array size in bytes. *)
|
(* Array size in bytes. *)
|
||||||
result^.size := base^.size * length;
|
result^.size := base^.size * length^.value;
|
||||||
result^.base := base;
|
result^.base := base;
|
||||||
result^.length := length^.value;
|
result^.length := length^.value;
|
||||||
|
|
||||||
@@ -3468,7 +3469,7 @@ begin
|
|||||||
|
|
||||||
result := malloc(#size(ElnaTreeArrayTypeExpression));
|
result := malloc(#size(ElnaTreeArrayTypeExpression));
|
||||||
result^.kind := ElnaTreeKind.array_type_expression;
|
result^.kind := ElnaTreeKind.array_type_expression;
|
||||||
result^.base := elna_parser_binary_expression();
|
result^.length := elna_parser_binary_expression();
|
||||||
|
|
||||||
(* Read and skip square bracket. *)
|
(* Read and skip square bracket. *)
|
||||||
_elna_lexer_read_token(@token_kind);
|
_elna_lexer_read_token(@token_kind);
|
||||||
@@ -5363,6 +5364,10 @@ begin
|
|||||||
result := ElnaLexerKind.dot
|
result := ElnaLexerKind.dot
|
||||||
elsif character = '^' then
|
elsif character = '^' then
|
||||||
result := ElnaLexerKind.hat
|
result := ElnaLexerKind.hat
|
||||||
|
elsif character = '[' then
|
||||||
|
result := ElnaLexerKind.left_square
|
||||||
|
elsif character = ']' then
|
||||||
|
result := ElnaLexerKind.right_square
|
||||||
end;
|
end;
|
||||||
return result
|
return result
|
||||||
end;
|
end;
|
||||||
|
|||||||
Reference in New Issue
Block a user