Mix
Random mix of pages and files
FORTH_etc
2025.04.14 23:42:09 end SW FORTH Gilhad

FORTH_etc

Tady budou různé dodatky a prográmky a tak dál

Píšu si implementaci FORTH pro AVR, kde je nedostatek RAM, ale relativně dost FLASH paměti, proto chci mít co nejvíc věcí v programové paměti. Už jsem napsal dost primitiv na to, abych mohl další slova psát přímo ve FORTHu, ale z výše uvedeného důvodu je potřebuju převést do formy dat. V projektu mám pro tyto účely soubor asm.S, kde jsou uloženy hlavičky všech stávajících slov pomocí maker

.macro DEFWORD  lbl, attr, name, codeword // následuje dlouhá definice plná .byte a .long
.macro DEFVAR name // DEFWORD var_\name,0,"\name",push_var_\name
.macro DEFCONST name    // DEFWORD const_\name,0,"\name",push_const_\name
.macro DEFCONST1 name, value    // DEFWORD const_\name,0,"\name",f_doconst
.macro DEFCONST2 name, value    // DEFWORD const_\name,0,"\name",f_doconst2

Moje představa je, že bych do tohoto souboru dal ke konci #include "words.inc", ve kterém by byly další definice pomocí těchto maker a který by byl automaticky generovaný ze souboru words.4th, který by obsahoval definice nových slov ve FORTHu.

Chtěl bych, abys mi pomohl napsat program v pythonu, který by tento převod dělal.

Ten program by měl:

  • číst argumenty z příkazové řádky pomocí standardní knihovny a rozparsovat je (protože časem budu přidávat víc možností)
    • kromě přepínačů (-h help, -v verbose -c --col=40 a dalších) na příkazové řádce můžou být i jména souborů, pokud by měly být jiné než defaultní
    • první je words.4th - zdrojový kód ve FORTHu
    • další je asm.S - definice známých jmen pomocí maker
    • další je words.inc - výsledný soubor
  • přečíst soubor asm.S (nebo soubor daný argumenty) a zapamatovat si jména tam nadefinovaných slov (name) a jejich návěstí (lbl) - pro konstanty a proměnné si je odvodit (ostatní věci z něj ignorovat)
  • (pře)číst soubor words.4th a generovat z něj words.inc
    • words.4th obsahuje kód a komentáře ve FORTHu a do výsledného souboru bude každý řádek uložený od pozice col=40 za dvěma lomítky // jako komentář
    • komentář ve FOTHu začíná obráceným lomítkem a pokračuje do konce řádku, nebo začíná otevírací kulatou závorkou a končí zavírací kulatou závorkou (a tyto jdou do sebe vnořovat)
    • kód ve FORTHu jsou jednotlivá slova oddělená whitespace (mezerníky, taby, novými řádky a komentáři v libovolném počtu), nebo řetězce začínající znaky tečka-uvozovky ." a končící znakem uvozovky " (oboje obklopeno whitespace) - takový řetězec může obsahovat cokoli a překládá se na kód .asciiz a příslušný řetězec
    • slovo dvojtečka : znamená definici nového slova, po něm následující slovo je nově definovaným slovem. Pokud je na témže řádku komentář obsahující uvozovky, tak nick slova je obsah uvozovek, jinak nick slova je to nové slovo - toto se překládá na
DEFWORD w_\nick, 0, "nové slovo", f_docol

všechna následující slova se pak hledají ve slovníku a překládají se jako

.long w_\nick_cw

nebo, pokud se nenajdou, tak se považují za čísla a překládají jako

.long číslo

až do slova středník ; , které se překládá jako

.long w_exit_cw

a definice jím končí

Příklad:

asm.S obsahuje

DEFWORD w_dup, 0, "DUP", f_dup
DEFWORD w_plus,0, "+", f_plus

words.4th obsahuje

: DOUBLE DUP + ; ( "double" )

a přeloží se jako

DEFWORD w_double, 0, "DOUBLE", f_docol                // : DOUBLE DUP + ; ( "double" )
.long w_dup_cw
.long w_plus_cw
.long w_exit_cw