diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-08-30 21:07:48 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-08-30 21:07:48 +0200 |
| commit | dbca249757a98d6d56e23db43baa93ad30a91709 (patch) | |
| tree | eaf664d63c7752aabad7994f62e92ae6492e655d | |
| parent | 491e62664394a8689a3f8904fbe8dbc3dea05524 (diff) | |
| download | elna-dbca249757a98d6d56e23db43baa93ad30a91709.tar.gz | |
Use arrow -> for return types
32 files changed, 207 insertions, 191 deletions
diff --git a/boot/lexer.ll b/boot/lexer.ll index eb1bbd3..d0493c1 100644 --- a/boot/lexer.ll +++ b/boot/lexer.ll @@ -444,6 +444,9 @@ to { ! { return yy::parser::make_EXCLAMATION(this->location); } +-> { + return yy::parser::make_ARROW(this->location); +} . { std::stringstream ss; diff --git a/boot/parser.yy b/boot/parser.yy index 669115b..b53a94c 100644 --- a/boot/parser.yy +++ b/boot/parser.yy @@ -90,7 +90,7 @@ along with GCC; see the file COPYING3. If not see %token LEFT_PAREN "(" RIGHT_PAREN ")" LEFT_SQUARE "[" RIGHT_SQUARE "]" %token LEFT_BRACE "{" RIGHT_BRACE "}" %token ASSIGNMENT ":=" - EXCLAMATION "!" + EXCLAMATION "!" ARROW "->" AT "@" HAT "^" COLON ":" SEMICOLON ";" DOT "." COMMA "," %token NOT "~" @@ -188,8 +188,8 @@ identifier_definitions: | identifier_definition { $$.emplace_back(std::move(*$1)); } return_declaration: %empty {} - | ":" "!" { $$ = boot::procedure_type_expression::return_t(std::monostate{}); } - | ":" type_expression { $$ = boot::procedure_type_expression::return_t($2); } + | "->" "!" { $$ = boot::procedure_type_expression::return_t(std::monostate{}); } + | "->" type_expression { $$ = boot::procedure_type_expression::return_t($2); } procedure_heading: "(" optional_fields ")" return_declaration { $$ = std::make_unique<boot::procedure_type_expression>(boot::make_position(@$), $2, $4); } procedure_declaration: @@ -623,7 +623,7 @@ var * * Returns the offset from the beginning of the storage to the new string. *) -proc elna_tac_add_string(string: ^Char; string_length: Word): Word +proc elna_tac_add_string(string: ^Char; string_length: Word) -> Word var result: Word current_byte: Char @@ -734,7 +734,7 @@ end (** * Appends a new element to the end of the list. *) -proc elna_list_append(list: ^ElnaList; element: ^ElnaListNode): ^ElnaListNode +proc elna_list_append(list: ^ElnaList; element: ^ElnaListNode) -> ^ElnaListNode begin if element <> nil then if list^.first = nil then @@ -773,7 +773,7 @@ begin end (* Returns whether the given list is empty. *) -proc elna_list_empty(list: ^ElnaList): Bool +proc elna_list_empty(list: ^ElnaList) -> Bool begin return list^.first = nil end @@ -803,7 +803,7 @@ begin this^.operands[n].length := operand_length end -proc elna_tac_instruction_create(kind: Word): ^ElnaTacInstruction +proc elna_tac_instruction_create(kind: Word) -> ^ElnaTacInstruction var result: ^ElnaTacInstruction begin @@ -815,7 +815,7 @@ begin return result end -proc elna_rtl_instruction_create(operator: ElnaRtlOperator): ^ElnaRtlInstruction +proc elna_rtl_instruction_create(operator: ElnaRtlOperator) -> ^ElnaRtlInstruction var result: ^ElnaRtlInstruction begin @@ -842,7 +842,7 @@ end * Loads or moves the value from a TAC operand into the given register. *) proc elna_rtl_hardware_value(instructions: ^ElnaList, operand: ^ElnaTacOperand, - into: ElnaRtlRegister, variable_map: ^ElnaSymbolTable): Word + into: ElnaRtlRegister, variable_map: ^ElnaSymbolTable) -> Word var instruction: ^ElnaRtlInstruction pseudo_symbol: ^ElnaRtlObjectInfo @@ -896,7 +896,7 @@ begin end proc elna_rtl_operand_value(instructions: ^ElnaList; tac_operand: ^ElnaTacOperand; variable_map: ^ElnaSymbolTable; - rtl_operand: ^ElnaRtlOperand): ^ElnaRtlInfo + rtl_operand: ^ElnaRtlOperand) -> ^ElnaRtlInfo var instruction: ^ElnaRtlInstruction pseudo_symbol: ^ElnaRtlObjectInfo @@ -931,7 +931,7 @@ begin end proc elna_rtl_binary_arithmetic(instructions: ^ElnaList; tac_instruction: ^ElnaTacInstruction; - operation: ElnaRtlOperator; variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + operation: ElnaRtlOperator; variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction var result: ^ElnaRtlInstruction rtl_operand: ElnaRtlOperand @@ -999,7 +999,7 @@ begin end proc elna_rtl_set_less_than(instructions: ^ElnaList; tac_instruction: ^ElnaTacInstruction; - lhs, rhs: Word; variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + lhs, rhs: Word; variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction var slt_instruction: ^ElnaRtlInstruction rtl_operand: ElnaRtlOperand @@ -1038,7 +1038,7 @@ begin end proc elna_rtl_variable_address(variable_map: ^ElnaSymbolTable; pseudo_symbol: ^ElnaRtlObjectInfo; - addressable: ^ElnaTacOperand; target_operand: ^ElnaRtlOperand): ^ElnaRtlInstruction + addressable: ^ElnaTacOperand; target_operand: ^ElnaRtlOperand) -> ^ElnaRtlInstruction var instruction: ^ElnaRtlInstruction begin @@ -1065,7 +1065,7 @@ begin end proc elna_rtl_operand_address(variable_map: ^ElnaSymbolTable; - addressable: ^ElnaTacOperand; target_operand: ^ElnaRtlOperand): ^ElnaRtlInstruction + addressable: ^ElnaTacOperand; target_operand: ^ElnaRtlOperand) -> ^ElnaRtlInstruction var pseudo_symbol: ^ElnaRtlObjectInfo instruction: ^ElnaRtlInstruction @@ -1498,7 +1498,7 @@ end (** * Generates an auto incremented label and returns its name. *) -proc elna_tac_label(): String +proc elna_tac_label() -> String var buffer: String begin @@ -1512,7 +1512,7 @@ begin end proc elna_riscv_instruction_name(instruction_kind: ElnaRtlOperator; - source_type, destination_type: ^ElnaRtlType): Word + source_type, destination_type: ^ElnaRtlType) -> Word var argument_count: Word begin @@ -1629,7 +1629,7 @@ begin end proc elna_alloc_variable(operand_value, operand_length: Word; - variable_map: ^ElnaSymbolTable): ^ElnaRtlObjectInfo + variable_map: ^ElnaSymbolTable) -> ^ElnaRtlObjectInfo var pseudo_symbol: ^ElnaRtlObjectInfo pseudo_type: ^ElnaRtlTypeByteArray @@ -1665,7 +1665,7 @@ end * to a temporary register and preserves its value in the following instruction. *) proc elna_alloc_operation_target(instructions: ^ElnaList; instruction: ^ElnaRtlInstruction; - variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction var pseudo_symbol: ^ElnaRtlObjectInfo store_instruction: ^ElnaRtlInstruction @@ -1710,7 +1710,7 @@ begin end proc elna_alloc_store(instructions: ^ElnaList; instruction: ^ElnaRtlInstruction; - variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction var store_instruction: ^ElnaRtlInstruction pseudo_symbol: ^ElnaRtlObjectInfo @@ -1741,7 +1741,7 @@ begin end proc elna_alloc_load(instructions: ^ElnaList; instruction: ^ElnaRtlInstruction; - variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction var new_instruction: ^ElnaRtlInstruction pseudo_symbol: ^ElnaRtlObjectInfo @@ -1770,7 +1770,7 @@ begin end proc elna_alloc_move(instructions: ^ElnaList; instruction: ^ElnaRtlInstruction; - variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction var load_instruction: ^ElnaRtlInstruction source_operand: ElnaRtlOperand @@ -1865,7 +1865,7 @@ end * current instruction and returns the new current instruction. *) proc elna_alloc_operand(instructions: ^ElnaList; instruction: ^ElnaRtlInstruction; - number: Word; target: ElnaRtlRegister; variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + number: Word; target: ElnaRtlRegister; variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction var main_instruction: ^ElnaRtlInstruction load_instruction: ^ElnaRtlInstruction @@ -1911,7 +1911,7 @@ begin end proc elna_alloc_binary(instructions: ^ElnaList; instruction: ^ElnaRtlInstruction; - variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction begin instruction := elna_alloc_operand(instructions, instruction, 2, ElnaRtlRegister.t0, variable_map); instruction := elna_alloc_operand(instructions, instruction, 3, ElnaRtlRegister.t1, variable_map); @@ -1919,14 +1919,14 @@ begin end proc elna_alloc_unary(instructions: ^ElnaList; instruction: ^ElnaRtlInstruction; - variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction begin instruction := elna_alloc_operand(instructions, instruction, 2, ElnaRtlRegister.t0, variable_map); return elna_alloc_operation_target(instructions, instruction, variable_map) end proc elna_alloc_instruction(instructions: ^ElnaList; instruction: ^ElnaRtlInstruction; - variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction var pseudo_symbol: ^ElnaRtlObjectInfo new_instruction: ^ElnaRtlInstruction @@ -2144,7 +2144,7 @@ begin end end -proc elna_rtl_module_declaration(tac_module: ^ElnaInstructionModule): ^ElnaInstructionModule +proc elna_rtl_module_declaration(tac_module: ^ElnaInstructionModule) -> ^ElnaInstructionModule var result: ^ElnaInstructionModule count: Word @@ -2191,7 +2191,7 @@ begin elna_alloc_procedure(pair^.code) end -proc _align_at(address, alignment: Word): Word +proc _align_at(address, alignment: Word) -> Word begin if address % alignment then address := address + alignment @@ -2262,7 +2262,7 @@ begin _write_s(stdout, "\"\n") end -proc elna_parser_integer_literal(cursor: ^ElnaLexerCursor): ^ElnaTreeIntegerLiteral +proc elna_parser_integer_literal(cursor: ^ElnaLexerCursor) -> ^ElnaTreeIntegerLiteral var token: ^ElnaLexerToken result: ^ElnaTreeIntegerLiteral @@ -2285,7 +2285,7 @@ begin return result end -proc elna_parser_boolean_literal(cursor: ^ElnaLexerCursor): ^ElnaTreeBooleanLiteral +proc elna_parser_boolean_literal(cursor: ^ElnaLexerCursor) -> ^ElnaTreeBooleanLiteral var token: ^ElnaLexerToken result: ^ElnaTreeBooleanLiteral @@ -2301,7 +2301,7 @@ begin return result end -proc elna_parser_nil_literal(cursor: ^ElnaLexerCursor): ^ElnaTreeNilLiteral +proc elna_parser_nil_literal(cursor: ^ElnaLexerCursor) -> ^ElnaTreeNilLiteral var token: ^ElnaLexerToken result: ^ElnaTreeNilLiteral @@ -2341,7 +2341,7 @@ begin end (* Escape a single character if needed. *) -proc elna_parser_escape(current_position, result: ^Char): Word +proc elna_parser_escape(current_position, result: ^Char) -> Word var parsed_length: Word next_character: Char @@ -2389,7 +2389,7 @@ begin return parsed_length end -proc elna_parser_character_literal(cursor: ^ElnaLexerCursor): ^ElnaTreeCharacterLiteral +proc elna_parser_character_literal(cursor: ^ElnaLexerCursor) -> ^ElnaTreeCharacterLiteral var result: ^ElnaTreeCharacterLiteral token: ^ElnaLexerToken @@ -2415,7 +2415,7 @@ begin operand^.length := char_type^.size end -proc elna_parser_variable_expression(cursor: ^ElnaLexerCursor): ^ElnaTreeVariableExpression +proc elna_parser_variable_expression(cursor: ^ElnaLexerCursor) -> ^ElnaTreeVariableExpression var result: ^ElnaTreeVariableExpression token: ^ElnaLexerToken @@ -2438,7 +2438,7 @@ begin operand^.length := variable_expression^.name.length end -proc elna_parser_string_literal(cursor: ^ElnaLexerCursor): ^ElnaTreeStringLiteral +proc elna_parser_string_literal(cursor: ^ElnaLexerCursor) -> ^ElnaTreeStringLiteral var result: ^ElnaTreeStringLiteral token: ^ElnaLexerToken @@ -2509,7 +2509,7 @@ begin elna_list_append(instructions, instruction) end -proc elna_parser_trait_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeTraitExpression +proc elna_parser_trait_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeTraitExpression var result: ^ElnaTreeTraitExpression token: ^ElnaLexerToken @@ -2536,7 +2536,7 @@ begin return result end -proc elna_parser_cast_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeCastExpression +proc elna_parser_cast_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeCastExpression var result: ^ElnaTreeCastExpression token: ^ElnaLexerToken @@ -2578,7 +2578,7 @@ begin return result end -proc elna_parser_simple_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeExpression +proc elna_parser_simple_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeExpression var current_character: Word parser_node: ^ElnaTreeExpression @@ -2608,7 +2608,7 @@ begin end proc elna_parser_dereference_expression(cursor: ^ElnaLexerCursor; - simple_expression: ^ElnaTreeExpression): ^ElnaTreeDereferenceExpression + simple_expression: ^ElnaTreeExpression) -> ^ElnaTreeDereferenceExpression var result: ^ElnaTreeDereferenceExpression token: ^ElnaLexerToken @@ -2624,7 +2624,7 @@ begin return result end -proc elna_parser_designator(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeExpression +proc elna_parser_designator(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeExpression var simple_expression: ^ElnaTreeExpression token: ^ElnaLexerToken @@ -2702,7 +2702,7 @@ begin end end -proc elna_parser_unary_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeExpression +proc elna_parser_unary_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeExpression var result: ^ElnaTreeUnaryExpression operand: Word @@ -2823,7 +2823,7 @@ begin end end -proc elna_parser_binary_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeExpression +proc elna_parser_binary_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeExpression var lhs_node: ^ElnaTreeExpression rhs_node: ^ElnaTreeExpression @@ -2894,7 +2894,7 @@ begin end proc elna_tac_add_pointer(parser_node: ^ElnaTreeExpression, lhs, rhs: ^ElnaTacOperand, - symbol_table: ^ElnaSymbolTable; operand: ^ElnaTacOperand): ^ElnaTacInstruction + symbol_table: ^ElnaSymbolTable; operand: ^ElnaTacOperand) -> ^ElnaTacInstruction var instruction: ^ElnaTacInstruction pointer_type: ^ElnaTypePointer @@ -3009,7 +3009,7 @@ begin end end -proc elna_parser_call(cursor: ^ElnaLexerCursor; callee: ^ElnaTreeExpression; error_list: ^ElnaList): ^ElnaTreeCall +proc elna_parser_call(cursor: ^ElnaLexerCursor; callee: ^ElnaTreeExpression; error_list: ^ElnaList) -> ^ElnaTreeCall var result: ^ElnaTreeCall argument_entry: ^ElnaTreeExpressionList @@ -3109,7 +3109,7 @@ begin elna_list_append(instructions, call_instruction) end -proc elna_parser_goto_statement(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeGotoStatement +proc elna_parser_goto_statement(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeGotoStatement var result: ^ElnaTreeGotoStatement token: ^ElnaLexerToken @@ -3149,7 +3149,7 @@ begin elna_list_append(instructions, instruction) end -proc elna_parser_label_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeLabelDeclaration +proc elna_parser_label_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeLabelDeclaration var result: ^ElnaTreeLabelDeclaration token: ^ElnaLexerToken @@ -3219,7 +3219,7 @@ begin end proc elna_parser_field_access_expression(cursor: ^ElnaLexerCursor; - aggregate: ^ElnaTreeExpression): ^ElnaTreeFieldAccessExpression + aggregate: ^ElnaTreeExpression) -> ^ElnaTreeFieldAccessExpression var result: ^ElnaTreeFieldAccessExpression token: ^ElnaLexerToken @@ -3242,7 +3242,7 @@ begin end proc elna_parser_array_access_expression(cursor: ^ElnaLexerCursor; - array: ^ElnaTreeExpression; error_list: ^ElnaList): ^ElnaTreeArrayAccessExpression + array: ^ElnaTreeExpression; error_list: ^ElnaList) -> ^ElnaTreeArrayAccessExpression var result: ^ElnaTreeArrayAccessExpression token: ^ElnaLexerToken @@ -3417,7 +3417,7 @@ begin elna_list_append(instructions, instruction) end -proc elna_parser_assign_statement(cursor: ^ElnaLexerCursor; assignee: ^ElnaTreeNode; error_list: ^ElnaList): ^ElnaTreeAssignStatement +proc elna_parser_assign_statement(cursor: ^ElnaLexerCursor; assignee: ^ElnaTreeNode; error_list: ^ElnaList) -> ^ElnaTreeAssignStatement var token: ^ElnaLexerToken result: ^ElnaTreeAssignStatement @@ -3474,7 +3474,7 @@ begin elna_list_append(instructions, instruction) end -proc elna_parser_return_statement(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeReturnStatement +proc elna_parser_return_statement(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeReturnStatement var token: ^ElnaLexerToken result: ^ElnaTreeReturnStatement @@ -3507,7 +3507,7 @@ begin end proc elna_parser_conditional_statements(cursor: ^ElnaLexerCursor; error_list: ^ElnaList; - block_keyword: ElnaLexerKind): ^ElnaTreeConditionalStatements + block_keyword: ElnaLexerKind) -> ^ElnaTreeConditionalStatements var result: ^ElnaTreeConditionalStatements begin @@ -3561,7 +3561,7 @@ begin elna_list_append(instructions, instruction) end -proc elna_parser_if_statement(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeIfStatement +proc elna_parser_if_statement(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeIfStatement var result: ^ElnaTreeIfStatement previous_conditional: ^ElnaTreeConditionalStatements @@ -3598,7 +3598,7 @@ begin return result end -proc elna_parser_statement(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeStatement +proc elna_parser_statement(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeStatement var result: ^ElnaTreeStatement call_result: ^ElnaTreeCallStatement @@ -3634,7 +3634,7 @@ begin return result end -proc elna_parser_statements(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeStatement +proc elna_parser_statements(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeStatement var previous_statement: ^ElnaTreeStatement next_statement: ^ElnaTreeStatement @@ -3742,7 +3742,7 @@ begin _write_c(stdout, register_number + '0') end -proc elna_parser_record_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeRecordTypeExpression +proc elna_parser_record_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeRecordTypeExpression var entry: ^ElnaTreeField result: ^ElnaTreeRecordTypeExpression @@ -3826,7 +3826,7 @@ begin return result end -proc elna_parser_enumeration_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeEnumerationTypeExpression +proc elna_parser_enumeration_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeEnumerationTypeExpression var result: ^ElnaTreeEnumerationTypeExpression entry: ^ElnaTreeEnumeration @@ -3981,7 +3981,7 @@ begin end end -proc elna_parser_named_type_expression(cursor: ^ElnaLexerCursor): ^ElnaTreeNamedTypeExpression +proc elna_parser_named_type_expression(cursor: ^ElnaLexerCursor) -> ^ElnaTreeNamedTypeExpression var result: ^ElnaTreeNamedTypeExpression token: ^ElnaLexerToken @@ -3996,7 +3996,7 @@ begin return result end -proc elna_parser_pointer_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreePointerTypeExpression +proc elna_parser_pointer_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreePointerTypeExpression var result: ^ElnaTreePointerTypeExpression token: ^ElnaLexerToken @@ -4015,7 +4015,7 @@ begin return result end -proc elna_parser_array_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeArrayTypeExpression +proc elna_parser_array_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeArrayTypeExpression var result: ^ElnaTreeArrayTypeExpression token: ^ElnaLexerToken @@ -4047,7 +4047,7 @@ begin return result end -proc elna_parser_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeTypeExpression +proc elna_parser_type_expression(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeTypeExpression var result: ^ElnaTreeNode token: ^ElnaLexerToken @@ -4094,7 +4094,7 @@ begin result^.base := aliased_type end -proc elna_name_named_type_expression(parser_node: ^ElnaTreeNamedTypeExpression; error_list: ^ElnaList): ^ElnaType +proc elna_name_named_type_expression(parser_node: ^ElnaTreeNamedTypeExpression; error_list: ^ElnaList) -> ^ElnaType var type_symbol: ^ElnaSymbolTypeInfo result: ^ElnaType @@ -4117,7 +4117,7 @@ begin return result end -proc elna_name_type_expression(parser_node: ^ElnaTreeTypeExpression; error_list: ^ElnaList): ^ElnaType +proc elna_name_type_expression(parser_node: ^ElnaTreeTypeExpression; error_list: ^ElnaList) -> ^ElnaType var named_type_expression: ^ElnaTreeNamedTypeExpression type_symbol: ^ElnaSymbolTypeInfo @@ -4150,7 +4150,7 @@ begin return result end -proc elna_symbol_type_info_create(type_representation: ^ElnaType): ^ElnaSymbolTypeInfo +proc elna_symbol_type_info_create(type_representation: ^ElnaType) -> ^ElnaSymbolTypeInfo var result: ^ElnaSymbolTypeInfo begin @@ -4166,7 +4166,7 @@ end * attr - Local variable attributes. * temporary_type - Local variable type. *) -proc elna_symbol_temporary_info_create(attr: Word; temporary_type: ^ElnaType): ^ElnaSymbolTemporaryInfo +proc elna_symbol_temporary_info_create(attr: Word; temporary_type: ^ElnaType) -> ^ElnaSymbolTemporaryInfo var result: ^ElnaSymbolTemporaryInfo begin @@ -4184,7 +4184,7 @@ end * Parameters: * symbol_table - Local symbol table. *) -proc elna_symbol_procedure_info_create(is_extern: Bool): ^ElnaSymbolProcedureInfo +proc elna_symbol_procedure_info_create(is_extern: Bool) -> ^ElnaSymbolProcedureInfo var result: ^ElnaSymbolProcedureInfo begin @@ -4231,7 +4231,7 @@ begin end end -proc elna_parser_parameters(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeVariableDeclaration +proc elna_parser_parameters(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeVariableDeclaration var parameters: ^ElnaTreeVariableDeclaration token: ^ElnaLexerToken @@ -4268,7 +4268,7 @@ begin return parameters end -proc elna_parser_procedure_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeProcedureDeclaration +proc elna_parser_procedure_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeProcedureDeclaration var next_declaration: ^ElnaTreeDeclaration current_declaration: ^ElnaTreeDeclaration @@ -4359,7 +4359,7 @@ begin return result end -proc elna_tac_parameters(ast_list: ^ElnaTreeDeclaration; parameter_count: ^Word): ^String +proc elna_tac_parameters(ast_list: ^ElnaTreeDeclaration; parameter_count: ^Word) -> ^String var ast_parameter: ^ElnaTreeDeclaration parameter_index: Word @@ -4396,7 +4396,7 @@ begin return parameter_list end -proc elna_rtl_global_declaration(tac_declaration: ^ElnaTacStaticVariable): ^ElnaRtlStaticVariable +proc elna_rtl_global_declaration(tac_declaration: ^ElnaTacStaticVariable) -> ^ElnaRtlStaticVariable var result: ^ElnaRtlStaticVariable begin @@ -4410,7 +4410,7 @@ begin end proc elna_rtl_parameters(instructions: ^ElnaList; parameters, count: Word; - variable_map: ^ElnaSymbolTable): ^ElnaRtlInstruction + variable_map: ^ElnaSymbolTable) -> ^ElnaRtlInstruction var result: ^ElnaRtlInstruction instruction: ^ElnaRtlInstruction @@ -4475,7 +4475,7 @@ begin end (* Returns whether the provided type is array or record. *) -proc elna_type_is_aggregate(_type: ^ElnaType): Bool +proc elna_type_is_aggregate(_type: ^ElnaType) -> Bool var lhs: Word rhs: Word @@ -4487,7 +4487,7 @@ begin end proc elna_rtl_generate_pseudo(operand: ^ElnaRtlOperand; variable_map: ^ElnaSymbolTable; - rtl_type: ^ElnaRtlType): ^ElnaRtlObjectInfo + rtl_type: ^ElnaRtlType) -> ^ElnaRtlObjectInfo var pseudo_symbol: ^ElnaRtlObjectInfo pseudo_type: ^ElnaRtlTypeWord @@ -4511,7 +4511,7 @@ begin return pseudo_symbol end -proc elna_rtl_constant_type(size: Word): ^ElnaRtlType +proc elna_rtl_constant_type(size: Word) -> ^ElnaRtlType var rtl_type: ^ElnaRtlType begin @@ -4524,7 +4524,7 @@ begin return rtl_type end -proc elna_rtl_symbol_type(variable_type: ^ElnaType): ^ElnaRtlType +proc elna_rtl_symbol_type(variable_type: ^ElnaType) -> ^ElnaRtlType var byte_array: ^ElnaRtlTypeByteArray rtl_type: ^ElnaRtlType @@ -4542,7 +4542,7 @@ begin return rtl_type end -proc elna_rtl_procedure_declaration(tac_declaration: ^ElnaTacProcedure): ^ElnaRtlProcedure +proc elna_rtl_procedure_declaration(tac_declaration: ^ElnaTacProcedure) -> ^ElnaRtlProcedure var count: Word current_entry: ^ElnaSymbolEntry @@ -4590,7 +4590,7 @@ begin return result end -proc elna_tac_procedure_declaration(parser_node: ^ElnaTreeProcedureDeclaration): ^ElnaTacProcedure +proc elna_tac_procedure_declaration(parser_node: ^ElnaTreeProcedureDeclaration) -> ^ElnaTacProcedure var symbol_info: ^ElnaSymbolProcedureInfo result: ^ElnaTacProcedure @@ -4615,7 +4615,7 @@ begin return result end -proc elna_parser_procedures(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeDeclaration +proc elna_parser_procedures(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeDeclaration var parser_node: ^ElnaTreeDeclaration result: ^ElnaTreeDeclaration @@ -4644,7 +4644,7 @@ begin return result end -proc elna_rtl_globals(tac_procedure: ^ElnaTacStaticVariable): ^ElnaRtlStaticVariable +proc elna_rtl_globals(tac_procedure: ^ElnaTacStaticVariable) -> ^ElnaRtlStaticVariable var current_copy: ^ElnaRtlStaticVariable next_copy: ^ElnaRtlStaticVariable @@ -4672,7 +4672,7 @@ begin return first_copy end -proc elna_rtl_procedures(tac_procedure: ^ElnaTacProcedure): ^ElnaRtlProcedure +proc elna_rtl_procedures(tac_procedure: ^ElnaTacProcedure) -> ^ElnaRtlProcedure var current_copy: ^ElnaRtlProcedure next_copy: ^ElnaRtlProcedure @@ -4700,7 +4700,7 @@ begin return first_copy end -proc elna_tac_procedures(parser_node: ^ElnaTreeProcedureDeclaration): ^ElnaTacProcedure +proc elna_tac_procedures(parser_node: ^ElnaTreeProcedureDeclaration) -> ^ElnaTacProcedure var result: ^ElnaTacProcedure current_procedure: ^ElnaTacProcedure @@ -4728,7 +4728,7 @@ begin return first_procedure end -proc elna_parser_type_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeTypeDeclaration +proc elna_parser_type_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeTypeDeclaration var result: ^ElnaTreeTypeDeclaration token: ^ElnaLexerToken @@ -4773,7 +4773,7 @@ begin end end -proc elna_parser_type_part(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeDeclaration +proc elna_parser_type_part(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeDeclaration var parser_node: ^ElnaTreeDeclaration result: ^ElnaTreeDeclaration @@ -4809,7 +4809,7 @@ begin return result end -proc elna_parser_variable_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeVariableDeclaration +proc elna_parser_variable_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeVariableDeclaration var variable_type: Word result: ^ElnaTreeVariableDeclaration @@ -4836,7 +4836,7 @@ begin return result end -proc elna_tac_variable_declaration(parser_tree: ^ElnaTreeVariableDeclaration): ^ElnaTacStaticVariable +proc elna_tac_variable_declaration(parser_tree: ^ElnaTreeVariableDeclaration) -> ^ElnaTacStaticVariable var result: ^ElnaTacStaticVariable variable_info: ^ElnaSymbolTemporaryInfo @@ -4851,7 +4851,7 @@ begin return result end -proc elna_parser_var_part(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeVariableDeclaration +proc elna_parser_var_part(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeVariableDeclaration var result: ^ElnaTreeDeclaration variable_node: ^ElnaTreeDeclaration @@ -4887,7 +4887,7 @@ begin return result end -proc elna_tac_var_part(parser_node: ^ElnaTreeDeclaration): ^ElnaTacStaticVariable +proc elna_tac_var_part(parser_node: ^ElnaTreeDeclaration) -> ^ElnaTacStaticVariable var node: ^ElnaTacStaticVariable current_variable: ^ElnaTacStaticVariable @@ -4916,7 +4916,7 @@ begin return first_variable end -proc elna_parser_program_body(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeStatement +proc elna_parser_program_body(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeStatement var result: ^ElnaTreeStatement token: ^ElnaLexerToken @@ -4931,7 +4931,7 @@ begin return result end -proc elna_error_unexpected_token_create(cursor: ^ElnaLexerCursor; number_of_expected: Word): ^ElnaErrorUnexpectedToken +proc elna_error_unexpected_token_create(cursor: ^ElnaLexerCursor; number_of_expected: Word) -> ^ElnaErrorUnexpectedToken var parser_error: ^ElnaErrorUnexpectedToken begin @@ -4946,7 +4946,7 @@ begin return parser_error end -proc elna_error_duplicate_declaration_create(declaration_tree: ^ElnaTreeDeclaration): ^ElnaErrorDuplicateDeclaration +proc elna_error_duplicate_declaration_create(declaration_tree: ^ElnaTreeDeclaration) -> ^ElnaErrorDuplicateDeclaration var declaration_error: ^ElnaErrorDuplicateDeclaration begin @@ -4960,7 +4960,7 @@ end (* Check and return whether the next token is of the expected kind. If so the token is skipped, otherwise an error is added to the error list. *) -proc elna_parser_expect(cursor: ^ElnaLexerCursor; expected: ElnaLexerKind; error_list: ^ElnaList): ^ElnaLexerToken +proc elna_parser_expect(cursor: ^ElnaLexerCursor; expected: ElnaLexerKind; error_list: ^ElnaList) -> ^ElnaLexerToken var token: ^ElnaLexerToken parser_error: ^ElnaErrorUnexpectedToken @@ -4981,7 +4981,7 @@ begin return token end -proc elna_parser_module_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList): ^ElnaTreeModuleDeclaration +proc elna_parser_module_declaration(cursor: ^ElnaLexerCursor; error_list: ^ElnaList) -> ^ElnaTreeModuleDeclaration var result: ^ElnaTreeModuleDeclaration begin @@ -5017,7 +5017,7 @@ begin return result end -proc elna_tac_program_body(parser_node: ^ElnaTreeStatement): ^ElnaTacProcedure +proc elna_tac_program_body(parser_node: ^ElnaTreeStatement) -> ^ElnaTacProcedure var result: ^ElnaTacProcedure symbol_info: ^ElnaSymbolProcedureInfo @@ -5040,7 +5040,7 @@ begin return result end -proc elna_tac_module_declaration(parser_node: ^ElnaTreeModuleDeclaration): ^ElnaInstructionModule +proc elna_tac_module_declaration(parser_node: ^ElnaTreeModuleDeclaration) -> ^ElnaInstructionModule var result: ^ElnaInstructionModule code: ^ElnaTacProcedure @@ -5930,7 +5930,7 @@ begin _write_s(stderr, ".\n") end -proc compile(): Bool +proc compile() -> Bool var parser_node: Word tac: Word @@ -5991,7 +5991,7 @@ end * * Returns the symbol pointer or nil. *) -proc elna_symbol_table_lookup(symbol_table: ^ElnaSymbolTable; symbol_name: ^Char; name_length: Word): Pointer +proc elna_symbol_table_lookup(symbol_table: ^ElnaSymbolTable; symbol_name: ^Char; name_length: Word) -> Pointer var result: Pointer symbol_table_length: Word @@ -6036,7 +6036,7 @@ end * * Returns newly allocated, empty symbol table. *) -proc elna_symbol_table_create(parent: ^ElnaSymbolTable): ^ElnaSymbolTable +proc elna_symbol_table_create(parent: ^ElnaSymbolTable) -> ^ElnaSymbolTable var new_symbol_table: ^ElnaSymbolTable begin diff --git a/source/cctype.elna b/source/cctype.elna index 1296a10..13dc50a 100644 --- a/source/cctype.elna +++ b/source/cctype.elna @@ -2,22 +2,22 @@ v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. *) -proc isdigit*(c: Int ): Int +proc isdigit*(c: Int ) -> Int extern -proc isalnum*(c: Int): Int +proc isalnum*(c: Int) -> Int extern -proc isalpha*(c: Int): Int +proc isalpha*(c: Int) -> Int extern -proc isspace*(c: Int): Int +proc isspace*(c: Int) -> Int extern -proc tolower*(c: Int): Int +proc tolower*(c: Int) -> Int extern -proc toupper*(c: Int): Int +proc toupper*(c: Int) -> Int extern end. diff --git a/source/command_line_interface.elna b/source/command_line_interface.elna index 62965db..0feb53b 100644 --- a/source/command_line_interface.elna +++ b/source/command_line_interface.elna @@ -15,7 +15,7 @@ type parse: Bool end -proc parse_command_line*(argc: Int; argv: ^^Word8): ^CommandLine +proc parse_command_line*(argc: Int; argv: ^^Word8) -> ^CommandLine var parameter: ^Word8 i: Int diff --git a/source/common.elna b/source/common.elna index c5b67f8..0a50fe1 100644 --- a/source/common.elna +++ b/source/common.elna @@ -14,7 +14,7 @@ type end_location: ElnaLocation end -proc write*(fd: Int; buf: Pointer; Word: Int): Int +proc write*(fd: Int; buf: Pointer; Word: Int) -> Int extern proc write_s*(value: []const Word8) @@ -72,13 +72,13 @@ begin write_i(cast(value: Int)) return -proc free_and_nil*(pointer: Pointer): Pointer +proc free_and_nil*(pointer: Pointer) -> Pointer begin free(pointer) return nil (* Returns true or false depending whether two strings are equal. *) -proc string_compare*(lhs_pointer: ^Word8; lhs_length: Word; rhs_pointer: []const Word8): Bool +proc string_compare*(lhs_pointer: ^Word8; lhs_length: Word; rhs_pointer: []const Word8) -> Bool var result: Bool begin diff --git a/source/cstdio.elna b/source/cstdio.elna index 78c3a24..bf74234 100644 --- a/source/cstdio.elna +++ b/source/cstdio.elna @@ -10,49 +10,49 @@ var stdout*: ^FILE := extern stderr*: ^FILE := extern -proc fopen*(pathname, mode: ^const Word8): ^FILE +proc fopen*(pathname, mode: ^const Word8) -> ^FILE extern -proc fclose*(stream: ^FILE): Int +proc fclose*(stream: ^FILE) -> Int extern -proc fseek*(stream: ^FILE; off: Int; whence: Int): Int +proc fseek*(stream: ^FILE; off: Int; whence: Int) -> Int extern proc rewind*(stream: ^FILE) extern -proc ftell*(stream: ^FILE): Int +proc ftell*(stream: ^FILE) -> Int extern -proc fflush*(stream: ^FILE): Int +proc fflush*(stream: ^FILE) -> Int extern -proc fread*(ptr: Pointer; size: Word; nmemb: Word; stream: ^FILE): Word +proc fread*(ptr: Pointer; size: Word; nmemb: Word; stream: ^FILE) -> Word extern -proc fwrite*(ptr: const Pointer; size: Word; nitems: Word; stream: ^FILE): Word +proc fwrite*(ptr: const Pointer; size: Word; nitems: Word; stream: ^FILE) -> Word extern -proc fputc*(c: Int; stream: ^FILE): Word +proc fputc*(c: Int; stream: ^FILE) -> Word extern proc perror*(s: ^const Word8) extern -proc puts*(s: ^const Word8): Int +proc puts*(s: ^const Word8) -> Int extern -proc putchar*(c: Int): Int +proc putchar*(c: Int) -> Int extern -proc sprintf*(str: Pointer; format: ^const Word8; number: Word): Int +proc sprintf*(str: Pointer; format: ^const Word8; number: Word) -> Int extern -proc fprintf*(stream: Pointer; format: ^const Word8; number: Word): Int +proc fprintf*(stream: Pointer; format: ^const Word8; number: Word) -> Int extern -proc fdopen*(fildes: Int; mode: ^const Word8): Pointer +proc fdopen*(fildes: Int; mode: ^const Word8) -> Pointer extern end. diff --git a/source/cstdlib.elna b/source/cstdlib.elna index 0f78c8e..09b1ddf 100644 --- a/source/cstdlib.elna +++ b/source/cstdlib.elna @@ -2,22 +2,22 @@ v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. *) -proc malloc*(size: Word): Pointer +proc malloc*(size: Word) -> Pointer extern proc free*(ptr: Pointer) extern -proc calloc*(nmemb: Word; size: Word): Pointer +proc calloc*(nmemb: Word; size: Word) -> Pointer extern -proc realloc*(ptr: Pointer; size: Word): Pointer +proc realloc*(ptr: Pointer; size: Word) -> Pointer extern -proc atoi*(str: ^Word8): Int +proc atoi*(str: ^Word8) -> Int extern -proc exit*(code: Int): ! +proc exit*(code: Int) -> ! extern end. diff --git a/source/cstring.elna b/source/cstring.elna index 9290a5c..70c468c 100644 --- a/source/cstring.elna +++ b/source/cstring.elna @@ -2,28 +2,28 @@ v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. *) -proc memset*(ptr: Pointer; c: Int; n: Word): ^Word8 +proc memset*(ptr: Pointer; c: Int; n: Word) -> ^Word8 extern proc memcpy*(dst: Pointer; src: const Pointer; n: Word) extern -proc memcmp*(s1, s2: const Pointer; n: Word): Int +proc memcmp*(s1, s2: const Pointer; n: Word) -> Int extern -proc strcmp*(s1: ^const Word8; s2: ^const Word8): Int +proc strcmp*(s1: ^const Word8; s2: ^const Word8) -> Int extern -proc strncmp*(s1: ^const Word8; s2: ^const Word8; n: Word): Int +proc strncmp*(s1: ^const Word8; s2: ^const Word8; n: Word) -> Int extern -proc strncpy*(dst: ^Word8; src: ^const Word8; dsize: Word): ^Word8 +proc strncpy*(dst: ^Word8; src: ^const Word8; dsize: Word) -> ^Word8 extern -proc strcpy*(dst: ^Word8; src: ^const Word8): ^Word8 +proc strcpy*(dst: ^Word8; src: ^const Word8) -> ^Word8 extern -proc strlen*(ptr: ^const Word8): Word +proc strlen*(ptr: ^const Word8) -> Word extern end. diff --git a/source/lexer.elna b/source/lexer.elna index 83e89df..1cfe097 100644 --- a/source/lexer.elna +++ b/source/lexer.elna @@ -135,6 +135,7 @@ type _case, _do, _of, + arrow, eof ) (** @@ -313,7 +314,7 @@ begin end return -proc elna_lexer_get_transition(current_state: ElnaLexerState; character_class: ElnaLexerClass): ^ElnaLexerTransition +proc elna_lexer_get_transition(current_state: ElnaLexerState; character_class: ElnaLexerClass) -> ^ElnaLexerTransition (* Each state is 8 bytes long (2 words: action and next state). There are 23 character classes, so a transition row 8 * 23 = 184 bytes long. *) return @transition_table[cast(current_state: Word)][cast(character_class: Word)] @@ -523,7 +524,7 @@ begin end return -proc elna_lexer_token_create(kind: ElnaLexerKind; position: ^ElnaPosition): ^ElnaLexerToken +proc elna_lexer_token_create(kind: ElnaLexerKind; position: ^ElnaPosition) -> ^ElnaLexerToken var result: ^ElnaLexerToken begin @@ -532,7 +533,7 @@ begin result^.position := position^ return result -proc elna_lexer_classify_keyword(position_start, position_end: ^Word8; position: ^ElnaPosition): ^ElnaLexerToken +proc elna_lexer_classify_keyword(position_start, position_end: ^Word8; position: ^ElnaPosition) -> ^ElnaLexerToken var result: ^ElnaLexerToken result_length: Word @@ -587,7 +588,7 @@ begin end return result -proc elna_lexer_classify_delimited(start_position, end_position: ^Word8; position: ^ElnaPosition): ^ElnaLexerToken +proc elna_lexer_classify_delimited(start_position, end_position: ^Word8; position: ^ElnaPosition) -> ^ElnaLexerToken var delimiter: Word8 result: ^ElnaLexerToken @@ -604,7 +605,7 @@ begin result^.start := start_position[1 to cast(end_position - start_position: Word)] return result -proc elna_lexer_classify_integer(start_position, end_position: ^Word8; position: ^ElnaPosition): ^ElnaLexerToken +proc elna_lexer_classify_integer(start_position, end_position: ^Word8; position: ^ElnaPosition) -> ^ElnaLexerToken var result: ^ElnaLexerToken begin @@ -612,7 +613,7 @@ begin result^.start := start_position[1 to cast(end_position - start_position: Word)] return result -proc elna_lexer_classify_finalize(start_position: ^Word8; position: ^ElnaPosition): ^ElnaLexerToken +proc elna_lexer_classify_finalize(start_position: ^Word8; position: ^ElnaPosition) -> ^ElnaLexerToken var character: Word8 result: ^ElnaLexerToken @@ -634,7 +635,7 @@ begin end return result -proc elna_lexer_classify_single(start_position: ^Word8; position: ^ElnaPosition): ^ElnaLexerToken +proc elna_lexer_classify_single(start_position: ^Word8; position: ^ElnaPosition) -> ^ElnaLexerToken var character: Word8 result: ^ElnaLexerToken @@ -675,7 +676,7 @@ begin end return result -proc elna_lexer_classify_composite(start_position, one_before_last: ^Word8; position: ^ElnaPosition): ^ElnaLexerToken +proc elna_lexer_classify_composite(start_position, one_before_last: ^Word8; position: ^ElnaPosition) -> ^ElnaLexerToken var first_character: Word8 last_character: Word8 @@ -696,10 +697,14 @@ begin if last_character = '=' then result := elna_lexer_token_create(ElnaLexerKind.greater_equal, position) end + elsif first_character = '-' then + if last_character = '>' then + result := elna_lexer_token_create(ElnaLexerKind.arrow, position) + end end return result -proc elna_lexer_execute_action(cursor: ^ElnaLexerCursor; action_to_perform: ElnaLexerAction): ^ElnaLexerToken +proc elna_lexer_execute_action(cursor: ^ElnaLexerCursor; action_to_perform: ElnaLexerAction) -> ^ElnaLexerToken var token: ^ElnaLexerToken begin @@ -736,7 +741,7 @@ begin end return token -proc elna_lexer_execute_transition(cursor: ^ElnaLexerCursor): ^ElnaLexerToken +proc elna_lexer_execute_transition(cursor: ^ElnaLexerCursor) -> ^ElnaLexerToken var next_transition: ^ElnaLexerTransition current_character: Word8 @@ -766,7 +771,7 @@ return * Reads the next token and writes its type into the address in the kind parameter. * Resets the lexer state for reading the next token. *) -proc elna_lexer_peek(cursor: ^ElnaLexerCursor): ^ElnaLexerToken +proc elna_lexer_peek(cursor: ^ElnaLexerCursor) -> ^ElnaLexerToken var token: ^ElnaLexerToken begin @@ -783,7 +788,7 @@ return cursor^.token (** * Reads the token and advance the lexer. *) -proc elna_lexer_read(cursor: ^ElnaLexerCursor): ^ElnaLexerToken +proc elna_lexer_read(cursor: ^ElnaLexerCursor) -> ^ElnaLexerToken var token: ^ElnaLexerToken begin diff --git a/source/main.elna b/source/main.elna index bdcaf34..23fdc97 100644 --- a/source/main.elna +++ b/source/main.elna @@ -20,9 +20,9 @@ type position: ElnaLocation; input: Pointer; - empty: proc(stream: Pointer): Bool; + empty: proc(stream: Pointer) -> Bool; advance: proc(stream: Pointer); - head: proc(stream: Pointer): Word8 + head: proc(stream: Pointer) -> Word8 end Tokenizer* = record length: Word; @@ -32,10 +32,10 @@ type (* Standard procedures. *) -proc reallocarray(ptr: Pointer; n: Word; size: Word): Pointer +proc reallocarray(ptr: Pointer; n: Word; size: Word) -> Pointer return realloc(ptr, n * size) -proc string_dup(origin: []const Word8): []const Word8 +proc string_dup(origin: []const Word8) -> []const Word8 var copy: ^Word8 begin @@ -43,7 +43,7 @@ begin strncpy(copy, origin.ptr, origin.length) return copy[1 to origin.length] -proc string_buffer_new(): StringBuffer +proc string_buffer_new() -> StringBuffer var result: StringBuffer begin @@ -67,7 +67,7 @@ begin buffer^.size := buffer^.size - count return -proc string_buffer_clear(buffer: ^StringBuffer): []const Word8 +proc string_buffer_clear(buffer: ^StringBuffer) -> []const Word8 var result: []const Word8 begin @@ -79,7 +79,7 @@ return result Source code stream procedures. *) -proc read_source(filename: ^Word8): ^SourceFile +proc read_source(filename: ^Word8) -> ^SourceFile var result: ^SourceFile file_handle: ^FILE @@ -94,7 +94,7 @@ begin end return result -proc source_file_empty(source_input: Pointer): Bool +proc source_file_empty(source_input: Pointer) -> Bool var source_file: ^SourceFile begin @@ -106,7 +106,7 @@ begin end return source_file^.size = 0u -proc source_file_head(source_input: Pointer): Word8 +proc source_file_head(source_input: Pointer) -> Word8 var source_file: ^SourceFile begin @@ -122,10 +122,10 @@ begin source_file^.index := source_file^.index + 1u return -proc source_code_empty(source_code: ^SourceCode): Bool +proc source_code_empty(source_code: ^SourceCode) -> Bool return source_code^.empty(source_code^.input) -proc source_code_head(source_code: SourceCode): Word8 +proc source_code_head(source_code: SourceCode) -> Word8 return source_code.head(source_code.input) proc source_code_advance(source_code: ^SourceCode) @@ -140,14 +140,14 @@ begin source_code^.position.column := 0u return -proc source_code_expect(source_code: ^SourceCode; expected: Word8): Bool +proc source_code_expect(source_code: ^SourceCode; expected: Word8) -> Bool return ~source_code_empty(source_code) & source_code_head(source_code^) = expected (* Token procedures. *) -proc lexer_escape(escape: Word8; result: ^Word8): Bool +proc lexer_escape(escape: Word8; result: ^Word8) -> Bool var successful: Bool begin @@ -200,7 +200,7 @@ begin return (* Checker whether the character is allowed in an identificator. *) -proc lexer_is_ident(char: Word8): Bool +proc lexer_is_ident(char: Word8) -> Bool return isalnum(cast(char: Int)) <> 0 or char = '_' proc lexer_identifier(source_code: ^SourceCode; token_content: ^StringBuffer) @@ -213,7 +213,7 @@ begin end return -proc lexer_comment(source_code: ^SourceCode; token_content: ^StringBuffer): Bool +proc lexer_comment(source_code: ^SourceCode; token_content: ^StringBuffer) -> Bool var trailing: Word begin @@ -234,7 +234,7 @@ begin end return trailing = 2u -proc lexer_character(source_code: ^SourceCode; token_content: ^Word8): Bool +proc lexer_character(source_code: ^SourceCode; token_content: ^Word8) -> Bool var successful: Bool begin @@ -255,7 +255,7 @@ begin end return successful -proc lexer_string(source_code: ^SourceCode; token_content: ^StringBuffer): Bool +proc lexer_string(source_code: ^SourceCode; token_content: ^StringBuffer) -> Bool var token_end, constructed_string: ^Word8 token_length: Word @@ -289,7 +289,7 @@ begin return (* Categorize an identifier. *) -proc lexer_categorize(token_content: []const Word8): ^ElnaLexerToken +proc lexer_categorize(token_content: []const Word8) -> ^ElnaLexerToken var current_token: ^ElnaLexerToken begin @@ -385,7 +385,7 @@ begin return (* Read the next token from the input. *) -proc lexer_next(source_code: SourceCode; token_buffer: ^StringBuffer): ^ElnaLexerToken +proc lexer_next(source_code: SourceCode; token_buffer: ^StringBuffer) -> ^ElnaLexerToken var current_token: ^ElnaLexerToken := nil first_char: Word8 @@ -523,7 +523,15 @@ begin elsif first_char = '-' then source_code_advance(@source_code); current_token := malloc(#size(ElnaLexerToken)); - current_token^.kind := ElnaLexerKind.minus + + if source_code_empty(@source_code) then + current_token^.kind := ElnaLexerKind.minus + elsif source_code_head(source_code) = '>' then + current_token^.kind := ElnaLexerKind.arrow; + source_code_advance(@source_code) + else + current_token^.kind := ElnaLexerKind.minus + end elsif first_char = '*' then current_token := malloc(#size(ElnaLexerToken)); current_token^.kind := ElnaLexerKind.multiplication; @@ -576,7 +584,7 @@ begin return current_token (* Split the source text into tokens. *) -proc lexer_text(source_code: SourceCode): Tokenizer +proc lexer_text(source_code: SourceCode) -> Tokenizer var current_token: ^ElnaLexerToken token_buffer: StringBuffer @@ -739,6 +747,8 @@ begin write_s("DEFER") | ElnaLexerKind.exclamation: write_c('!') + | ElnaLexerKind.arrow: + write_s("->") | ElnaLexerKind._import: write_s("IMPORT") else @@ -757,7 +767,7 @@ return Compilation entry. *) -proc compile_in_stages(command_line: ^CommandLine; source_code: SourceCode): Int +proc compile_in_stages(command_line: ^CommandLine; source_code: SourceCode) -> Int var return_code: Int := 0 lexer: Tokenizer @@ -770,7 +780,7 @@ begin end return return_code -proc process(argc: Int; argv: ^^Word8): Int +proc process(argc: Int; argv: ^^Word8) -> Int var tokens: ^ElnaLexerToken tokens_size: Word diff --git a/testsuite/compilable/opaque_type.elna b/testsuite/compilable/opaque_type.elna index b46cf68..bdbf0d6 100644 --- a/testsuite/compilable/opaque_type.elna +++ b/testsuite/compilable/opaque_type.elna @@ -6,7 +6,7 @@ var handle: ^Handle := nil alias: ^Alias -proc take(h: ^Handle): ^Handle +proc take(h: ^Handle) -> ^Handle return h begin diff --git a/testsuite/compilable/pointer_subtraction.elna b/testsuite/compilable/pointer_subtraction.elna index c268113..8dd1ff6 100644 --- a/testsuite/compilable/pointer_subtraction.elna +++ b/testsuite/compilable/pointer_subtraction.elna @@ -1,4 +1,4 @@ -proc test(a, b: ^Char): Int +proc test(a, b: ^Char) -> Int return a - b end. diff --git a/testsuite/compilable/procedure_forward_reference.elna b/testsuite/compilable/procedure_forward_reference.elna index bbffc73..cdf3008 100644 --- a/testsuite/compilable/procedure_forward_reference.elna +++ b/testsuite/compilable/procedure_forward_reference.elna @@ -1,7 +1,7 @@ -proc first(): Int +proc first() -> Int return second() + 1 -proc second(): Int +proc second() -> Int return 41 end. diff --git a/testsuite/fail_compilation/access_record_type_field.elna b/testsuite/fail_compilation/access_record_type_field.elna index 4e8bc6a..4378404 100644 --- a/testsuite/fail_compilation/access_record_type_field.elna +++ b/testsuite/fail_compilation/access_record_type_field.elna @@ -3,7 +3,7 @@ type field1, field2: Int end -proc f(): Int +proc f() -> Int return R.field1 (* @Error Cannot access field 'field1' on type 'R' *) end. diff --git a/testsuite/fail_compilation/enumeration_member_missing.elna b/testsuite/fail_compilation/enumeration_member_missing.elna index 84a13d1..6f82131 100644 --- a/testsuite/fail_compilation/enumeration_member_missing.elna +++ b/testsuite/fail_compilation/enumeration_member_missing.elna @@ -1,7 +1,7 @@ type Enumeration = (one, two, three) -proc f(): Enumeration +proc f() -> Enumeration return Enumeration.four (* @Error Enumeration 'Enumeration' does not have a member named 'four' *) end. diff --git a/testsuite/fail_compilation/non_constant_array_dimension.elna.s b/testsuite/fail_compilation/non_constant_array_dimension.elna.s deleted file mode 100644 index 8dc704d..0000000 --- a/testsuite/fail_compilation/non_constant_array_dimension.elna.s +++ /dev/null @@ -1 +0,0 @@ - .file "non_constant_array_dimension.elna" diff --git a/testsuite/fail_compilation/procedure-cycle.elna b/testsuite/fail_compilation/procedure-cycle.elna index aaed14c..796cccf 100644 --- a/testsuite/fail_compilation/procedure-cycle.elna +++ b/testsuite/fail_compilation/procedure-cycle.elna @@ -1,3 +1,3 @@ type - A = proc(): A (* @Error Type declaration forms a cycle: A -> A *) + A = proc() -> A (* @Error Type declaration forms a cycle: A -> A *) end. diff --git a/testsuite/fail_compilation/record-base-cycle.elna.s b/testsuite/fail_compilation/record-base-cycle.elna.s deleted file mode 100644 index 64f8722..0000000 --- a/testsuite/fail_compilation/record-base-cycle.elna.s +++ /dev/null @@ -1 +0,0 @@ - .file "record-base-cycle.elna" diff --git a/testsuite/fail_compilation/unary_minus_on_record.elna b/testsuite/fail_compilation/unary_minus_on_record.elna index cfd76a2..d86995b 100644 --- a/testsuite/fail_compilation/unary_minus_on_record.elna +++ b/testsuite/fail_compilation/unary_minus_on_record.elna @@ -3,7 +3,7 @@ type x: Int end -proc f(r: R): Int +proc f(r: R) -> Int return -r (* @Error Type 'R' cannot be used with unary '-' *) end. diff --git a/testsuite/fail_compilation/unary_negation_on_record.elna b/testsuite/fail_compilation/unary_negation_on_record.elna index 370f04d..d08d2e3 100644 --- a/testsuite/fail_compilation/unary_negation_on_record.elna +++ b/testsuite/fail_compilation/unary_negation_on_record.elna @@ -3,7 +3,7 @@ type x: Int end -proc f(r: R): Int +proc f(r: R) -> Int return ~r (* @Error Type 'R' cannot be used with unary '~' *) end. diff --git a/testsuite/fail_compilation/unary_plus_on_record.elna b/testsuite/fail_compilation/unary_plus_on_record.elna index 7289873..e1f6f4c 100644 --- a/testsuite/fail_compilation/unary_plus_on_record.elna +++ b/testsuite/fail_compilation/unary_plus_on_record.elna @@ -3,7 +3,7 @@ type x: Int end -proc f(r: R): Int +proc f(r: R) -> Int return +r (* @Error Type 'R' cannot be used with unary '\+' *) end. diff --git a/testsuite/runnable/aggregate_argument.elna b/testsuite/runnable/aggregate_argument.elna index 4a36c74..875265e 100644 --- a/testsuite/runnable/aggregate_argument.elna +++ b/testsuite/runnable/aggregate_argument.elna @@ -4,7 +4,7 @@ type b: Int end -proc f(r: R): Bool +proc f(r: R) -> Bool return r.a = 1 & r.b = 2 begin diff --git a/testsuite/runnable/aggregate_equality.elna b/testsuite/runnable/aggregate_equality.elna index 592d411..bfe2174 100644 --- a/testsuite/runnable/aggregate_equality.elna +++ b/testsuite/runnable/aggregate_equality.elna @@ -4,7 +4,7 @@ type b: Int end -proc f(): Bool +proc f() -> Bool return R{a: 1, b: 2} = R{a: 1, b: 2} begin diff --git a/testsuite/runnable/define_multiple_local_variables.elna b/testsuite/runnable/define_multiple_local_variables.elna index 51b99ac..8e44da4 100644 --- a/testsuite/runnable/define_multiple_local_variables.elna +++ b/testsuite/runnable/define_multiple_local_variables.elna @@ -1,4 +1,4 @@ -proc f(): Bool +proc f() -> Bool var a, b: Int := 5 return a = 5 & b = 5 diff --git a/testsuite/runnable/multi_module/helper.elna b/testsuite/runnable/multi_module/helper.elna index 9148ba6..5fd68af 100644 --- a/testsuite/runnable/multi_module/helper.elna +++ b/testsuite/runnable/multi_module/helper.elna @@ -1,4 +1,4 @@ -proc multiply*(x, y: Int): Int +proc multiply*(x, y: Int) -> Int return x * y end. diff --git a/testsuite/runnable/procedure_cast.elna b/testsuite/runnable/procedure_cast.elna index 27977e1..ee97a6b 100644 --- a/testsuite/runnable/procedure_cast.elna +++ b/testsuite/runnable/procedure_cast.elna @@ -1,9 +1,9 @@ -var cb: proc(x: ^Char): Int +var cb: proc(x: ^Char) -> Int -proc probe_int(x: ^Int): Int +proc probe_int(x: ^Int) -> Int return 42 begin - cb := cast(probe_int: proc(x: ^Char): Int); + cb := cast(probe_int: proc(x: ^Char) -> Int); assert(cb(nil) = 42) end. diff --git a/testsuite/runnable/recursive_record.elna b/testsuite/runnable/recursive_record.elna index 6f6b4fa..237eece 100644 --- a/testsuite/runnable/recursive_record.elna +++ b/testsuite/runnable/recursive_record.elna @@ -9,13 +9,13 @@ var second: ^Node third: ^Node -proc malloc(size: Word): Pointer +proc malloc(size: Word) -> Pointer extern proc free(ptr: Pointer) extern -proc sum(node: ^Node): Int +proc sum(node: ^Node) -> Int var result: Int begin @@ -25,7 +25,7 @@ begin else result := node^.value + sum(node^.next) end; - return result +return result begin first := malloc(#size(Node)); diff --git a/testsuite/runnable/return_aggregate.elna b/testsuite/runnable/return_aggregate.elna index 90c1677..fbc1a08 100644 --- a/testsuite/runnable/return_aggregate.elna +++ b/testsuite/runnable/return_aggregate.elna @@ -4,7 +4,7 @@ type b: Int end -proc f(): R +proc f() -> R return R{ a: 1, b: 2 } begin diff --git a/testsuite/runnable/two_fields_same_type.elna b/testsuite/runnable/two_fields_same_type.elna index 649dd25..71dcbee 100644 --- a/testsuite/runnable/two_fields_same_type.elna +++ b/testsuite/runnable/two_fields_same_type.elna @@ -3,7 +3,7 @@ type x, y: Int end -proc f(): Int +proc f() -> Int var r: R := R{x: 3, y: 2} return r.x + r.y diff --git a/testsuite/runnable/two_parameters_same_type.elna b/testsuite/runnable/two_parameters_same_type.elna index bd9b271..105a40c 100644 --- a/testsuite/runnable/two_parameters_same_type.elna +++ b/testsuite/runnable/two_parameters_same_type.elna @@ -1,4 +1,4 @@ -proc f(x, y: Int): Int +proc f(x, y: Int) -> Int return x + y begin diff --git a/testsuite/runnable/unary_plus.elna b/testsuite/runnable/unary_plus.elna index 2bc69f3..bfd59d6 100644 --- a/testsuite/runnable/unary_plus.elna +++ b/testsuite/runnable/unary_plus.elna @@ -1,4 +1,4 @@ -proc f(x: Int): Int +proc f(x: Int) -> Int return +x begin |
