Replace _read_token with the lexer
This commit is contained in:
242
boot/stage1.s
242
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
|
||||
|
Reference in New Issue
Block a user