Make begin optional in procedures with only return

This commit is contained in:
2025-09-25 10:38:19 +02:00
parent 0cc41f2d83
commit 8ccb635302
2 changed files with 254 additions and 364 deletions

View File

@@ -6,6 +6,7 @@
(* - Multiline comments. *)
(* - elsif conditions. *)
(* - Optional "begin" if the procedure body is a single return statement. *)
const
symbol_builtin_name_int := "Int";
@@ -71,7 +72,7 @@ begin
if _load_byte(string) <> '"' then
counter := counter + 1;
goto .string_length_loop;
goto .string_length_loop
end;
return counter
@@ -100,9 +101,9 @@ begin
contents := contents + 1;
if current_byte <> '\\' then
compiler_strings_length := compiler_strings_length + 1;
compiler_strings_length := compiler_strings_length + 1
end;
goto .add_string_loop;
goto .add_string_loop
end;
return result
@@ -145,10 +146,10 @@ begin
local_buffer := @result + 11;
if number >= 0 then
is_negative := 0;
is_negative := 0
else
number = -number;
is_negative := 1;
is_negative := 1
end;
.print_i_digit10;
@@ -159,11 +160,11 @@ begin
local_buffer := local_buffer + -1;
if number <> 0 then
goto .print_i_digit10;
goto .print_i_digit10
end;
if is_negative = 1 then
_store_byte('-', local_buffer);
local_buffer := local_buffer + -1;
local_buffer := local_buffer + -1
end;
result := @result + 11;
result := result + -local_buffer;
@@ -210,7 +211,7 @@ begin
_write_c(next_byte);
(* Advance the input string by one byte. *)
_write_z(string + 1);
_write_z(string + 1)
end;
end;
@@ -314,8 +315,8 @@ begin
count := count + -1;
if result = 0 then
goto .memcmp_loop;
end;
goto .memcmp_loop
end
end;
return result
@@ -341,7 +342,7 @@ begin
destination := destination + 1;
source := source + 1;
count := count + -1;
goto .memcpy_loop;
goto .memcpy_loop
end;
return destination
@@ -383,7 +384,7 @@ begin
character := _load_byte(source_code_position);
if character = '\\' then
_write_c('\\');
source_code_position := source_code_position + 1;
source_code_position := source_code_position + 1
end;
_write_s(source_code_position, 1);
_write_s("'\n", 2);
@@ -981,9 +982,14 @@ end;
proc _skip_spaces();
var
current_byte: Word;
lhs: Word;
rhs: Word;
begin
current_byte := _load_byte(source_code_position);
if current_byte = '\t' then
lhs := current_byte = '\t';
rhs := current_byte = ' ';
if lhs or rhs then
source_code_position := source_code_position + 1;
_skip_spaces();
end;
@@ -1194,9 +1200,14 @@ begin
_read_procedure_temporaries();
(* Skip semicolon, "begin" and newline. *)
source_code_position := source_code_position + 6;
_compile_procedure_body();
_lexer_read_token(@token_kind);
if token_kind = _lexer_token_kind_begin() then
_lexer_skip_token();
_compile_procedure_body();
end;
if token_kind = _lexer_token_kind_return() then
_compile_return_statement();
end;
(* Write the epilogue. *)
_write_z("\tlw ra, 124(sp)\n\tlw s0, 120(sp)\n\taddi sp, sp, 128\n\tret\n\0");