parsing progress

This commit is contained in:
~d6 2022-12-08 00:33:04 -05:00
parent ba4b9c02e3
commit e382e2fb1a
1 changed files with 114 additions and 34 deletions

148
hoax.tal
View File

@ -112,29 +112,30 @@
( 04 comment ) ( 04 comment )
@state $1 @state $1
@stack $2 @stack $2
@buffer [ &pos $1 &input $40 ] ( max symbol size 64 ) @buffer [ &pos $2 &input $40 ] ( max symbol size 64 )
|0100 |0100
;init-hoax JSR2 ;init-hoax JSR2
#00 .state STZ #00 .state STZ
;on-key #10 DEO2 ;buf-reset JSR2
;reset-input JSR2 ;on-key-ready #10 DEO2
( ;reset-input JSR2 )
;demo JSR2 ;demo JSR2
( DEBUG EXIT ) ( DEBUG EXIT )
BRK BRK
@reset-input ( -> ) ( @reset-input ( -> )
#0000 #0000 ;cons JSR2 ( pair$ ) #0000 #0000 ;cons JSR2 ( pair$ )
.stack STZ2 ( ; stack<-pair ) .stack STZ2 ( ; stack<-pair )
JMP2r JMP2r )
@complete-with ( v$ -> ) ( @complete-with ( v$ -> )
.stack LDZ2 ( v$ stack$ ) .stack LDZ2 ( v$ stack$ )
STH2k SWP2 ;car! JSR2 ( [stack] ; car(stack)<-v ) STH2k SWP2 ;car! JSR2 ( [stack] ; car(stack)<-v )
#0000 STH2r ;cons JSR2 ( cell$ ) #0000 STH2r ;cons JSR2 ( cell$ )
.stack STZ2 ( stack<- ) .stack STZ2 ( stack<- ) )
@start-list ( -> ) ( @start-list ( -> )
#0000 .stack LDZ2 ( 0000 stack$ ) #0000 .stack LDZ2 ( 0000 stack$ )
;cons JSR2 ( pair$ ) ;cons JSR2 ( pair$ )
DUP2 .stack STZ2 ( pair$ ; stack<-pair ) DUP2 .stack STZ2 ( pair$ ; stack<-pair )
@ -146,39 +147,118 @@
POP2 STH2r ( cell$ [a^] ) POP2 STH2r ( cell$ [a^] )
INCr INCr STHkr ( cell$ a+2^ [a+2^] ) INCr INCr STHkr ( cell$ a+2^ [a+2^] )
STZ2 STHr .stack/pos STZ ( ; pos<-a+2 ) STZ2 STHr .stack/pos STZ ( ; pos<-a+2 )
JMP2r )
( @end-list ( -> )
;stack/pos LDA2k LDA2 ( pos* elem$ )
STH2 #0004 SUB2 ( pos-4* [elem$] ) )
@buf-end ( -> )
#00 ;buffer/pos LDA2 STA ( ; addr<-00 )
@buf-reset
;buffer/input ;buffer/pos STA2 ( ; pos<-start )
JMP2r JMP2r
@end-list ( -> ) @buf-add ( c -> )
;stack/pos LDA2k LDA2 ( pos* elem$ ) ;buffer/pos LDA2 STAk ( c^ addr* )
STH2 #0004 SUB2 ( pos-4* [elem$] ) INC2 ;buffer/pos STA2 ( c^ ; pos<-addr+1 )
POP JMP2r ( )
@start-list ( c -> )
;echo JSR2 "start 20 "list 0a 00 POP BRK
@on-key-start ( -> ) @end-list ( c -> )
;echo JSR2 "end 20 "list 0a 00 POP BRK
@start-string ( c -> )
;on-key-string #10 DEO2
;echo JSR2 "start 20 "string 0a 00 POP BRK
@append-string ( c -> )
;echo JSR2 "append 20 "string 20 00
DUP #18 DEO NL
;buf-add JSR2 BRK
@end-string ( c -> )
;on-key-ready #10 DEO2
;echo JSR2 "end 20 "string 0a 00 POP
;buf-end JSR2
;buffer/input ;print JSR2 NL
BRK
@start-word ( c -> )
;on-key-word #10 DEO2
;echo JSR2 "start 20 "word 20 00
DUP #18 DEO NL
;buf-add JSR2 BRK
@append-word ( c -> )
;echo JSR2 "append 20 "word 20 00
DUP #18 DEO NL
;buf-add JSR2 BRK
@end-word0 ( c -> )
;on-key-ready #10 DEO2
;echo JSR2 "end 20 "word 0a 00 POP
;buf-end JSR2
;buffer/input ;print JSR2 NL
JMP2r
@start-escape ( c -> )
;on-key-escaped #10 DEO2
;echo JSR2 "start 20 "escape 0a 00 POP BRK
( TODO: more sophisticated escapes )
@on-key-escaped ( -> )
;on-key-string #10 DEO2
#12 DEI ;append-string JMP2
( string state means we're inside a string literal )
( waiting to see an unecaped closing double quote )
@on-key-string ( -> )
#12 DEI #12 DEI
DUP #09 EQU ,&skip JCN ( tab ) DUP #5c EQU ;start-escape JCN2 ( backslash )
DUP #0a EQU ,&skip JCN ( nl ) DUP #22 EQU ;end-string JCN2 ( dquote )
DUP #0d EQU ,&skip JCN ( cr ) ;append-string JMP2
DUP #20 EQU ,&skip JCN ( sp )
DUP #20 LTH ,&control JCN ( control chars )
DUP #7e GTH ,&control JCN ( delete + 8bit )
DUP #28 EQU ,start-list JCN ( lpar )
DUP #29 EQU ,&rpar JCN ( rpar )
,&printable JMP
&rpar ( word state means we're in a word until whitespace )
@on-key-word ( -> )
#12 DEI
DUP #29 EQU ,&end JCN ( rpar )
DUP #09 EQU ,&space JCN ( tab )
DUP #0a EQU ,&space JCN ( nl )
DUP #0d EQU ,&space JCN ( cr )
DUP #20 EQU ,&space JCN ( sp )
DUP #20 LTH ,&skip JCN ( control chars )
DUP #7e GTH ,&skip JCN ( delete + 8bit )
;append-word JMP2
&skip
;echo JSR2 "skipped 0a 00 POP BRK
&space
;end-word0 JSR2
;echo JSR2 "whitespace 0a 00 BRK
&end
;end-word0 JSR2
#00 ;end-list JMP2
( ready state means we are expecing a complete value )
&skip POP BRK @on-key-ready ( -> )
&control POP BRK ( todo ) #12 DEI
&printable DUP #28 EQU ;start-list JCN2 ( lpar )
DUP #29 EQU ;end-list JCN2 ( rpar )
@on-key ( -> ) DUP #22 EQU ;start-string JCN2 ( dquote )
.state LDZ #00 EQU ,on-key-start JCN DUP #09 EQU ,&space JCN ( tab )
.state LDZ #01 EQU ,on-key-symbol JCN DUP #0a EQU ,&space JCN ( nl )
.state LDZ #02 EQU ,on-key-string JCN DUP #0d EQU ,&space JCN ( cr )
.state LDZ #03 EQU ,on-key-escape JCN DUP #20 EQU ,&space JCN ( sp )
.state LDZ #04 EQU ,on-key-comment JCN DUP #20 LTH ,&skip JCN ( control chars )
#0000 DIV DUP #7e GTH ,&skip JCN ( delete + 8bit )
;start-word JMP2
&space
;echo JSR2 "whitespace 0a 00 POP BRK
&skip
;echo JSR2 "skipped 0a 00 POP BRK
( #12 DEI #0a EQU ,&newline JCN ( #12 DEI #0a EQU ,&newline JCN
#12 DEI ;buffer/pos LDA2 STAk ( c pos ; addr<-c ) #12 DEI ;buffer/pos LDA2 STAk ( c pos ; addr<-c )