diff options
| author | Eugen Wissner <belka@caraus.de> | 2025-05-06 23:58:46 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2025-05-06 23:58:46 +0200 |
| commit | 40701008f04f2242ab69bfb4bc4f376e6b75429a (patch) | |
| tree | 4304c2a75004e35e9f198500a484cbfdedab4c5c /boot/stage1.s | |
| parent | 3bd86e6e1cf9634af0f45ed526181351328b350d (diff) | |
| download | elna-40701008f04f2242ab69bfb4bc4f376e6b75429a.tar.gz | |
Replace _read_token with the lexer
Diffstat (limited to 'boot/stage1.s')
| -rw-r--r-- | boot/stage1.s | 242 |
1 files changed, 72 insertions, 170 deletions
diff --git a/boot/stage1.s b/boot/stage1.s index b32815d..525da11 100644 --- a/boot/stage1.s +++ b/boot/stage1.s @@ -409,11 +409,15 @@ _build_expression: mv a0, s1 addi a1, sp, 24 call _tokenize_next + sw a0, 20(sp) - call _skip_spaces - call _read_token - sw s1, 32(sp) - sw a0, 28(sp) + /* DEBUG + lw a0, 32(sp) + lw a1, 28(sp) + call _write_error + lw a0, 28(sp) + li a1, 8 + call _write_error */ lw a0, 24(sp) @@ -423,14 +427,15 @@ _build_expression: li t0, TOKEN_AT beq a0, t0, .Lbuild_expression_address - lbu a0, (s1) - call _is_digit - bnez a0, .Lbuild_expression_literal + li t0, TOKEN_INTEGER + beq a0, t0, .Lbuild_expression_literal - lbu a0, (s1) + lw a0, 32(sp) + lbu a0, (a0) li t0, '_' beq a0, t0, .Lbuild_expression_call + lw s1, 32(sp) lw a0, 28(sp) lw a1, 36(sp) call _compile_identifier_expression @@ -438,7 +443,7 @@ _build_expression: j .Lbuild_expression_advance .Lbuild_expression_negate: - addi s1, s1, 1 # Skip the -. + lw s1, 20(sp) # Skip the -. mv a0, zero call _build_expression @@ -446,7 +451,7 @@ _build_expression: li a1, ASM_NEG_A0_SIZE call _write_out - j .Lbuild_expression_advance + j .Lbuild_expression_end .Lbuild_expression_address: lw t1, 36(sp) @@ -463,10 +468,10 @@ _build_expression: li a1, 13 call _write_out - addi s1, s1, 1 # Skip @. - call _read_token - sw s1, 32(sp) - sw a0, 28(sp) + lw a0, 20(sp) # Skip @. + addi a1, sp, 24 + call _tokenize_next + mv s1, a0 lw a0, 32(sp) lw a1, 28(sp) @@ -477,13 +482,16 @@ _build_expression: li a0, '\n' call _put_char - j .Lbuild_expression_advance + j .Lbuild_expression_end .Lbuild_expression_call: + lw a0, 20(sp) + addi a1, sp, 8 + call _tokenize_next + mv s1, a0 + lw a0, 32(sp) lw a1, 28(sp) - add s1, s1, a1 - addi s1, s1, 1 call _compile_call j .Lbuild_expression_end @@ -509,8 +517,7 @@ _build_expression: j .Lbuild_expression_advance .Lbuild_expression_advance: - lw a0, 28(sp) - add s1, s1, a0 + lw s1, 20(sp) .Lbuild_expression_end: # Epilogue. @@ -747,102 +754,6 @@ _compile_call: addi sp, sp, 32 ret -# Reads a token and returns its length in a0. -# _read_token doesn't change s1, it finds the length of the token s1 is pointing to. -.type _read_token, @function -_read_token: - # Prologue. - addi sp, sp, -16 - sw ra, 12(sp) - sw s0, 8(sp) - addi s0, sp, 16 - - lbu t0, (s1) # t0 = Current character. - sw zero, 4(sp) - - li t1, '.' - beq t0, t1, .Ltoken_character_single - - li t1, ',' - beq t0, t1, .Ltoken_character_single - - li t1, ':' - beq t0, t1, .Ltoken_character_colon - - li t1, ';' - beq t0, t1, .Ltoken_character_single - - li t1, '(' - beq t0, t1, .Ltoken_character_single - - li t1, ')' - beq t0, t1, .Ltoken_character_single - - li t1, '[' - beq t0, t1, .Ltoken_character_single - - li t1, ']' - beq t0, t1, .Ltoken_character_single - - li t1, '^' - beq t0, t1, .Ltoken_character_single - - li t1, '&' - beq t0, t1, .Ltoken_character_single - - li t1, '=' - beq t0, t1, .Ltoken_character_single - - li t1, '+' - beq t0, t1, .Ltoken_character_single - - li t1, '-' - beq t0, t1, .Ltoken_character_single - - li t1, '*' - beq t0, t1, .Ltoken_character_single - - li t1, '@' - beq t0, t1, .Ltoken_character_single -# Expect an identifier or a number. -.Ltoken_character_loop_do: - lw t6, 4(sp) - add t1, s1, t6 - lbu a0, (t1) # a0 = Current character. - - call _is_alnum - - beqz a0, .Ltoken_character_end - lw t6, 4(sp) - addi t6, t6, 1 - sw t6, 4(sp) - j .Ltoken_character_loop_do - -.Ltoken_character_single: - lw t6, 4(sp) - addi t6, t6, 1 - sw t6, 4(sp) - j .Ltoken_character_end - -.Ltoken_character_colon: - lbu t0, 1(s1) # t0 = The character after the colon. - lw t6, 4(sp) - addi t6, t6, 1 - sw t6, 4(sp) - - li t1, '=' - beq t0, t1, .Ltoken_character_single - j .Ltoken_character_end - -.Ltoken_character_end: - lw a0, 4(sp) - - # Epilogue. - lw ra, 12(sp) - lw s0, 8(sp) - addi sp, sp, 16 - ret - # Skips the spaces till the next non space character. .type _skip_spaces, @function _skip_spaces: @@ -911,15 +822,14 @@ _skip_comment: addi sp, sp, 16 ret -# Parameters: -# a0 - Line length. +# Walks through the procedure definitions. .type _compile_procedure_section, @function _compile_procedure_section: # Prologue. - addi sp, sp, -24 - sw ra, 20(sp) - sw s0, 16(sp) - addi s0, sp, 24 + addi sp, sp, -32 + sw ra, 28(sp) + sw s0, 24(sp) + addi s0, sp, 32 .Lcompile_procedure_section_loop: call _skip_spaces @@ -938,9 +848,9 @@ _compile_procedure_section: .Lcompile_procedure_section_end: # Epilogue. - lw ra, 20(sp) - lw s0, 16(sp) - addi sp, sp, 24 + lw ra, 28(sp) + lw s0, 24(sp) + addi sp, sp, 32 ret .type _compile_module_declaration, @function @@ -970,10 +880,10 @@ _compile_module_declaration: .type _compile_constant_section, @function _compile_constant_section: # Prologue. - addi sp, sp, -24 - sw ra, 20(sp) - sw s0, 16(sp) - addi s0, sp, 24 + addi sp, sp, -32 + sw ra, 28(sp) + sw s0, 24(sp) + addi s0, sp, 32 mv a0, s1 addi a1, sp, 4 @@ -988,19 +898,24 @@ _compile_constant_section: call _write_out .Lcompile_constant_section_item: - call _skip_spaces - lbu a0, (s1) - call _is_upper - beqz a0, .Lcompile_constant_section_end + mv a0, s1 + addi a1, sp, 12 + call _tokenize_next + + lw t0, 12(sp) + li t1, TOKEN_IDENTIFIER + + bne t0, t1, .Lcompile_constant_section_end + lw s1, 20(sp) call _compile_constant j .Lcompile_constant_section_item .Lcompile_constant_section_end: # Epilogue. - lw ra, 20(sp) - lw s0, 16(sp) - addi sp, sp, 24 + lw ra, 28(sp) + lw s0, 24(sp) + addi sp, sp, 32 ret .type _compile_constant, @function @@ -1042,7 +957,6 @@ _compile_constant: li a0, '\n' call _put_char - call _skip_spaces # Epilogue. lw ra, 28(sp) @@ -1053,10 +967,10 @@ _compile_constant: .type _compile_variable_section, @function _compile_variable_section: # Prologue. - addi sp, sp, -24 - sw ra, 20(sp) - sw s0, 16(sp) - addi s0, sp, 24 + addi sp, sp, -32 + sw ra, 28(sp) + sw s0, 24(sp) + addi s0, sp, 32 mv a0, s1 addi a1, sp, 4 @@ -1071,19 +985,23 @@ _compile_variable_section: call _write_out .Lcompile_variable_section_item: - call _skip_spaces - lbu a0, (s1) - call _is_lower - beqz a0, .Lcompile_variable_section_end + mv a0, s1 + addi a1, sp, 12 + call _tokenize_next + lw t0, 12(sp) + li t1, TOKEN_IDENTIFIER + + bne t0, t1, .Lcompile_variable_section_end + lw s1, 20(sp) # Advance to the beginning of the variable name. call _compile_variable j .Lcompile_variable_section_item .Lcompile_variable_section_end: # Epilogue. - lw ra, 20(sp) - lw s0, 16(sp) - addi sp, sp, 24 + lw ra, 28(sp) + lw s0, 24(sp) + addi sp, sp, 32 ret # Compile a global variable. @@ -1111,18 +1029,6 @@ _compile_variable: call _tokenize_next # Skip the type. mv s1, a0 - /* DEBUG - lw a0, 24(sp) - add a0, a0, '0' - sw a0, 24(sp) - addi a0, sp, 24 - li a1, 1 - call _write_error - lw a0, 28(sp) - li a1, 8 - call _write_error - */ - # .type identifier, @object la a0, asm_type li a1, ASM_TYPE_SIZE @@ -1478,10 +1384,6 @@ _compile_statement: j .Lcompile_statement_end .Lcompile_statement_end: - sw a0, 12(sp) - call _skip_comment - lw a0, 12(sp) - # Epilogue. lw ra, 28(sp) lw s0, 24(sp) @@ -1492,19 +1394,19 @@ _compile_statement: .type _compile_text_section, @function _compile_text_section: # Prologue. - addi sp, sp, -8 - sw ra, 4(sp) - sw s0, 0(sp) - addi s0, sp, 8 + addi sp, sp, -16 + sw ra, 12(sp) + sw s0, 8(sp) + addi s0, sp, 16 la a0, section_text li a1, SECTION_TEXT_SIZE call _write_out # Epilogue. - lw ra, 4(sp) - lw s0, 0(sp) - addi sp, sp, 8 + lw ra, 12(sp) + lw s0, 8(sp) + addi sp, sp, 16 ret .type _compile_entry_point, @function |
