Dale jsem si hral s pravidlama pro (C/H)STORE.
Tohle slovo ma na zasobniku parametry "number address" a uklada to cislo na tu zadanou adresu a jako vetsina Forth slov tim odstrani parametry.
U toho jsem narazil na kombinace kdy si zachovavam adresu v zasobniku a to co chci ulozit tam vkladam na posledni chvili.
Pokud je adresa v TOS:
PUSH(num) OVER STORE
Pokud je adresa v NOS:
PUSH(num) PUSH(2) PICK STORE
atd.
Tohle jsem se snazil pridat do tokenovych pravidel protoze to tam nebylo.
Zacal jsem ale primo tim ze jsem to rozdelil na
PUSH(num) PUSH(x) PICK.
Kde jsem postupne zvedal x od nuly
x=0
PUSH(0) PICK --> DUP
Pokud pred tim je uz nejake PUSHS tak to muze uz zduplikovat jen posledni parametr a zustat u tokenu PUSHS.
x=1
PUSH(1) PICK --> OVER
Pokud je pred tim jeden parametr v PUSHS tak se to meni na PUSH_OVER
Pokud ji je vic tak to muze uz zduplikovat jen predposledni parametr a zustat u tokenu PUSHS.
x=2
uz zacne byt zajimavejsi protoze se ukazuje, ze nez se hluboko hrabat v zasobniku je lepsi to nejak osulit kombinaci jinych slov. V podstate se pokusime vytahnout neznamou co nejdriv nez zacneme na zasobnik ukladat dalsi hodnoty.PUSH(2) PICK --> OVER
Pokud je pred tim jeden parametr v PUSHS tak se to meni na OVER_PUSH_SWAP, protoze je to mnohem lepsi nez PUSH(num1) a _2_PICK.
Pokud jsou pred tim dva parametry v PUSHS tak se to meni na DUP_PUSH_SWAP a PUSH_SWAP, protoze je to mnohem lepsi nez PUSH(num1,num2) a _2_PICK.
Pokud ji je vic tak to muze uz zduplikovat jen predpredposledni parametr a zustat u tokenu PUSHS.
x=3
PUSH(3) PICK --> _3_PICK
Pokud je pred tim jeden parametr v PUSHS tak se to meni na _2_PICK a PUSH_SWAP, protoze je to mnohem lepsi PUSH(num1) a _3_PICK.
Pokud jsou pred tim dva parametry v PUSHS tak se to meni na OVER_PUSH_SWAP a PUSH_SWAP, protoze je to mnohem lepsi nez PUSH(num1,num2) a _3_PICK.
Pokud jsou pred tim tri parametry v PUSHS tak se to meni na DUP_PUSH_SWAP a PUSH_SWAP_PUSH_SWAP, protoze je to mnohem lepsi nez PUSH(num1,num2,num3) a _3_PICK.
Pokud ji je vic tak to muze uz zduplikovat jen predpredposledni parametr a zustat u tokenu PUSHS.
x=4
atd.
Tohle nejak fungovalo, jen jsem musel vyresit jak zapsat __INFO. Kdyz jsem pokud se to rozpadlo zadal pro oba tokeny stejne info tak to vypadalo dobre...
...jenze kdyz jsem zacal psat pravidla ze za to hodim STORE (pripadne CSTORE nebo HSTORE), tak vznikly komplikace.
Nemluvim jen o tom ze najednou kdyz ocekavam ze pred tim je PUSHS token a _3_PICK token tak tam je nejaka kombinace jinych tokenu.
Ale hlavne o INFU, protoze se me nekdy zdvojuje a ja nemam informaci ze je to zdvojene. A kdyz to bylo napr. PUSH(num1) PUSH(3) PICK STORE tak to najednou bylo "num1 3 pick num1 3 pick !".
Kdyz bych info u druheho tokenu umazal tak by nekdy byla fakt velka mezera v komentarich.
Osetril jsem to nejak ale vysledek proste nekdy vytvarel chyby nebo uplne nesmysly. Protoze STORE uz nevi zda predtim tam bylo
"OVER PUSH(num1) SWAP PUSH(num2) SWAP" a nebo "PUSH(num1,num2) _3_PICK". A pro obe varianty by se mel chova jinak.
Nakonec jsem to vyresil tak ze jsem zavedl specialni info "__dtto". Pokud pri uz vytvareni kodu ten token ma hodnotu stale __dtto tak se mu priradi info predchoziho tokenu. Pokud naopak se vola makro/fce __CONCATENATE_WITH a nejaky parametr ma hodnotu __dtto tak se tvari jako by tam nebyl. Tahlo makro/fce odstranuje i zbytecne mezery, protoze ignoruje i prazdne retezce. Prvni parametr fce je cim se bude oddelovat takze se to vola vetsinou jako __CONCATENATE_WITH({ },__T_INFO(1),__T_INFO(0),$2). To by melo spojit info z predchoziho, posledniho a $2 je aktualne ukladaneho tokenu.
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0) PICK __SHOW_TOKEN(1)'
; name: __TOKEN_DUP
; info: 0 pick
;items: 0
;param: ()
push DE ; 1:11 0 pick ( a -- a a )
ld D, H ; 1:4 0 pick
ld E, L ; 1:4 0 pick
; seconds: 0 ;[ 3:19]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xaa) PUSH(0) PICK __SHOW_TOKEN(1)'
; name: __TOKEN_PUSHS
; info: 0xaa 0 pick
;items: 2
;param: (0xaa,0xaa)
;array1: >0xaa<
;array2: >0xaa<
;array: 0xaa,0xaa
;[7:40] 0xaa 0 pick ( -- 0xaa 0xaa )
push DE ; 1:11 0xaa 0 pick
push HL ; 1:11 0xaa 0 pick
ld DE, 0x00AA ; 3:10 0xaa 0 pick
ld L, E ; 1:4 0xaa 0 pick L = E = 0xAA
ld H, D ; 1:4 0xaa 0 pick H = D = 0x00
; seconds: 0 ;[ 7:40]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(1) PICK __SHOW_TOKEN(1)'
; name: __TOKEN_OVER
; info: 1 pick
;items: 0
;param: ()
push DE ; 1:11 1 pick ( b a -- b a b )
ex DE, HL ; 1:4 1 pick
; seconds: 0 ;[ 2:15]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xaa) PUSH(1) PICK __SHOW_TOKEN(1)'
; name: __TOKEN_PUSH_OVER
; info: 0xaa 1 pick
;items: 1
;param: (0xaa)
;array1: >0xaa<
;array: 0xaa
push DE ; 1:11 0xaa 1 pick ( a -- a 0xaa a )
push HL ; 1:11 0xaa 1 pick
ld DE, 0xaa ; 3:10 0xaa 1 pick
; seconds: 0 ;[ 5:32]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xbb) PUSH(0xaa) PUSH(1) PICK __SHOW_TOKEN(1)'
; name: __TOKEN_PUSHS
; info: 0xbb 0xaa 1 pick
;items: 3
;param: (0xbb,0xaa,0xbb)
;array1: >0xbb<
;array2: >0xaa<
;array3: >0xbb<
;array: 0xbb,0xaa,0xbb
push DE ; 1:11 0xbb 0xaa 1 pick ( -- 0xbb 0xaa 0xbb ) push3.m4
push HL ; 1:11 0xbb 0xaa 1 pick
ld HL, 0x00BB ; 3:10 0xbb 0xaa 1 pick
push HL ; 1:11 0xbb 0xaa 1 pick
ld DE, 0x00AA ; 3:10 0xbb 0xaa 1 pick
; seconds: 0 ;[ 9:53]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(2) PICK __SHOW_TOKEN(1)'
; name: __TOKEN_2_PICK
; info: 2 pick
;items: 0
;param: ()
;[ 6:44] 2 pick ( c b a -- c b a c )
pop BC ; 1:10 2 pick
push BC ; 1:11 2 pick
push DE ; 1:11 2 pick
ex DE, HL ; 1:4 2 pick
ld H, B ; 1:4 2 pick
ld L, C ; 1:4 2 pick
; seconds: 0 ;[ 6:44]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xaa) PUSH(2) PICK __SHOW_TOKEN(1)'
; name: __TOKEN_OVER_PUSH_SWAP
; info: 0xaa 2 pick
;items: 1
;param: (0xaa)
;array1: >0xaa<
;array: 0xaa
;[6:36] 0xaa 2 pick ( x1 x0 -- x1 x0 0xaa x1 )
push DE ; 1:11 0xaa 2 pick
push HL ; 1:11 0xaa 2 pick
ld HL, 0xaa ; 3:10 0xaa 2 pick
ex DE, HL ; 1:4 0xaa 2 pick
; seconds: 0 ;[ 6:36]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xbb) PUSH(0xaa) PUSH(2) PICK __SHOW_TOKEN(1) __SHOW_TOKEN(2)'
; name: __TOKEN_DUP_PUSH_SWAP
; info: 0xbb 0xaa 2 pick
;items: 2
;param: (0xbb,0xaa)
;array1: >0xbb<
;array2: >0xaa<
;array: 0xbb,0xaa
; name: __TOKEN_PUSH_SWAP
; info: __dtto
;items: 1
;param: (2)
;array1: >2<
;array: 2
push DE ; 1:11 0xbb 0xaa 2 pick ( a -- a 0xbb a )
push HL ; 1:11 0xbb 0xaa 2 pick
ld DE, 0xbb ; 3:10 0xbb 0xaa 2 pick
push DE ; 1:11 0xbb 0xaa 2 pick ( x -- 2 x )
ld DE, 2 ; 3:10 0xbb 0xaa 2 pick
; seconds: 0 ;[ 9:53]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xcc) PUSH(0xbb) PUSH(0xaa) PUSH(2) PICK __SHOW_TOKEN(1) __SHOW_TOKEN(2)'
; name: __TOKEN_PUSHS
; info: 0xcc 0xbb 0xaa 2 pick
;items: 4
;param: (0xcc,0xbb,0xaa,0xcc)
;array1: >0xcc<
;array2: >0xbb<
;array3: >0xaa<
;array4: >0xcc<
;array: 0xcc,0xbb,0xaa,0xcc
; name:
; info:
;items: 0
;param:
push DE ; 1:11 0xcc 0xbb 0xaa 2 pick
push HL ; 1:11 0xcc 0xbb 0xaa 2 pick
ld HL, 0x00CC ; 3:10 0xcc 0xbb 0xaa 2 pick
push HL ; 1:11 0xcc 0xbb 0xaa 2 pick
ld DE, 0x00BB ; 3:10 0xcc 0xbb 0xaa 2 pick
push DE ; 1:11 0xcc 0xbb 0xaa 2 pick
ld E, 0xAA ; 2:7 0xcc 0xbb 0xaa 2 pick
; seconds: 1 ;[12:71]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(3) PICK __SHOW_TOKEN(1)'
; name: __TOKEN_3_PICK
; info: 3 pick
;items: 0
;param: ()
;[ 8:65] 3 pick ( d c b a -- d c b a d )
pop AF ; 1:10 3 pick
pop BC ; 1:10 3 pick
push BC ; 1:11 3 pick
push AF ; 1:11 3 pick
push DE ; 1:11 3 pick
ex DE, HL ; 1:4 3 pick
ld H, B ; 1:4 3 pick
ld L, C ; 1:4 3 pick
; seconds: 1 ;[ 8:65]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xaa) PUSH(3) PICK __SHOW_TOKEN(1) __SHOW_TOKEN(2)'
; name: __TOKEN_2_PICK
; info: 0xaa 3 pick
;items: 0
;param: ()
; name: __TOKEN_PUSH_SWAP
; info: __dtto
;items: 1
;param: (0xaa)
;array1: >0xaa<
;array: 0xaa
;[ 6:44] 0xaa 3 pick ( c b a -- c b a c )
pop BC ; 1:10 0xaa 3 pick
push BC ; 1:11 0xaa 3 pick
push DE ; 1:11 0xaa 3 pick
ex DE, HL ; 1:4 0xaa 3 pick
ld H, B ; 1:4 0xaa 3 pick
ld L, C ; 1:4 0xaa 3 pick
push DE ; 1:11 0xaa 3 pick ( x -- 0xaa x )
ld DE, 0xaa ; 3:10 0xaa 3 pick
; seconds: 0 ;[10:65]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xbb) PUSH(0xaa) PUSH(3) PICK __SHOW_TOKEN(1) __SHOW_TOKEN(2)'
; name: __TOKEN_OVER_PUSH_SWAP
; info: 0xbb 0xaa 3 pick
;items: 1
;param: (0xbb)
;array1: >0xbb<
;array: 0xbb
; name: __TOKEN_PUSH_SWAP
; info: __dtto
;items: 1
;param: (0xaa)
;array1: >0xaa<
;array: 0xaa
;[6:36] 0xbb 0xaa 3 pick ( x1 x0 -- x1 x0 0xbb x1 )
push DE ; 1:11 0xbb 0xaa 3 pick
push HL ; 1:11 0xbb 0xaa 3 pick
ld HL, 0xbb ; 3:10 0xbb 0xaa 3 pick
ex DE, HL ; 1:4 0xbb 0xaa 3 pick
push DE ; 1:11 0xbb 0xaa 3 pick ( x -- 0xaa x )
ld DE, 0xaa ; 3:10 0xbb 0xaa 3 pick
; seconds: 0 ;[10:57]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xcc) PUSH(0xbb) PUSH(0xaa) PUSH(3) PICK __SHOW_TOKEN(1) __SHOW_TOKEN(2)'
; name: __TOKEN_DUP_PUSH_SWAP
; info: 0xcc 0xbb 0xaa 3 pick
;items: 1
;param: (0xcc)
;array1: >0xcc<
;array: 0xcc
; name: __TOKEN_PUSH_SWAP_PUSH_SWAP
; info: __dtto
;items: 2
;param: (0xbb,0xaa)
;array1: >0xbb<
;array2: >0xaa<
;array: 0xbb,0xaa
push DE ; 1:11 0xcc 0xbb 0xaa 3 pick ( a -- a 0xcc a )
push HL ; 1:11 0xcc 0xbb 0xaa 3 pick
ld DE, 0xcc ; 3:10 0xcc 0xbb 0xaa 3 pick
push DE ; 1:11 0xcc 0xbb 0xaa 3 pick ( x -- 0xbb 0xaa x )
ld DE, 0xbb ; 3:10 0xcc 0xbb 0xaa 3 pick
push DE ; 1:11 0xcc 0xbb 0xaa 3 pick
ld E, 0xAA ; 2:7 0xcc 0xbb 0xaa 3 pick
; seconds: 1 ;[12:71]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'PUSH(0xdd) PUSH(0xcc) PUSH(0xbb) PUSH(0xaa) PUSH(3) PICK __SHOW_TOKEN(1) __SHOW_TOKEN(2)'
; name: __TOKEN_PUSHS
; info: 0xdd 0xcc 0xbb 0xaa 3 pick
;items: 5
;param: (0xdd,0xcc,0xbb,0xaa,0xdd)
;array1: >0xdd<
;array2: >0xcc<
;array3: >0xbb<
;array4: >0xaa<
;array: 0xdd,0xcc,0xbb,0xaa,0xdd
; name:
; info:
;items: 0
;param:
push DE ; 1:11 0xdd 0xcc 0xbb 0xaa 3 pick
push HL ; 1:11 0xdd 0xcc 0xbb 0xaa 3 pick
ld HL, 0x00DD ; 3:10 0xdd 0xcc 0xbb 0xaa 3 pick
push HL ; 1:11 0xdd 0xcc 0xbb 0xaa 3 pick
ld DE, 0x00CC ; 3:10 0xdd 0xcc 0xbb 0xaa 3 pick
push DE ; 1:11 0xdd 0xcc 0xbb 0xaa 3 pick
ld E, 0xBB ; 2:7 0xdd 0xcc 0xbb 0xaa 3 pick
push DE ; 1:11 0xdd 0xcc 0xbb 0xaa 3 pick
ld E, 0xAA ; 2:7 0xdd 0xcc 0xbb 0xaa 3 pick
; seconds: 2 ;[15:89]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$
PS: Nevyhoda je ze se to zacina komplikovat... a pokud neco zmenim a token se rozpadne nebo zmeni jinak tak uz ho nezachyti STORE nebo jiny navazujici token. Pokud by se me to neustale nemenilo pod rukama tak by to tak nevadilo...
PPS: Opraveno eval(0__T_ITEMS(0)>1) na eval(1__T_ITEMS(0)>11). Protoze kdyz bylo parametru vic jak sedm a zaroven se tam objevila cislice 8 nebo 9 tak to vyhodilo chybu protoze uvodni nula oznamuje ze je to oktalove cislo. Myslel jsem ze to nevadi ale 08>5 vadi. Musim si hlidat i levou stranu.
Mozna jsem to mel prohodit a udelat eval(__T_ITEMS(0)0>10) ktere by se menilo na (0>10) nebo (10>10) nebo (20>10)...