changeset 127:527212870064

Add parsing routines for bare commands and REM statements
author William Astle <lost@l-w.ca>
date Tue, 09 Jan 2024 22:47:11 -0700
parents ac183a519439
children 9d57279c900e
files src/parse.s
diffstat 1 files changed, 21 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/parse.s	Mon Jan 08 22:58:08 2024 -0700
+++ b/src/parse.s	Tue Jan 09 22:47:11 2024 -0700
@@ -31,6 +31,8 @@
                 ldu parse_tokenst               ; get start location we started parsing the token at
                 rts                             ; return error condition
 parse0          ldx #parsetab_cmd               ; point to jump table for token type handler
+                cmpb #token_stmtsep             ; is it a statement separator?
+                beq parse_nextstmt              ; brif so - we can just skip it
 parse1          cmpb ,x                         ; did we match a valid command token?
                 beq parse3                      ; brif so
                 leax 3,x                        ; move to next entry
@@ -40,7 +42,7 @@
                 bra parse_error                 ; and return the error
 parse3          jsr [1,x]                       ; call the handler
                 bcs parse_error                 ; brif the handler indicated error
-                jsr parse_curtoken              ; get the token we terminated on
+                bsr parse_curtoken              ; fetch the token we left off on
                 cmpb #token_eot                 ; end of input?
                 bne parse4                      ; brif not
                 ldb #bc_eol                     ; stash an end of line op
@@ -134,6 +136,17 @@
 parse_toupper0  rts                             ; Z only set here if input was zero entering from parse_nextcharu
 parse_number    jmp parse_tokerr
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Parse a statement that consists of just the command token
+parse_cmdsingle equ parse_write                 ; just write the token out and bail
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Parse a REM or ' statement. We just copy the comment out after the REM or ' token.
+parse_rem       jsr parse_write                 ; write the token/character out
+                ldb ,y+                         ; get next input character
+                bne parse_rem                   ; brif not at the end of the input
+                ldb #token_eot                  ; flag end of input for mainline parser
+                stb parse_curtok
+                rts                             ; return, pass back the C result from parse_write
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; This routine parses tokens using the table at parse_wordtab. The table is structured as follows:
 ;
 ; * two bytes which contain the length of the table less the two bytes for this length value
@@ -340,18 +353,18 @@
                 parse_tokendefp sub             ; SUB
                 parse_tokendefp as              ; AS
 
-                parse_tokendefc remabbr,parse_noop,list_noop,exec_noop          ; abbreviated REM (')
-                parse_tokendefc rem,parse_noop,list_noop,exec_noop              ; REM
-                parse_tokendefc return,parse_noop,parse_noop,parse_noop         ; RETURN
+                parse_tokendefc remabbr,parse_rem,list_noop,exec_noop           ; abbreviated REM (')
+                parse_tokendefc rem,parse_rem,list_noop,exec_noop               ; REM
+                parse_tokendefc return,parse_cmdsingle,parse_noop,parse_noop    ; RETURN
                 parse_tokendefc run,parse_noop,parse_noop,parse_noop            ; RUN
                 parse_tokendefc data,parse_noop,parse_noop,parse_noop           ; DATA
-                parse_tokendefc end,parse_noop,parse_noop,parse_noop            ; END
-                parse_tokendefc stop,parse_noop,parse_noop,parse_noop           ; STOP
+                parse_tokendefc end,parse_cmdsingle,parse_noop,parse_noop       ; END
+                parse_tokendefc stop,parse_cmdsingle,parse_noop,parse_noop      ; STOP
                 parse_tokendefc let,parse_noop,parse_noop,parse_noop            ; LET
                 parse_tokendefc list,parse_noop,parse_noop,parse_noop           ; LIST
-                parse_tokendefc new,parse_noop,parse_noop,parse_noop            ; NEW
+                parse_tokendefc new,parse_cmdsingle,parse_noop,parse_noop       ; NEW
                 parse_tokendefc print,parse_noop,parse_noop,parse_noop          ; PRINT
-                parse_tokendefc pop,parse_noop,parse_noop,parse_noop            ; POP
+                parse_tokendefc pop,parse_cmdsingle,parse_noop,parse_noop       ; POP
                 parse_tokendefc goto,parse_noop,parse_noop,parse_noop           ; GOTO
                 parse_tokendefc gosub,parse_noop,parse_noop,parse_noop          ; GOSUB
                 parse_tokendefc go,parse_noop,parse_noop,parse_noop             ; GO