diff options
| -rw-r--r-- | boot/stage17/cl.elna | 24 | ||||
| -rw-r--r-- | boot/stage18/cl.elna | 31 |
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; |
