Parse procedure parameters

This commit is contained in:
2025-05-08 23:36:29 +02:00
parent 3f11d63a0f
commit 92f50fff5f
2 changed files with 150 additions and 17 deletions

View File

@@ -989,6 +989,90 @@ _compile_variable:
addi sp, sp, 48
ret
.type _compile_type_expression, @function
_compile_type_expression:
# Prologue.
addi sp, sp, -32
sw ra, 28(sp)
sw s0, 24(sp)
addi s0, sp, 32
.Lcompile_type_expression_type:
mv a0, s1
addi a1, sp, 12
call _tokenize_next
mv s1, a0
lw t0, 12(sp)
# Skip the pointer designator and handle the rest of the type.
li t1, TOKEN_HAT
beq t0, t1, .Lcompile_type_expression_type
/* DEBUG */
lw a0, 20(sp)
lw a1, 16(sp)
call _write_error
# Epilogue.
lw ra, 28(sp)
lw s0, 24(sp)
addi sp, sp, 32
ret
.type _compile_parameters, @function
_compile_parameters:
# Prologue.
addi sp, sp, -32
sw ra, 28(sp)
sw s0, 24(sp)
addi s0, sp, 32
mv a0, s1
addi a1, sp, 12
call _tokenize_next
mv s1, a0 # Skip the opening paren.
mv a0, s1
addi a1, sp, 12
call _tokenize_next
lw t0, 12(sp)
li t1, TOKEN_RIGHT_PAREN
beq t0, t1, .Lcompile_parameters_end
# When this is not the right paren, it is an identifier.
mv s1, a0
.Lcompile_parameters_parameter:
mv a0, s1
addi a1, sp, 0
call _tokenize_next
mv s1, a0 # Skip the ":" in front of the type.
call _compile_type_expression
# Read the comma between the parameters or a closing paren.
mv a0, s1
addi a1, sp, 0
call _tokenize_next
lw t0, 0(sp)
li t1, TOKEN_COMMA
bne t0, t1, .Lcompile_parameters_end
# If it is a comma, read the name of the next parameter.
addi a1, sp, 12
call _tokenize_next
mv s1, a0
j .Lcompile_parameters_parameter
.Lcompile_parameters_end:
mv s1, a0 # Skip the closing paren.
# Epilogue.
lw ra, 28(sp)
lw s0, 24(sp)
addi sp, sp, 32
ret
.type _compile_procedure, @function
_compile_procedure:
# Prologue.
@@ -1008,6 +1092,7 @@ _compile_procedure:
lw a1, 20(sp)
call _write_procedure_head
call _compile_parameters
# Skip all declarations until we find the "begin" keyword, denoting the
# beginning of the procedure body.
.Lcompile_procedure_begin:
@@ -1033,22 +1118,6 @@ _compile_procedure:
call _compile_statements
mv s1, a0 # Skip end.
/* DEBUG
sw a0, 8(sp)
lw a1, 12(sp)
li a2, TOKEN_END
sub a1, a1, a2
seqz a1, a1
seqz a0, a0
addi a0, a0, '0'
addi a1, a1, '0'
sb a0, 4(sp)
sb a1, 5(sp)
addi a0, sp, 4
li a1, 2
call _write_error
lw a0, 8(sp) */
# Generate the procedure epilogue with a predefined stack size.
la a0, epilogue
li a1, EPILOGUE_SIZE