Rewrite elna_parser_record_type_expression without manual pointer arithmetic

This commit is contained in:
2026-03-14 08:20:53 +01:00
parent f8ff357045
commit cb6d970fdf

View File

@@ -36,11 +36,13 @@ type
ElnaTypeKind = (primitive, enumeration, _record, pointer, array);
ElnaType = record
kind: ElnaTypeKind;
size: Word
size: Word;
alignment: Word
end;
ElnaTypeEnumeration = record
kind: ElnaTypeKind;
size: Word;
alignment: Word;
members: Word;
length: Word
end;
@@ -52,17 +54,20 @@ type
ElnaTypeRecord = record
kind: ElnaTypeKind;
size: Word;
alignment: Word;
members: Word;
length: Word
end;
ElnaTypePointer = record
kind: ElnaTypeKind;
size: Word;
alignment: Word;
base: Word
end;
ElnaTypeArray = record
kind: ElnaTypeKind;
size: Word;
alignment: Word;
base: Word;
length: Word
end;
@@ -210,9 +215,15 @@ type
members: Word;
length: Word
end;
ElnaTreeField = record
name: Word;
length: Word;
type_expression: ^ElnaTreeNode;
next: Word
end;
ElnaTreeRecordTypeExpression = record
kind: ElnaTreeKind;
members: Word;
members: ^ElnaTreeField;
length: Word
end;
ElnaTreeNamedTypeExpression = record
@@ -3008,45 +3019,38 @@ end;
proc elna_parser_record_type_expression(cursor: ^ElnaLexerCursor);
var
entry: Word;
member_count: Word;
memory_start: Word;
field_type: Word;
result: ^ElnaTreeEnumerationTypeExpression;
previous_entry: Word;
entry: ^ElnaTreeField;
result: ^ElnaTreeRecordTypeExpression;
previous_entry: ^ElnaTreeField;
token: ^ElnaLexerToken;
begin
elna_lexer_read(cursor);
member_count := 0;
memory_start := 0;
result := malloc(#size(ElnaTreeRecordTypeExpression));
result^.members := nil;
result^.length := 0;
token := elna_lexer_read(cursor);
if token^.kind = ElnaLexerKind._end then
goto elna_parser_record_type_expression_end
end;
.elna_parser_record_type_expression_loop;
entry := malloc(16);
member_count := member_count + 1;
entry := malloc(#size(ElnaTreeField));
result^.length := result^.length + 1;
entry^ := token^.start;
entry := entry + 4;
entry^ := token^.length;
entry := entry + 4;
entry^.name := token^.start;
entry^.length := token^.length;
(* Skip the colon. *)
elna_lexer_read(cursor);
field_type := elna_parser_type_expression(cursor);
entry^.type_expression := elna_parser_type_expression(cursor);
entry^.next := nil;
entry^ := field_type;
entry := entry + 4;
entry^ := 0;
if memory_start = 0 then
memory_start := entry - 12
if result^.members = nil then
result^.members := entry
else
previous_entry^ := entry - 12
previous_entry^.next := entry
end;
previous_entry := entry;
@@ -3057,11 +3061,7 @@ begin
end;
.elna_parser_record_type_expression_end;
result := malloc(#size(ElnaTreeEnumerationTypeExpression));
result^.kind := ElnaTreeKind.record_type_expression;
result^.members := memory_start;
result^.length := member_count;
return result
end;
@@ -3159,6 +3159,7 @@ begin
result^.kind := ElnaTypeKind.enumeration;
result^.size := 4;
result^.alignment := 4;
result^.members := member_array_start;
result^.length := member_count;
@@ -3173,6 +3174,7 @@ begin
result^.kind := ElnaTypeKind.pointer;
result^.size := 4;
result^.alignment := 4;
result^.base := elna_name_type_expression(parser_node^.base);
return result
@@ -3193,6 +3195,7 @@ begin
result^.kind := ElnaTypeKind.array;
(* Array size in bytes. *)
result^.size := base^.size * length^.value;
result^.alignment := base^.alignment;
result^.base := base;
result^.length := length^.value;
@@ -3210,6 +3213,7 @@ var
begin
result := malloc(#size(ElnaTypeRecord));
result^.size := 0;
result^.alignment := 0;
memory_start := parser_node^.members;
member_count := parser_node^.length;
@@ -3227,6 +3231,9 @@ begin
field_type := elna_name_type_expression(memory_start^);
result^.size := result^.size + field_type^.size;
if field_type^.alignment > result^.alignment then
result^.alignment := field_type^.alignment
end;
member_array_current^.field_type := field_type;
member_array_current := member_array_current + #size(ElnaTypeField);
@@ -4539,18 +4546,21 @@ begin
word_type := malloc(#size(ElnaType));
word_type^.kind := ElnaTypeKind.primitive;
word_type^.size := 4;
word_type^.alignment := 4;
current_info := _type_info_create(word_type);
elna_symbol_table_enter(@symbol_table_global, "Word", 4, current_info);
current_type := malloc(#size(ElnaType));
current_type^.kind := ElnaTypeKind.primitive;
current_type^.size := 4;
current_type^.alignment := 4;
current_info := _type_info_create(current_type);
elna_symbol_table_enter(@symbol_table_global, "Pointer", 7, current_info);
current_type := malloc(#size(ElnaType));
current_type^.kind := ElnaTypeKind.primitive;
current_type^.size := 1;
current_type^.alignment := 1;
current_info := _type_info_create(current_type);
elna_symbol_table_enter(@symbol_table_global, "Bool", 4, current_info);
end;