| variable skipsynclines \ are sync lines ("#line ...") invisible to the parser? |
variable skipsynclines \ are sync lines ("#line ...") invisible to the parser? |
| skipsynclines on |
skipsynclines on |
| |
|
| variable next-stack-number 0 next-stack-number ! |
: th ( addr1 n -- addr2 ) |
| |
cells + ; |
| |
|
| |
: holds ( addr u -- ) |
| |
\ like HOLD, but for a string |
| |
tuck + swap 0 +do |
| |
1- dup c@ hold |
| |
loop |
| |
drop ; |
| |
|
| : start ( -- addr ) |
: start ( -- addr ) |
| cookedinput @ ; |
cookedinput @ ; |
| : quote ( -- ) |
: quote ( -- ) |
| [char] " emit ; |
[char] " emit ; |
| |
|
| variable output \ xt ( -- ) of output word |
variable output \ xt ( -- ) of output word for simple primitives |
| |
variable output-combined \ xt ( -- ) of output word for combined primitives |
| |
|
| : printprim ( -- ) |
: printprim ( -- ) |
| output @ execute ; |
output @ execute ; |
| struct% |
struct% |
| cell% field stack-number \ the number of this stack |
cell% field stack-number \ the number of this stack |
| cell% 2* field stack-pointer \ stackpointer name |
cell% 2* field stack-pointer \ stackpointer name |
| |
cell% 2* field stack-typename \ name for default type of stack items |
| cell% 2* field stack-cast \ cast string for assignments to stack elements |
cell% 2* field stack-cast \ cast string for assignments to stack elements |
| cell% field stack-in-index-xt \ ( in-size item -- in-index ) |
cell% field stack-in-index-xt \ ( in-size item -- in-index ) |
| end-struct stack% |
end-struct stack% |
| cell% field type-store \ xt of store code generator ( item -- ) |
cell% field type-store \ xt of store code generator ( item -- ) |
| end-struct type% |
end-struct type% |
| |
|
| |
variable next-stack-number 0 next-stack-number ! |
| |
create stacks max-stacks cells allot \ array of stacks |
| |
|
| : stack-in-index ( in-size item -- in-index ) |
: stack-in-index ( in-size item -- in-index ) |
| item-offset @ - 1- ; |
item-offset @ - 1- ; |
| |
|
| : inst-in-index ( in-size item -- in-index ) |
: inst-in-index ( in-size item -- in-index ) |
| nip dup item-offset @ swap item-type @ type-size @ + 1- ; |
nip dup item-offset @ swap item-type @ type-size @ + 1- ; |
| |
|
| : make-stack ( addr-ptr u1 addr-cast u2 "stack-name" -- ) |
: make-stack ( addr-ptr u1 addr-stack u2 addr-cast u3 "stack-name" -- ) |
| create stack% %allot >r |
create stack% %allot >r |
| |
r@ stacks next-stack-number @ th ! |
| next-stack-number @ r@ stack-number ! 1 next-stack-number +! |
next-stack-number @ r@ stack-number ! 1 next-stack-number +! |
| save-mem r@ stack-cast 2! |
save-mem r@ stack-cast 2! |
| |
save-mem r@ stack-typename 2! |
| save-mem r@ stack-pointer 2! |
save-mem r@ stack-pointer 2! |
| ['] stack-in-index r> stack-in-index-xt ! ; |
['] stack-in-index r> stack-in-index-xt ! ; |
| |
|
| s" sp" save-mem s" (Cell)" make-stack data-stack |
s" sp" save-mem s" Cell" save-mem s" (Cell)" make-stack data-stack |
| s" fp" save-mem s" " make-stack fp-stack |
s" fp" save-mem s" Float" save-mem s" " make-stack fp-stack |
| s" rp" save-mem s" (Cell)" make-stack return-stack |
s" rp" save-mem s" Cell" save-mem s" (Cell)" make-stack return-stack |
| s" IP" save-mem s" error don't use # on results" make-stack inst-stream |
s" IP" save-mem s" Cell" save-mem s" error don't use # on results" make-stack inst-stream |
| ' inst-in-index inst-stream stack-in-index-xt ! |
' inst-in-index inst-stream stack-in-index-xt ! |
| \ !! initialize stack-in and stack-out |
\ !! initialize stack-in and stack-out |
| |
|
| ." }" cr |
." }" cr |
| ." #endif" cr ; |
." #endif" cr ; |
| |
|
| |
: print-entry ( -- ) |
| |
." I_" prim prim-c-name 2@ type ." :" ; |
| |
|
| : output-c ( -- ) |
: output-c ( -- ) |
| ." I_" prim prim-c-name 2@ type ." : /* " prim prim-name 2@ type ." ( " prim prim-stack-string 2@ type ." ) */" cr |
print-entry ." /* " prim prim-name 2@ type ." ( " prim prim-stack-string 2@ type ." ) */" cr |
| ." /* " prim prim-doc 2@ type ." */" cr |
." /* " prim prim-doc 2@ type ." */" cr |
| ." NAME(" quote prim prim-name 2@ type quote ." )" cr \ debugging |
." NAME(" quote prim prim-name 2@ type quote ." )" cr \ debugging |
| ." {" cr |
." {" cr |
| |
|
| create current-depth max-stacks cells allot |
create current-depth max-stacks cells allot |
| create max-depth max-stacks cells allot |
create max-depth max-stacks cells allot |
| |
create min-depth max-stacks cells allot |
| |
|
| : init-combined ( -- ) |
: init-combined ( -- ) |
| 0 num-combined ! |
0 num-combined ! |
| current-depth max-stacks cells erase |
current-depth max-stacks cells erase |
| max-depth max-stacks cells erase ; |
max-depth max-stacks cells erase |
| |
min-depth max-stacks cells erase |
| |
prim prim-effect-in prim prim-effect-in-end ! |
| |
prim prim-effect-out prim prim-effect-out-end ! ; |
| |
|
| : max! ( n addr -- ) |
: max! ( n addr -- ) |
| tuck @ max swap ! ; |
tuck @ max swap ! ; |
| |
|
| |
: min! ( n addr -- ) |
| |
tuck @ min swap ! ; |
| |
|
| : add-depths { p -- } |
: add-depths { p -- } |
| \ combine stack effect of p with *-depths |
\ combine stack effect of p with *-depths |
| max-stacks 0 ?do |
max-stacks 0 ?do |
| current-depth i cells + @ |
current-depth i th @ |
| p prim-stacks-in i cells + @ + |
p prim-stacks-in i th @ + |
| dup max-depth i cells + max! |
dup max-depth i th max! |
| p prim-stacks-out i cells + @ - |
p prim-stacks-out i th @ - |
| current-depth i cells + ! |
dup min-depth i th min! |
| |
current-depth i th ! |
| loop ; |
loop ; |
| |
|
| : add-prim ( addr u -- ) |
: add-prim ( addr u -- ) |
| \ add primitive given by "addr u" to combined-prims |
\ add primitive given by "addr u" to combined-prims |
| primitives search-wordlist s" unknown primitive" ?print-error |
primitives search-wordlist s" unknown primitive" ?print-error |
| execute { p } |
execute { p } |
| p combined-prims num-combined @ cells + ! |
p combined-prims num-combined @ th ! |
| 1 num-combined +! |
1 num-combined +! |
| p add-depths ; |
p add-depths ; |
| |
|
| : compute-effects { q -- } |
: compute-effects { q -- } |
| \ compute the stack effects of q from the depths |
\ compute the stack effects of q from the depths |
| max-stacks 0 ?do |
max-stacks 0 ?do |
| max-depth i cells + @ dup |
max-depth i th @ dup |
| q prim-stacks-in i cells + ! |
q prim-stacks-in i th ! |
| current-depth i cells + @ - |
current-depth i th @ - |
| q prim-stacks-out i cells + ! |
q prim-stacks-out i th ! |
| |
loop ; |
| |
|
| |
: make-effect-items { stack# items effect-endp -- } |
| |
\ effect-endp points to a pointer to the end of the current item-array |
| |
\ and has to be updated |
| |
stacks stack# th @ { stack } |
| |
items 0 +do |
| |
effect-endp @ { item } |
| |
i 0 <# #s stack stack-pointer 2@ holds [char] _ hold #> save-mem |
| |
item item-name 2! |
| |
stack item item-stack ! |
| |
0 item item-type ! |
| |
i item item-offset ! |
| |
item item-first on |
| |
item% %size effect-endp +! |
| |
loop ; |
| |
|
| |
: init-effects { q -- } |
| |
\ initialize effects field for FETCHES and STORES |
| |
max-stacks 0 ?do |
| |
i q prim-stacks-in i th @ q prim-effect-in-end make-effect-items |
| |
i q prim-stacks-out i th @ q prim-effect-out-end make-effect-items |
| loop ; |
loop ; |
| |
|
| : process-combined ( -- ) |
: process-combined ( -- ) |
| prim compute-effects ; |
prim compute-effects |
| |
prim init-effects |
| |
output-combined perform ; |
| |
|
| |
\ C output |
| |
|
| |
: print-item { n stack -- } |
| |
\ print nth stack item name |
| |
." _" stack stack-typename 2@ type space |
| |
stack stack-pointer 2@ type n 0 .r ; |
| |
|
| |
: print-declarations-combined ( -- ) |
| |
max-stacks 0 ?do |
| |
max-depth i th @ min-depth i th @ - 0 +do |
| |
i stacks j th @ print-item ." ;" cr |
| |
loop |
| |
loop ; |
| |
|
| |
: output-c-combined ( -- ) |
| |
print-entry cr |
| |
\ debugging messages just in constituents |
| |
." {" cr |
| |
." DEF_CA" cr |
| |
print-declarations-combined |
| |
." NEXT_P0;" cr |
| |
flush-tos |
| |
fetches |
| |
; |
| |
|
| |
: output-forth-combined ( -- ) |
| |
; |
| |
|
| \ the parser |
\ the parser |
| |
|
| checksyncline |
checksyncline |
| primitives2something ; |
primitives2something ; |
| |
|
| : process-file ( addr u xt -- ) |
: process-file ( addr u xt-simple x-combined -- ) |
| output ! |
output-combined ! output ! |
| save-mem 2dup filename 2! |
save-mem 2dup filename 2! |
| slurp-file |
slurp-file |
| warnings @ if |
warnings @ if |
| ." ------------ CUT HERE -------------" cr endif |
." ------------ CUT HERE -------------" cr endif |
| primfilter ; |
primfilter ; |
| |
|
| : process ( xt -- ) |
\ : process ( xt -- ) |
| bl word count rot |
\ bl word count rot |
| process-file ; |
\ process-file ; |