Broke special case from general case to avoid hard to trace bugs
This commit is contained in:
parent
530e44869f
commit
f1c43430c5
146
stage2/cc.s
146
stage2/cc.s
|
@ -171,32 +171,56 @@
|
||||||
RET R15
|
RET R15
|
||||||
|
|
||||||
|
|
||||||
;; in_set function
|
;; in_set2 function
|
||||||
;; Recieves a Char in R0, FILE* in R1, char* in R2 and index in R13
|
;; Recieves a Char in R0, FILE* in R1, char* in R2 and index in R13
|
||||||
;; Return result in R2
|
;; Return result in R2
|
||||||
:in_set
|
:in_set2
|
||||||
PUSHR R3 R15 ; Protect R3 from changes
|
PUSHR R3 R15 ; Protect R3 from changes
|
||||||
:in_set_reset
|
:in_set2_reset
|
||||||
LOADU8 R3 R2 0 ; Get char from list
|
LOADU8 R3 R2 0 ; Get char from list
|
||||||
CMPJUMPI.E R0 R3 @in_set_done ; We found a match
|
CMPJUMPI.E R0 R3 @in_set2_done ; We found a match
|
||||||
ADDUI R2 R2 1 ; Increment to next char
|
ADDUI R2 R2 1 ; Increment to next char
|
||||||
JUMP.NZ R3 @in_set_reset ; Iterate if not NULL
|
JUMP.NZ R3 @in_set2_reset ; Iterate if not NULL
|
||||||
|
|
||||||
;; Looks like not found
|
;; Looks like not found
|
||||||
FALSE R2 ; Return FALSE
|
FALSE R2 ; Return FALSE
|
||||||
|
|
||||||
:in_set_done
|
:in_set2_done
|
||||||
CMPSKIPI.E R2 0 ; Provided not FALSE
|
CMPSKIPI.E R2 0 ; Provided not FALSE
|
||||||
TRUE R2 ; The result is true
|
TRUE R2 ; The result is true
|
||||||
POPR R3 R15 ; Restore R3
|
POPR R3 R15 ; Restore R3
|
||||||
RET R15
|
RET R15
|
||||||
|
|
||||||
|
|
||||||
|
;; in_set function
|
||||||
|
;; Recieves a Char in R0, char* in R1
|
||||||
|
;; Return result in R0
|
||||||
|
:in_set
|
||||||
|
PUSHR R2 R15 ; Protect R3 from changes
|
||||||
|
:in_set_reset
|
||||||
|
LOADU8 R2 R1 0 ; Get char from list
|
||||||
|
CMPJUMPI.E R0 R2 @in_set_done ; We found a match
|
||||||
|
ADDUI R1 R1 1 ; Increment to next char
|
||||||
|
JUMP.NZ R2 @in_set_reset ; Iterate if not NULL
|
||||||
|
|
||||||
|
;; Looks like not found
|
||||||
|
FALSE R1 ; Return FALSE
|
||||||
|
|
||||||
|
:in_set_done
|
||||||
|
CMPSKIPI.E R1 0 ; Provided not FALSE
|
||||||
|
TRUE R2 ; The result is true
|
||||||
|
MOVE R0 R2 ; Put result in correct place
|
||||||
|
POPR R2 R15 ; Restore R3
|
||||||
|
RET R15
|
||||||
|
|
||||||
|
|
||||||
|
;; Common in_set strings of interest
|
||||||
:keyword_chars
|
:keyword_chars
|
||||||
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
|
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
|
||||||
|
|
||||||
:symbol_chars
|
:symbol_chars
|
||||||
"<=>|&!-"
|
"<=>|&!-"
|
||||||
|
:digit_chars
|
||||||
|
"0123456789"
|
||||||
|
|
||||||
;; preserve_keyword function
|
;; preserve_keyword function
|
||||||
;; Recieves a Char in R0, FILE* in R1 and index in R13
|
;; Recieves a Char in R0, FILE* in R1 and index in R13
|
||||||
|
@ -204,7 +228,7 @@
|
||||||
;; Returns next CHAR
|
;; Returns next CHAR
|
||||||
:preserve_keyword
|
:preserve_keyword
|
||||||
LOADUI R2 $keyword_chars ; Using keyword list of chars
|
LOADUI R2 $keyword_chars ; Using keyword list of chars
|
||||||
CALLI R15 @in_set ; Check if in list
|
CALLI R15 @in_set2 ; Check if in list
|
||||||
JUMP.Z R2 @preserve_keyword_label ; if not in set, stop iterating
|
JUMP.Z R2 @preserve_keyword_label ; if not in set, stop iterating
|
||||||
|
|
||||||
:preserve_keyword_reset
|
:preserve_keyword_reset
|
||||||
|
@ -223,7 +247,7 @@
|
||||||
;; Returns next CHAR
|
;; Returns next CHAR
|
||||||
:preserve_symbol
|
:preserve_symbol
|
||||||
LOADUI R2 $symbol_chars ; Using symbol list of chars
|
LOADUI R2 $symbol_chars ; Using symbol list of chars
|
||||||
CALLI R15 @in_set ; Check if in list
|
CALLI R15 @in_set2 ; Check if in list
|
||||||
JUMP.NZ R2 @preserve_symbol_reset
|
JUMP.NZ R2 @preserve_symbol_reset
|
||||||
|
|
||||||
;; Looks we didn't find anything we wanted to preserve
|
;; Looks we didn't find anything we wanted to preserve
|
||||||
|
@ -263,7 +287,7 @@
|
||||||
|
|
||||||
;; Check for keywords
|
;; Check for keywords
|
||||||
LOADUI R2 $keyword_chars ; Using keyword list
|
LOADUI R2 $keyword_chars ; Using keyword list
|
||||||
CALLI R15 @in_set ; Check if keyword
|
CALLI R15 @in_set2 ; Check if keyword
|
||||||
JUMP.Z R2 @get_token_symbol ; if not a keyword
|
JUMP.Z R2 @get_token_symbol ; if not a keyword
|
||||||
CALLI R15 @preserve_keyword ; Yep its a keyword
|
CALLI R15 @preserve_keyword ; Yep its a keyword
|
||||||
JUMP @get_token_done ; Be done with token
|
JUMP @get_token_done ; Be done with token
|
||||||
|
@ -271,7 +295,7 @@
|
||||||
;; Check for symbols
|
;; Check for symbols
|
||||||
:get_token_symbol
|
:get_token_symbol
|
||||||
LOADUI R2 $symbol_chars ; Using symbol list
|
LOADUI R2 $symbol_chars ; Using symbol list
|
||||||
CALLI R15 @in_set ; Check if symbol
|
CALLI R15 @in_set2 ; Check if symbol
|
||||||
JUMP.Z R2 @get_token_char ; If not a symbol
|
JUMP.Z R2 @get_token_char ; If not a symbol
|
||||||
CALLI R15 @preserve_symbol ; Yep its a symbol
|
CALLI R15 @preserve_symbol ; Yep its a symbol
|
||||||
JUMP @get_token_done ; Be done with token
|
JUMP @get_token_done ; Be done with token
|
||||||
|
@ -406,7 +430,16 @@
|
||||||
RET R15
|
RET R15
|
||||||
|
|
||||||
|
|
||||||
;; file_print function
|
|
||||||
|
:parse_string
|
||||||
|
RET R15
|
||||||
|
|
||||||
|
:declare_function
|
||||||
|
RET R15
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;; program function
|
||||||
;; Recieves struct token_list* global_token in R13,
|
;; Recieves struct token_list* global_token in R13,
|
||||||
;; struct token_list* out in R12,
|
;; struct token_list* out in R12,
|
||||||
;; struct token_list* string_list in R11
|
;; struct token_list* string_list in R11
|
||||||
|
@ -472,8 +505,79 @@
|
||||||
JUMP @program_iter
|
JUMP @program_iter
|
||||||
|
|
||||||
:program_function
|
:program_function
|
||||||
|
LOADUI R0 $open_paren ; Get open paren string
|
||||||
|
CALLI R15 @match ; Check if they match
|
||||||
|
JUMP.Z R0 @program_assign ; If not a match
|
||||||
|
|
||||||
|
;; Deal with case of TYPE NAME(...)
|
||||||
|
CALLI R15 @declare_function
|
||||||
JUMP @program_iter
|
JUMP @program_iter
|
||||||
|
|
||||||
|
:program_assign
|
||||||
|
LOADUI R0 $equal ; Get equal string
|
||||||
|
CALLI R15 @match ; Check if they match
|
||||||
|
JUMP.Z R0 @program_error ; If not a match
|
||||||
|
COPY R1 R10 ; Using GLOBALS_LIST
|
||||||
|
LOADUI R0 $program_string0 ; Using the GLOBAL_ prefix
|
||||||
|
CALLI R15 @emit ; emit it
|
||||||
|
MOVE R1 R0 ; Move new GLOBALS_LIST into Place
|
||||||
|
MOVE R0 R3 ; Use GLOBAL_TOKEN->PREV->S
|
||||||
|
CALLI R15 @emit ; emit it
|
||||||
|
MOVE R1 R0 ; Move new GLOBALS_LIST into Place
|
||||||
|
LOADUI R0 $newline ; Using the Newline postfix
|
||||||
|
CALLI R15 @emit ; emit it
|
||||||
|
MOVE R10 R0 ; Update GLOBALS_LIST
|
||||||
|
LOAD32 R13 R13 0 ; GLOBAL_TOKEN = GLOBAL_TOKEN->NEXT
|
||||||
|
LOAD32 R0 R13 8 ; GLOBAL_TOKEN->S
|
||||||
|
LOADU8 R0 R0 0 ; GLOBAL_TOKEN->S[0]
|
||||||
|
LOADUI R1 $digit_chars ; 0-9
|
||||||
|
CALLI R15 @in_set ; Figure out if in set
|
||||||
|
JUMP.Z R0 @program_assign_string ; If not in sets
|
||||||
|
|
||||||
|
;; Looks like we have an int
|
||||||
|
COPY R1 R10 ; Using GLOBALS_LIST
|
||||||
|
LOADUI R0 $percent ; Using percent prefix
|
||||||
|
CALLI R15 @emit ; emit it
|
||||||
|
MOVE R1 R0 ; Put GLOBALS_LIST into Place
|
||||||
|
LOAD32 R0 R13 8 ; GLOBAL_TOKEN->S
|
||||||
|
CALLI R15 @emit ; emit it
|
||||||
|
MOVE R1 R0 ; Put GLOBALS_LIST into Place
|
||||||
|
LOADUI R0 $newline ; Using newline postfix
|
||||||
|
CALLI R15 @emit ; emit it
|
||||||
|
MOVE R10 R0 ; Update GLOBALS_LIST
|
||||||
|
JUMP @program_assign_done ; Move on
|
||||||
|
|
||||||
|
:program_assign_string
|
||||||
|
LOAD32 R0 R13 8 ; GLOBAL_TOKEN->S
|
||||||
|
LOADU8 R0 R0 0 ; GLOBAL_TOKEN->S[0]
|
||||||
|
CMPSKIPI.E R0 34 ; If GLOBAL_TOKEN->S[0] == '"'
|
||||||
|
JUMP @program_error ; If not we hit an error
|
||||||
|
|
||||||
|
;; Looks like we have a string
|
||||||
|
LOAD32 R0 R13 8 ; GLOBAL_TOKEN->S
|
||||||
|
CALLI R15 @parse_string ; Parse it into useful form
|
||||||
|
COPY R1 R10 ; GLOBALS_LIST
|
||||||
|
CALLI R15 @emit ; emit it
|
||||||
|
MOVE R10 R0 ; Update GLOBALS_LIST
|
||||||
|
|
||||||
|
:program_assign_done
|
||||||
|
LOAD32 R13 R13 0 ; GLOBAL_TOKEN = GLOBAL_TOKEN->NEXT
|
||||||
|
LOADUI R0 $program_string4 ; Potential error message
|
||||||
|
LOADUI R1 $semicolon ; Checking for ;
|
||||||
|
CALLI R15 @require_match ; Catch those errors
|
||||||
|
JUMP @program_iter
|
||||||
|
|
||||||
|
:program_error
|
||||||
|
LOADUI R0 $program_string2 ; message part 1
|
||||||
|
FALSE R1 ; Show to user
|
||||||
|
CALLI R15 @file_print ; write
|
||||||
|
LOAD32 R0 R13 8 ; GLOBAL_TOKEN->S
|
||||||
|
CALLI R15 @file_print ; write
|
||||||
|
LOADUI R0 $program_string3 ; message part 2
|
||||||
|
CALLI R15 @file_print ; write
|
||||||
|
CALLI R15 @line_error ; Provide a meaningful error message
|
||||||
|
HALT
|
||||||
|
|
||||||
:program_done
|
:program_done
|
||||||
POPR R3 R15 ; Restore R3
|
POPR R3 R15 ; Restore R3
|
||||||
POPR R2 R15 ; Restore R2
|
POPR R2 R15 ; Restore R2
|
||||||
|
@ -487,7 +591,15 @@
|
||||||
"
|
"
|
||||||
NOP
|
NOP
|
||||||
"
|
"
|
||||||
|
:program_string2
|
||||||
|
"Recieved "
|
||||||
|
:program_string3
|
||||||
|
" in program
|
||||||
|
"
|
||||||
|
:program_string4
|
||||||
|
"ERROR in Program
|
||||||
|
Missing ;
|
||||||
|
"
|
||||||
|
|
||||||
;; sym_declare function
|
;; sym_declare function
|
||||||
;; Recieves char* in R0, struct type* in R1, struct token_list* in R2
|
;; Recieves char* in R0, struct type* in R1, struct token_list* in R2
|
||||||
|
@ -794,7 +906,7 @@ Missing ;
|
||||||
FALSE R1 ; We will want to be writing the error message for the Human
|
FALSE R1 ; We will want to be writing the error message for the Human
|
||||||
LOADUI R0 $type_name_string0 ; The first string
|
LOADUI R0 $type_name_string0 ; The first string
|
||||||
CALLI R15 @file_print ; Display it
|
CALLI R15 @file_print ; Display it
|
||||||
LOAD32 R1 R13 8 ; GLOBAL_TOKEN->S
|
LOAD32 R0 R13 8 ; GLOBAL_TOKEN->S
|
||||||
CALLI R15 @file_print ; Display it
|
CALLI R15 @file_print ; Display it
|
||||||
LOADUI R0 $newline ; Terminating linefeed
|
LOADUI R0 $newline ; Terminating linefeed
|
||||||
CALLI R15 @file_print ; Display it
|
CALLI R15 @file_print ; Display it
|
||||||
|
@ -956,6 +1068,10 @@ Missing ;
|
||||||
")"
|
")"
|
||||||
:semicolon
|
:semicolon
|
||||||
";"
|
";"
|
||||||
|
:equal
|
||||||
|
"="
|
||||||
|
:percent
|
||||||
|
"%"
|
||||||
:newline
|
:newline
|
||||||
"
|
"
|
||||||
"
|
"
|
||||||
|
|
Loading…
Reference in New Issue