Jak jsem psal tu 16 bitovou variantu tak jsem si uvedomil, ze v tuhle chvili jsem totalne rozbil moznost modifikaci kodu, pres definovani nejakych hodnot maker jako
define({_TYP_SINGLE},{fast})
Protoze kdyz prvne tokenizuji slova a na konci je rozbalim do kodu tak se me tim meni poradi co vykonavam.
Takze napriklad
Kód:
define({_TYP_SINGLE},{fast})
MUL
define({_TYP_SINGLE},{small})
se me vnitrne prevede na
Kód:
define({_TYP_SINGLE},{fast})
define({_TYP_SINGLE},{small})
MUL
Takze by to generovalo uplne jiny kod. Coz me pripomelo ze potrebuji mit uz i __ASM slovo pro vkladany asembler, aby se vlozil taky na spravne misto.
No a __ASM me uplne zastavil, protoze se me nedarilo to spravne napsat aby to uplne nerozbilo vsechno co jsem delal. Stravil jsem nad tim hodiny, protoze se to spatne debuguje kdyz vam to napise jen ze doslo k preteceni nebo nekde(u toho vypise nic nerikajici udaj) skoncilo makro na konci souboru v parametrech.
K tomu jsem zjistil ze se me rozbiji i PRINT nebo STRING slova. Kdy kdyz napisi PRINT({"SWAP"} tak se vykonaval. Pripadne kdyz mam 2 slova a prvni ma carku tak se to rozbiji.
Kdyz uz jsem udelal neco co PRINT zvladlo tak to rozbilo zase slova jako PUSH(1) PUSH(2) --> PUSH2(1,2).
..ale podarilo se. .)
Postupnou iteraci tam a zpet, zkousenim se chovat v "CASE" k slovum s retezci jinak nez k cislum. K vymysleni ze pridam dalsi parametr kde budu urcovat co za promennou to je (cislo nebo retezec).
Jsem dostal vysledek co zvladne PRINT({" SWAP , DUP "}) i ty PUSH prevody.
Ale __ASM se stale vzpiral.
Protoze regexp co jsem pouzival na oddeleni parametru NEZVLADNE multiline.
Takze jsem se vratil k puvodnimu hacku kdy se zbavuji jednoho rozmeru pole pres volani podfunkce.
Token vypada nejak takto
name: __TOKEN_DO_I8
info: do
param: (101)
Kdy ty zavorky jsou automaticky pridavany do toho parametru. Protoze pak se to chova jako jednorozmerna promenna i kdyz napriklad PUSH2 vypada
name: __TOKEN_PUSH2
info: 5 1
param: (5,1)
a pokud chci druhou hodnotu toho parametru tak volam __GET_TOKEN_ARRAY_2(cislo_tokenu)
Ten zavola __SPOJ s parametry "__2" a parametrem tokenu "(5,1)"
ten to spoji takze vnikne slovo "__2(5,1)" ktere se aktivuje
a __2 vypise druhy parametr.
Kód:
dnl # Fail with multiline...
define({__BOXING},{regexp({$@},{^\(.\)\(.*\)\(.\)$},{\1\1\2\3\3})}){}dnl
define({__UNBOXING},$*){}dnl
dnl
define({__ALL},$@){}dnl
define({__1},{$1}){}dnl
define({__2},{$2}){}dnl
define({__3},{$3}){}dnl
define({__SPOJ},{$1$2}){}dnl
dnl
define({__GET_TOKEN_NAME}, {defn({__TOKEN[$1].NAME})}){}dnl # __TOKEN_PUSH2
define({__GET_TOKEN_INFO}, {defn({__TOKEN[$1].INFO})}){}dnl # {1 2}
define({__GET_TOKEN_PARAM}, {defn({__TOKEN[$1].PARAM})}){}dnl # (1,2)
dnl # Fail with multiline...
define({__GET_TOKEN_ARRAY}, {regexp(defn({__TOKEN[$1].PARAM}),{^(\(.*\))$},{\1})}){}dnl
define({__GET_TOKEN_ARRAY_1},{regexp(defn({__TOKEN[$1].PARAM}),{^(\([^,]*\)[,)]},{\1})}){}dnl
define({__GET_TOKEN_ARRAY_2},{regexp(defn({__TOKEN[$1].PARAM}),{^([^,]*,\([^,]*\)[,)]},{\1})}){}dnl
define({__GET_TOKEN_ARRAY_3},{regexp(defn({__TOKEN[$1].PARAM}),{^([^,]*,[^,]*,\([^,]*\)[,)]},{\1})}){}dnl
dnl # Work with multiline
define({__GET_TOKEN_ARRAY},{__SPOJ({__ALL},defn({__TOKEN[$1].PARAM}))}){}dnl
define({__GET_TOKEN_ARRAY_1},{__SPOJ({__1},defn({__TOKEN[$1].PARAM}))}){}dnl
define({__GET_TOKEN_ARRAY_2},{__SPOJ({__2},defn({__TOKEN[$1].PARAM}))}){}dnl
define({__GET_TOKEN_ARRAY_3},{__SPOJ({__3},defn({__TOKEN[$1].PARAM}))}){}dnl
Postupny zkousenim
{{$@}}
{$@}
$@
{{$*}}
{$*}
$*
u PRINT, STRING, __ASM atd jsem se dostal do stavu kdy vse zase bezi jak ma.
Chtelo to jeste upravit __IS_NUM funkci kdy to ma spravne vratit ze to neni cislo i kdyz tam neni zadne pismeno ale vstup je >>{1,2}<< coz je bohuzel jednorozmerny vstup, pripadne >>"1"<<. A dalsi pomocne funkce.
Jinak multiline vstup jsem nikdy neresil, protoze to nejde udelat z prikazoveho radku. PRINT to napriklad stale nezvladne, musi se pouzit PRINT({"prvni radek", 0x0D, "druhy radek"}). Protoze tam se taky pouzivaji regexpy a navic to skonci na tom ze to generuje
db "prvni radek", 0x0D, "druhy radek"
PS: Pri tom testovani me dostala dalsi chyba kdy v prikazovem radku bashe se chova \1 jinak nez kdyz to mam v souboru. Proste me porad neco nefungovalo, nastesti jsem vedel co me nefunguje. Procital jsem net co delam spatne s tim regularnim vyrazem a stale nic. A v kodu me pouziti \1 fungovalo. Tak jsem napsal uplne stejny kod a... nic. \number proste nevypisoval co mel mit ulozeny pres \(nejaky_match\).
Tak jsem nakonec zkusil jestli to neni tim zpetnym lomitkem... a taky ze jo. \\1 uz fungovalo v prikazovem radku. Ostatni specialni znaky to nemenilo, takze ten regularni vyraz delal co ma jen misto vypisu vse mazal.
PPS: Ted jde pouzit pomoci __ASM ty puvodni prepinace. Proste se napisi dovnitr. Viz
Kód:
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh 'define({_TYP_SINGLE},{small}) _4OVER define({_TYP_SINGLE},{})'
;[24:167] 4over ( d4 d3 d2 d1 -- d4 d3 d2 d1 d4 d3 ) # default version can be changed with "define({_TYP_SINGLE},{small})"
push DE ; 1:11 4over h g f e d c b . . . b a
push HL ; 1:11 4over h g f e d c b a . . b a
ld HL, 0x000F ; 3:10 4over h g f e d c b a . . b 15
add HL, SP ; 1:11 4over h g f e d c b a . . b -
ld D,(HL) ; 1:7 4over h g f e d c b a . . - -
dec HL ; 1:6 4over h g f e d c b a . . - -
ld E,(HL) ; 1:7 4over h g f e d c b a . . h -
dec HL ; 1:6 4over h g f e d c b a . . h -
push DE ; 1:11 4over h g f e d c b a h . h -
ld D,(HL) ; 1:7 4over h g f e d c b a h . - -
dec HL ; 1:6 4over h g f e d c b a h . - -
ld E,(HL) ; 1:7 4over h g f e d c b a h . g -
dec HL ; 1:6 4over h g f e d c b a h . g -
push DE ; 1:11 4over h g f e d c b a h g g -
ld D,(HL) ; 1:7 4over h g f e d c b a h g - -
dec HL ; 1:6 4over h g f e d c b a h g - -
ld E,(HL) ; 1:7 4over h g f e d c b a h g f -
dec HL ; 1:6 4over h g f e d c b a h g f -
ld A,(HL) ; 1:7 4over h g f e d c b a h g f -
dec HL ; 1:6 4over h g f e d c b a h g f -
ld L,(HL) ; 1:7 4over h g f e d c b a h g f -
ld H, A ; 1:4 4over h g f e d c b a h g f e
;[24:167]
dworkin@dw-A15:~/Programovani/ZX/Forth/M4$ ../check_word.sh '__ASM({define({_TYP_SINGLE},{small})}) _4OVER __ASM({define({_TYP_SINGLE},{})})'
;[19:212] 4over ( d4 d3 d2 d1 -- d4 d3 d2 d1 d4 d3 ) # small version can be changed with "define({_TYP_SINGLE},{default})"
ex DE, HL ; 1:4 4over h g f e d c . . . . a b
push HL ; 1:11 4over h g f e d c b . . . a b
ld HL, 0x000D ; 3:10 4over h g f e d c b . . . a 13
add HL, SP ; 1:11 4over h g f e d c b . . . a -
ld B, 0x03 ; 2:7 4over h g f e d c b . . . a -
push DE ; 1:11 4over h g f e d c b(a-h-g)f -
ld D,(HL) ; 1:7 4over h g f e d c b(a-h-g)f -
dec HL ; 1:6 4over h g f e d c b(a-h-g)f -
ld E,(HL) ; 1:7 4over h g f e d c b(a-h-g)f -
dec HL ; 1:6 4over h g f e d c b(a-h-g)f -
djnz $-5 ; 2:8/13 4over h g f e d c b(a-h-g)f -
ld A,(HL) ; 1:7 4over h g f e d c b a h g f -
dec HL ; 1:6 4over h g f e d c b a h g f -
ld L,(HL) ; 1:7 4over h g f e d c b a h g f -
ld H, A ; 1:4 4over h g f e d c b a h g f e
;[19:112]