/// imported
#include "../_sdk/typecode.h"
#include "../_sdk/str.h"
#include "../_sdk/io.h"
#include "../_sdk/emit.h"
CONST BYTE _typesz
[32];
#ifdef TARGET_THUMB
#include "sizesarm.h"
#else
#ifdef TARGET_SCRIPT
#include "sizesspt.h"
#else
#ifdef TARGET_386
#include "sizes386.h"
#else
#include "sizesz80.h"
#endif
#endif
#endif
CONST BOOL _isalphanum
[256];
EXTERN BOOL _doskip
; //яЁюяєёърЄ№ ёЄЁюъш, ъЁюьх эрўшэр■∙шїё ё #
EXTERN PCHAR _tword
; //Єхъє∙хх ёыютю
EXTERN UINT _lentword
;
VAR PCHAR _prefix
; //яЁхЇшъё Єхъє∙хую ёыютр (юёЄрЄюъ - т _tword)
VAR UINT _lenprefix
;
VAR PCHAR _title
; //эрчтрэшх Єхъє∙хщ яЁюЎхфєЁ√ (ё єў╕Єюь ьюфєы )
VAR UINT _lentitle
;
EXTERN PCHAR _callee
; //эрчтрэшх т√ч√трхьющ яЁюЎхфєЁ√ (ё єў╕Єюь ьюфєы )
EXTERN UINT _lencallee
;
EXTERN PCHAR _name
; //ьхЄър схч яЁхЇшъёр (фы ЄрсышЎ√ ьхЄюъ)
EXTERN UINT _lenname
;
EXTERN PCHAR _joined
; //ртЄюьхЄър
EXTERN UINT _lenjoined
;
VAR PCHAR _ncells
; //т addlbl эхы№ч юс·хфшэшЄ№ ncells ё callee //Єрь цх тЁхьхээю яЁю°ыр ьхЄър фы enum
VAR UINT _lenncells
;
VAR CHAR _s1
[_STRLEN
]; //яЁхЇшъё Єхъє∙хую ёыютр (юёЄрЄюъ - т _tword)
VAR CHAR _s2
[_STRLEN
]; //эрчтрэшх Єхъє∙хщ яЁюЎхфєЁ√ (ё єў╕Єюь ьюфєы )
VAR CHAR _s3
[_STRLEN
]; //эрчтрэшх т√ч√трхьющ яЁюЎхфєЁ√ (ё єў╕Єюь ьюфєы )
VAR CHAR _s4
[_STRLEN
]; //ьхЄър схч яЁхЇшъёр (фы ЄрсышЎ√ ьхЄюъ)
VAR CHAR _s5
[_STRLEN
]; //ртЄюьхЄър
VAR CHAR _s6
[_STRLEN
]; //ўшёыю ¤ыхьхэЄют
EXTERN CHAR _cnext
;
EXTERN UINT _spcsize
; //ўшёыю яЁюсхыют яюёых яЁюўшЄрээющ ъюьрэф√
EXTERN UINT _curline
; //Єхъє∙шщ эюьхЁ ёЄЁюъш
EXTERN UINT _waseols
; //ёъюы№ъю с√ыю EOL ё яЁю°ыюую Ёрчр
EXTERN UINT _typeaddr
;
PROC rdch FORWARD
();
PROC rdchcmt FORWARD
();
PROC rdquotes FORWARD
(CHAR eol
);
PROC rdaddword FORWARD
();
PROC rdword FORWARD
();
PROC initrd FORWARD
();
PROC strpush FORWARD
(PCHAR s
, UINT len
); //joined шыш callee
FUNC UINT strpop FORWARD
(PCHAR s
);
EXTERN UINT _lenstrstk
;
PROC initlblbuf FORWARD
();
//math (схч ьр°шээюую ъюфр)
PROC cmdneg FORWARD
();
PROC cmdinv FORWARD
();
PROC cmdpoke FORWARD
();
PROC cmdpeek FORWARD
();
PROC cmdpushvar FORWARD
();
PROC cmdpopvar FORWARD
();
PROC cmdpushnum FORWARD
();
PROC cmdmul FORWARD
();
PROC cmddiv FORWARD
();
PROC cmdshl FORWARD
();
PROC cmdshr FORWARD
();
PROC cmdadd FORWARD
();
PROC cmdsub FORWARD
();
PROC cmdaddpoi FORWARD
(); //ёфтшурхЄ ёююЄтхЄёЄтхээю Єшяє ш яЁшсрты хЄ
PROC cmdand FORWARD
();
PROC cmdor FORWARD
();
PROC cmdxor FORWARD
();
PROC cmdinc FORWARD
();
PROC cmddec FORWARD
();
PROC cmdincbyaddr FORWARD
();
PROC cmddecbyaddr FORWARD
();
//ёЁртэхэш (схч ьр°шээюую ъюфр)
PROC cmdless FORWARD
();
PROC cmdmore FORWARD
();
PROC cmdlesseq FORWARD
();
PROC cmdmoreeq FORWARD
();
PROC cmdeq FORWARD
();
PROC cmdnoteq FORWARD
();
//ухэхЁрЎш т√чютют ш яхЁхїюфют (схч ьр°шээюую ъюфр)
PROC cmdjpval FORWARD
();
PROC cmdcallval FORWARD
();
PROC cmdjp FORWARD
();
PROC cmdjpiffalse FORWARD
();
PROC cmdcall FORWARD
();
PROC cmdfunc FORWARD
();
PROC cmdpushpar FORWARD
(); //фы ЁхъєЁёштэ√ї яЁюЎхфєЁ (ёюїЁрэхэшх ярЁрьхЄЁют тэєЄЁш шыш ёэрЁєцш)
PROC cmdstorergs FORWARD
(); //яюёых ёюїЁрэхэш ыюъры№эющ яхЁхьхээющ ЁхъєЁёштэющ яЁюЎхфєЁ√
PROC cmdpoppar FORWARD
(); //фы ЁхъєЁёштэ√ї яЁюЎхфєЁ (тюёёЄрэютыхэшх ярЁрьхЄЁют тэєЄЁш шыш ёэрЁєцш)
PROC cmdresult FORWARD
();
PROC cmdret FORWARD
(BOOL isfunc
); //тюёёЄрэютыхэшх Ёхчєы№ЄрЄр яюёых ёэ Єш ыюърыют ёю ёЄхър ш т√їюф
PROC cmdcastto FORWARD
(TYPE t2
);
PROC cmdlabel FORWARD
();
PROC var_alignwsz_label FORWARD
(TYPE t
);
PROC var_def FORWARD
(TYPE t
, PCHAR s
);
PROC initcmd FORWARD
();
PROC initcode FORWARD
();
PROC endcode FORWARD
();
PROC emitasmlabel FORWARD
(PCHAR s
);
PROC emitfunclabel FORWARD
(PCHAR s
);
PROC emitvarlabel FORWARD
(PCHAR s
);
PROC emitexport FORWARD
(PCHAR s
);
PROC emitvarpreequ FORWARD
(PCHAR s
);
PROC emitvarpostequ FORWARD
();
PROC varequ FORWARD
(PCHAR s
);
PROC asm_db FORWARD
(); //ъюёЄ√ы№ фы ъюэёЄрэЄэ√ї ьрёёштют ёЄЁюъ TODO
PROC var_db FORWARD
();
PROC var_dw FORWARD
();
PROC var_ds FORWARD
();
FUNC UINT varshift FORWARD
(UINT shift
, UINT sz
);
FUNC UINT gettypename FORWARD
(PCHAR s
); //тч Є№ эрчтрэшх Єшяр ёЄЁєъЄєЁ√ т s (ёЁрчє яюёых lbltype)
PROC setvarsz FORWARD
(UINT addr
, UINT shift
);
FUNC TYPE lbltype FORWARD
(); //тхЁэєЄ№ Єшя ьхЄъш _name
PROC dellbl FORWARD
(); //єфрышЄ№ ьхЄъє _name
PROC addlbl FORWARD
(TYPE t
, BOOL isloc
, UINT varsz
/**, PCHAR size, UINT lensize*/); //(_name)
PROC keepvars FORWARD
(); //яхЁхф эрўрыюь ыюъры№э√ї ьхЄюъ
PROC undovars FORWARD
(); //яюёых ыюъры№э√ї ьхЄюъ (чрс√Є№ шї)
EXTERN UINT _varszaddr
;
EXTERN UINT _varsz
;
EXTERN BYTE _exprlvl
; //уыєсшэр т√Ёрцхэш (тхЁїэшщ єЁютхэ№ == 1)
EXTERN TYPE _t
; //Єхъє∙шщ Єшя
EXTERN BOOL _isloc
; //ыюъры№эр ыш яЁюўшЄрээр яхЁхьхээр
////
CONST UINT _MAXPARS
= 16; /**ьръёшьры№эюх ўшёыю ярЁрьхЄЁют т т√чютх ЇєэъЎшш*/
//todo юуЁрэшўшЄ№ уыєсшэє ЁхъєЁёшш f(g(h(...()...)
//ёюёЄю эшх ъюьяшы ЄюЁр (яы■ё х∙╕ ёюёЄю эш commands ш codetg):
VAR UINT _curlbl
; //эюьхЁ ртЄюьхЄъш
VAR UINT _tmpendlbl
; //эюьхЁ ртЄюьхЄъш фы т√їюфр шч Ўшъыр while/repeat
VAR BYTE _namespclvl
; //уыєсшэр тыюцхээюёЄш яЁюёЄЁрэёЄтр шь╕э (ўшёыю Єюўхъ т яЁхЇшъёх)
VAR BOOL _isrecursive
; //Єхъє∙р юс· ты хьр яЁюЎхфєЁр ЁхъєЁёштэр
VAR BOOL _wasreturn
; //с√ыр ъюьрэфр return (яюёых эх╕ эхы№ч ъюьрэф√ т ЁхъєЁёштэющ ЇєэъЎшш) //ёюїЁрэ ■Єё т func
VAR TYPE _curfunct
; //Єшя ЇєэъЎшш (фы return) //ёюїЁрэ ■Єё т func
VAR BOOL _isexp
; //Єхъє∙р юс· ты хьр яхЁхьхээр , ъюэёЄрэЄэ√щ ьрёёшт/ёЄЁєъЄєЁр, яЁюЎхфєЁр/ЇєэъЎш ¤ъёяюЁЄшЁєхЄё (эю эх ъюэёЄрэЄр, Є.ъ. ¤Єю эх рфЁхё ш эх эєцэю)
VAR CHAR _c0
;
VAR CHAR _c2
;
VAR UINT _parnum
;
VAR UINT _doskipcond
;
//_doskipcond т сшЄютюь тшфх яюьэшЄ, ёъюы№ъю єЁютэхщ ръЄштэ√ї ifdef ш ёъюы№ъю єЁютэхщ эхръЄштэ√ї (ъЁюьх Єхъє∙хую)
//(тэєЄЁш эхръЄштэюую ьюуєЄ с√Є№ Єюы№ъю эхръЄштэ√х)
//хёыш (_doskipcond&1) == 0 (Є.х. ь√ т эхръЄштэющ тхЄъх), Єю Єхъє∙шщ ifdef шуэюЁшЁєхЄё ёю тёхьш тїюф ∙шьш (Є.х. else эх ЁрсюЄрхЄ)
//эхръЄштэюёЄ№ Єхъє∙хщ тхЄъш ifdef ыхцшЄ т _doskip
//эр тхЁїэхь єЁютэх _doskipcond = 1, _doskip = +FALSE
VAR BOOL _morecmd
; //Їыру "сыюъ эх юъюэўхэ" т eatcmd
VAR CHAR _opsym
;
VAR BOOL _addrexpr
; //т√Ёрцхэшх ё & фы &(<structname>-><field>) (TODO тыюцхээю?)
#define _MAXHINCLUDES 0x08
VAR PBYTE _hinclfile
[_MAXHINCLUDES
];
VAR UINT _hnline
[_MAXHINCLUDES
];
VAR BYTE _nhinclfiles
; //ўшёыю юЄъЁ√Є√ї Їрщыют
//
#ifdef USE_HINTS
;;PROC hint_tword
() {
;; hintstr
("//_tword=\""); hintstr
(_tword
); hintstr
("\", cnext=\""); hint
(_cnext
); hint
('\"'); endhint
();
;;}
#endif
PROC err_tword
(PCHAR s
)
{
errstr
(s
); errstr
(" expected, but we have \'"); errstr
(_tword
); err
('\''); enderr
();
}
PROC doexp
() //тёхуфр _joined
{
IF
(_isexp
) emitexport
(_joined
);
}
PROC eat
(CHAR c
)
{
IF
(*(PCHAR
)_tword
!=c
) {
err
(c
); errstr
(" expected, but we have \'"); errstr
(_tword
); err
('\''); enderr
();
};
rdword
();
}
PROC jdot
()
{
_lenjoined
= stradd
(_joined
, _lenjoined
,'.');
_joined
[_lenjoined
] = '\0';
}
VAR UINT _genn
;
PROC gendig
(UINT d
)
{
VAR BYTE dig
;
dig
= (BYTE
)'A';
WHILE
(_genn
>= d
) {
_genn
= _genn
- d
;
INC dig
;
_wasdig
= +TRUE
;
};
IF
(_wasdig
) {
_lenjoined
= stradd
(_joined
, _lenjoined
, (CHAR
)dig
);
};
}
PROC jautonum
(UINT n
)
{
_genn
= n
;
_wasdig
= +TRUE
;
IF
(n
!= 0) {
_wasdig
= +FALSE
;
gendig
(676);
gendig
(26);
};
gendig
(1);
jdot
();
}
PROC genjplbl
(UINT n
)
{
_lenjoined
= strcopy
(_title
, _lentitle
, _joined
);
jautonum
(n
);
}
PROC jtitletword
()
{
_lenjoined
= strcopy
(_title
, _lentitle
, _joined
);
_lenjoined
= strjoin
(/**to=*/_joined
, _lenjoined
, _tword
);
_joined
[_lenjoined
] = '\0';
}
PROC do_type
()
{
loop
:
_lenname
= strcopy
(_tword
, _lentword
, _name
);
_t
= lbltype
();
IF
((_t
&_T_TYPE
)!=(TYPE
)0x00) { //хёыш ¤Єю эх яхЁхьхээр , р Єшя
IF
(_t
== (_T_TYPE
+_T_STRUCTWORD
)) {
rdword
(); //use STRUCT
goto loop
;
};
IF
(_cnext
== '*') {
_t
= _t
|_T_POI
;
_varsz
= (UINT
)_SZ_REG
;
rdword
(); //use *
};
};
}
PROC eattype
()
{
do_type
();
_t
= _t
&~_T_TYPE
;
rdword
();
}
PROC doprefix
(BYTE nb
) //ёъыхшЄ№ n ёыют Єшяр 'word.' шч title т prefix (name схч яЁхЇшъёр)
{
_lenprefix
= 0;
WHILE
(nb
> 0x00) { //яхЁхсшЁрхь ёыютр
_lenprefix
= strjoineol
(/**to=*/_prefix
, _lenprefix
, &_title
[_lenprefix
], '.');
_lenprefix
= stradd
(_prefix
, _lenprefix
, '.');
DEC nb
;
};
_prefix
[_lenprefix
] = '\0';
_lenjoined
= strcopy
(_prefix
, _lenprefix
, _joined
);
_lenjoined
= strjoin
(/**to=*/_joined
, _lenjoined
, _tword
/**, _lentword*/);
_joined
[_lenjoined
] = '\0';
}
PROC adddots
()
{
/** WHILE (_cnext == '.') {
rdaddword(); //яЁшъыхшЄ№ Єюўъє
rdaddword(); //яЁшъыхшЄ№ ёыхфє■∙хх ёыютю
};*/
}
PROC twordtojoined
()
{
_lenjoined
= strcopy
(_tword
, _lentword
, _joined
);
}
PROC joinvarname
(BOOL iscall
) //тючтЁр∙рхЄ _t = Єшя(_name)???
{ //шфхэЄшЇшърЄюЁ єцх яЁюўшЄрэ
VAR BYTE lvl
;
do_type
();
IF
(!_isloc
) {
twordtojoined
();
}ELSE
{
lvl
= _namespclvl
;
IF
(iscall
&& (lvl
!= 0x00)) {
DEC lvl
; //proc()
};
doprefix
(lvl
); //ёъыхшЄ№ n ёыют Єшяр 'word.' шч title т prefix (name схч яЁхЇшъёр)
//todo яЁютхЁшЄ№ ш ¤ЄюЄ Єшя (фы ьюфєы№эюёЄш)?
//шыш todo яЁхтЁрЄшЄ№ stru1->f1.f2 т tstru1.f1+tstru2.f2
};
}
PROC eatvarname
() //фы ёючфрэш ьхЄюъ
{
eattype
(); //t = _t; //Єшя с√ы єцх яЁюўшЄрэ
adddots
();
_lenname
= strcopy
(_tword
, _lentword
, _name
);
doprefix
(_namespclvl
); //ёъыхшЄ№ n ёыют Єшяр 'word.' шч title т prefix (name схч яЁхЇшъёр)
rdword
(); //'['
IF
(*(PCHAR
)_tword
== '[') {
_t
= _t
|_T_ARRAY
;
};
}
PROC getstructfield
() //тючтЁр∙рхЄ _t = Єшя яюы
{ //ёЄЁєъЄєЁр єцх яЁюўшЄрэр ш рфЁхёютрэр _typeaddr (т lbltype шыш addlbl), Єшя _t = эхъшщ єърчрЄхы№???
_lenjoined
= gettypename
(_joined
); //тч Є№ эрчтрэшх Єшяр ёЄЁєъЄєЁ√ т joined
eat
('>'); //use '>'
jdot
();
_lenjoined
= strjoin
(/**to=*/_joined
, _lenjoined
, _tword
); //structname.structfield
_joined
[_lenjoined
] = '\0';
cmdpushnum
(); //structname.structfield
cmdadd
();
_lenname
= strcopy
(/**from=*/_joined
, _lenjoined
, _name
); //structname.structfield
_t
= lbltype
(); //(_name)
}
//////////////////////////////////////////
// compiler
//call т√ч√трхЄ _tword ш expr
PROC eatexpr RECURSIVE FORWARD
(); //т√ч√трхЄ call
FUNC BOOL eatcmd RECURSIVE FORWARD
(); //т√ч√трхЄ call
FUNC TYPE do_call RECURSIVE FORWARD
(BOOL isfunc
); //тючтЁр∙рхЄ Єшя ЇєэъЎшш
PROC compfile RECURSIVE FORWARD
(PCHAR fn
);
PROC varstrz
() //фы ёЄЁюъют√ї ъюэёЄрэЄ т т√Ёрцхэш ї
{
emitvarlabel
(_joined
);
WHILE
(+TRUE
) {
rdquotes
('\"');
rdch
(); //фюсрты хь чръЁ√тр■∙є■ ърт√ўъє
_tword
[_lentword
] = '\0';
var_db
(); varstr
(_tword
); endvar
();
IF
(_cnext
!= '\"') BREAK
;
rdword
(); //юЄъЁ√тр■∙р ърт√ўър яЁшъыххээющ ёЄЁюъш
};
var_db
(); varc
('0'); endvar
();
}
PROC asmstrz
() //тёх CONST ёЄЁюъш ЄхяхЁ№ т ъюфх (Ёрэ№°х с√ыю Єюы№ъю фы ъюэёЄрэЄэ√ї ьрёёштют ёЄЁюъ)
{
emitasmlabel
(_joined
);
WHILE
(+TRUE
) {
rdquotes
('\"');
rdch
(); //фюсрты хь чръЁ√тр■∙є■ ърт√ўъє
_tword
[_lentword
] = '\0';
asm_db
(); asmstr
(_tword
); endasm
();
IF
(_cnext
!= '\"') BREAK
;
rdword
(); //юЄъЁ√тр■∙р ърт√ўър яЁшъыххээющ ёЄЁюъш
};
asm_db
(); asmc
('0'); endasm
();
}
PROC eatidx
() //фы idxarray ш switch
{
INC _exprlvl
; //no jump optimization
eatexpr
(); //ёЁртэхэш эхы№ч схч ёъюсюъ!!!
DEC _exprlvl
;
IF
(_t
==_T_BYTE
) cmdcastto
(_T_UINT
);
IF
(_t
!=_T_UINT
) {errstr
("idx bad type "); erruint
((UINT
)_t
); enderr
(); };
}
FUNC TYPE idxarray RECURSIVE
(TYPE t
)
{
rdword
(); //яхЁтюх ёыютю expr
IF
((t
&_T_ARRAY
) != (TYPE
)0x00) { //ьрёёшт
t
= t
&_TYPEMASK
; //&(~(_T_ARRAY|_T_CONST)); //ьюцхЄ с√Є№ _T_POI (хёыш ьрёёшт ёЄЁюъ)
_t
= _T_POI
|_T_BYTE
; cmdpushnum
(); //шёяюы№чютрэшх юс√ўэюую ьрёёштр - схЁ╕ь хую рфЁхё
}ELSE IF
((t
&_T_POI
) != (TYPE
)0x00) { //єърчрЄхы№
_t
= t
; cmdpushvar
(); //шёяюы№чютрэшх єърчрЄхы т ърўхёЄтх ьрёёштр - ўшЄрхь хую чэрўхэшх
t
= t
&(~_T_POI
);
}ELSE
{errstr
("[] not in array "); erruint
((UINT
)t
); enderr
(); };
eatidx
();
_t
= t
; //Єшя ¤ыхьхэЄр ьрёёштр
cmdaddpoi
();
RETURN t
; //Єшя ¤ыхьхэЄр ьрёёштр
}
PROC numtype
()
{
IF
(_cnext
== '.') { //фЁюсэюх ўшёыю (эхы№ч эрўшэрЄ№ ё Єюўъш шыш чрърэўштрЄ№ Єюўъющ)
rdaddword
(); //яЁшъыхшЄ№ Єюўъє
rdaddword
(); //яЁшъыхшЄ№ фЁюсэє■ ўрёЄ№
IF
( (_tword
[_lentword
-1]=='e') && (_cnext
=='-') ) {
rdaddword
(); //яЁшъыхшЄ№ '-' юЄЁшЎрЄхы№эющ ¤ъёяюэхэЄ√
rdaddword
(); //яЁшъыхшЄ№ юЄЁшЎрЄхы№эє■ ¤ъёяюэхэЄє
};
_t
= _T_FLOAT
;
}ELSE IF
(*(PCHAR
)_tword
== '-') { //т val єцх хёЄ№, эрфю фы define
_t
= _T_INT
;
}ELSE IF
(_tword
[_lentword
-1]=='L') {
_t
= _T_LONG
;
}ELSE IF
((BYTE
)_tword
[1] > (BYTE
)'9') { //єёъюЁхэшх яЁютхЁъш ўшёыютюую ЇюЁьрЄр
IF
((_lentword
<=4)&&(_tword
[1]=='x')) {
_t
= _T_BYTE
;
}ELSE IF
((_lentword
<=10)&&(_tword
[1]=='b')) {
_t
= _T_BYTE
;
}ELSE
{
_t
= _T_UINT
;
};
}ELSE
{
_t
= _T_UINT
;
};
}
PROC val RECURSIVE
()
{
VAR TYPE t
; //фы cast,peek
VAR UINT typeaddr
; //фы cast
{
//<val>::=
//(<expr>) //т√Ёрцхэшх (т√ўшёы хЄё )
//|<num> //фхё Єшўэюх ўшёыю (яхЁхфр╕Єё Ўхышъюь) INT/UINT/LONG
//|<num>.<num>[e-<num>] //float ўшёыю (яхЁхфр╕Єё Ўхышъюь)
//|<var> //яхЁхьхээр
//|'CHAR' //ёшьтюы№эр ъюэёЄрэЄр (яхЁхфр╕Єё Ўхышъюь)
//|"str" //ёЄЁюъютр ъюэёЄрэЄр (яхЁхфр╕Єё Ўхышъюь)
//|(<type>)<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ яхЁхтюф т <type>
//|+<boolconst>
//|+_<enumconst> BYTE
//|+(constexpr) //Єшя яю ыхтюьє ъюэЄхъёЄє
//|<lbl>([<val>,...]) //call
//|-<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ NEG
//|~<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ INV
//|!<val> //т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ INV(BOOL)
//|*(<ptype>)<val> //яЁюўшЄрЄ№ ярь Є№ яю рфЁхёє (т√ўшёышЄ№ val, яюЄюь ёфхырЄ№ PEEK)
//|&<var> //рфЁхё яхЁхьхээющ
//ъюьрэфр єцх яЁюўшЄрэр
#ifdef USE_HINTS
;; hintstr
("//val: word=\""); hintstr
(_tword
); hintstr
("\", cnext=\""); hint
(_cnext
); hint
('\"'); endhint
();
#endif
_opsym
= *(PCHAR
)_tword
;
IF
(_opsym
== '~') {
rdword
(); //яхЁтюх ёыютю val
IF
(!_waseof
) val
(); //ЁхъєЁёштэ√щ т√чют val
cmdinv
();
}ELSE IF
((BYTE
)_opsym
>= 0x41) { //<var>
adddots
();
//хёыш т√чют ЇєэъЎшш, Єю do_variable эрфю фхырЄ№ ё namespclvl-1!!!
IF
(_cnext
== '(') { //call
_t
= do_call
(+TRUE
); //isfunc
}ELSE
{
joinvarname
(+FALSE
); //iscall
IF
(_cnext
== '[') { //<varname>[<idx>]
rdword
();
_t
= idxarray
(_t
);
cmdpeek
();
}ELSE
{ //<varname>
IF
((_t
&_T_TYPE
)==(TYPE
)0x00) {
/**IF (_t==_T_STRUCT) {
_t = _T_POI|_T_BYTE;
cmdpushnum(); //схЁ╕ь рфЁхё ёЄЁєъЄєЁ√ (фы .)
}ELSE*/ IF
((_t
&_T_ARRAY
)!=(TYPE
)0x00) { //array without [] as a pointer
_t
= _t
&(~
(_T_ARRAY
|_T_CONST
))|_T_POI
;
cmdpushnum
(); //шёяюы№чютрэшх юс√ўэюую ьрёёштр - схЁ╕ь хую рфЁхё
}ELSE IF
((_t
&_T_CONST
)==(TYPE
)0x00) {
cmdpushvar
(); //єърчрЄхы№ (т Єюь ўшёых эр ёЄЁєъЄєЁє) шыш юс√ўэр яхЁхьхээр
}ELSE
{ //ъюэёЄрэЄр (equ)
_t
= _t
&_TYPEMASK
; //&(~_T_CONST);
cmdpushnum
();
};
};
};
};
}ELSE IF
(_opsym
== '\'') {
rdquotes
('\'');
rdch
(); //фюсрты хь чръЁ√тр■∙є■ ърт√ўъє
_tword
[_lentword
] = '\0';
twordtojoined
();
_t
= _T_CHAR
; cmdpushnum
();
}ELSE IF
(_opsym
== '\"') {
_lenjoined
= strcopy
(_title
, _lentitle
, _joined
);
jautonum
(_curlbl
);
INC _curlbl
;
_t
= _T_POI
|_T_CHAR
; cmdpushnum
();
varstrz
(); //ё ьхЄъющ joined
}ELSE IF
(_opsym
== '+') {
rdword
(); //'(' of type or +TRUE/+FALSE (BOOL) or +_CONSTANT or +__CONSTANT (BYTE)
_opsym
= *(PCHAR
)_tword
;
IF
(_opsym
=='_') { //+_CONSTANT
//эрўры№эр ўрёЄ№ шьхэш ъюэёЄрэЄ√ єцх яЁюўшЄрэр
adddots
();
joinvarname
(/**iscall*/+FALSE
);
_lenjoined
= strcopy
(_name
, _lenname
, _joined
); //уыюсры№эр
_t
= _T_BYTE
; cmdpushnum
();
}ELSE IF
((BYTE
)((BYTE
)_opsym
- (BYTE
)'0') < 0x0a) { //+num //extra BYTE for C bug
IF
(!_waseof
) val
(); //ЁхъєЁёштэ√щ т√чют val
IF
(_t
== _T_UINT
) cmdcastto
(_T_INT
); //фы чэръют√ї ъюэёЄрэЄ Єшяр +15
}ELSE IF
(_opsym
!='(') { //+TRUE/+FALSE (BOOL) //+sizeof
IF
(_opsym
=='s') { //+sizeof //TODO uppercase?
rdword
(); //шёяюы№чютрыш sizeof
eat
('('/**, "\'(\'"*/);
eattype
();
// IF ((_t&_T_TYPE)!=0x00) {
emitn
(_varsz
); //gettypesz();
_lenjoined
= strcopy
(_nbuf
, _lennbuf
, _joined
); //уыюсры№эр
// }ELSE { //эх Єшя
//- шч яхЁхьхээющ срчютюую Єшяр - сєфхЄ ю°шсър, Є.ъ. яє° чэрўхэш яхЁхьхээющ TODO (ёфхырЄ№ ёюёЄю эшх _issizeof)
//- шч яхЁхьхээющ ьрёёштр - сєфхЄ ю°шсър, Є.ъ. яє° рфЁхёр ьрёёштр TODO
//- шч яхЁхьхээющ ёЄЁєъЄєЁ√ - сєфхЄ ю°шсър, Є.ъ. яє° рфЁхёр ёЄЁєъЄєЁ√ TODO
//- шч т√Ёрцхэш - сєфхЄ ю°шсър, Є.ъ. ёухэхЁшЁє■Єё юяхЁрЎшш TODO
// };
_t
= _T_UINT
; cmdpushnum
(); //(_joined)
}ELSE
{ //+TRUE/+FALSE (BOOL)
twordtojoined
();
_t
= _T_BOOL
; cmdpushnum
(); //(_joined)
};
}ELSE
{ //'(': с√ы typecast
#ifdef USE_COMMENTS
;; cmtstr
(";+(val)"); endcmt
();
#endif
rdword
(); //(
rdquotes
(')');
twordtojoined
();
rdword
(); //)
cmdpushnum
(); //(_joined) //type from left context!!!
};
}ELSE IF
((BYTE
)((BYTE
)_opsym
- (BYTE
)'0') < 0x0a) { //num //extra BYTE for C bug
numtype
(); //_t
twordtojoined
();
cmdpushnum
();
}ELSE IF
(_opsym
== '(') {
rdword
(); //яхЁтюх ёыютю expr
eatexpr
(); //эр т√їюфх шч expr єцх яЁюўшЄрэр ')'???, эю ёыхфє■∙шщ ёшьтюы шыш ъюьрэфр эх яЁюўшЄрэ√
typeaddr
= _typeaddr
;
IF
((_t
&_T_TYPE
)!=(TYPE
)0x00) { //(type)val typecast//эхы№ч т sizeof(expr)
t
= _t
&~_T_TYPE
;
_t
= t
;
rdword
();
val
();
_typeaddr
= typeaddr
;
cmdcastto
(t
);
};
}ELSE IF
(_opsym
== '-') {
IF
((BYTE
)((BYTE
)_cnext
- (BYTE
)'0') < 0x0a) { //-<const>
rdaddword
();
//todo float
_t
= _T_INT
;
twordtojoined
();
cmdpushnum
();
}ELSE
{ //-<var>
rdword
(); //яхЁтюх ёыютю val
IF
(!_waseof
) val
(); //ЁхъєЁёштэ√щ т√чют val
cmdneg
();
};
}ELSE IF
(_opsym
== '!') {
rdword
(); //яхЁтюх ёыютю val
IF
(!_waseof
) val
(); //ЁхъєЁёштэ√щ т√чют val
cmdinv
(); //TODO invBOOL
}ELSE IF
(_opsym
== '*') {
rdword
(); //'(' of type
IF
(!_waseof
) val
(); //чфхё№ Єшя єърчрЄхы эх трцхэ //ЁхъєЁёштэ√щ т√чют val
_t
= _t
&~_T_POI
; //&~_T_CONST;
cmdpeek
();
}ELSE IF
(_opsym
== '&') {
IF
(_cnext
== '(') { //&(<structname>-><field>)
_addrexpr
= +TRUE
;
rdword
(); //'('
val
();
_t
= _t
|_T_POI
;
}ELSE
{
rdword
();
adddots
();
joinvarname
(/**iscall*/+FALSE
);
IF
(_cnext
== '[') { //&<varname>[<idx>]
rdword
(); //'['
_t
= idxarray
(_t
)/**Єшя ¤ыхьхэЄр ьрёёштр*/|_T_POI
;
}ELSE
{ //&<varname>
//IF ((_t&_T_ARRAY)!=0x00) { //&<arrayname> - error
//}ELSE IF ((_t&_T_CONST)!=0x00) { //&<constname> - error
//}ELSE { //&<varname>
_t
= _t
&_TYPEMASK
|_T_POI
;
cmdpushnum
();
//};
};
};
}ELSE
{
errstr
("WRONG PREFIX "); err
(_opsym
); enderr
();
_t
= _T_UNKNOWN
; //debug (шэрўх ьюцхЄ т√ыхЄхЄ№ чр ЄрсышЎє typesz яЁш юсЁ√тх Їрщыр)
};
#ifdef USE_HINTS
;; hinttype
("end val",_t
);
#endif
}
}
PROC eatmulval RECURSIVE
()
{
VAR CHAR opsym
;
VAR TYPE t1
;
{
//<val>[<*|/><val>...] => push[push<*|/>...]
//чрърэўштрхЄё яю ёшьтюыє ы■сющ эхюяшёрээющ юяхЁрЎшш (эряЁшьхЁ, ')' шыш ';')
//ъюьрэфр єцх яЁюўшЄрэр
#ifdef USE_HINTS
;; hintstr
("//mulval"); endhint
();
#endif
val
();
rdword
();
#ifdef USE_HINTS
;; hintstr
("//mulval after val"); hint_tword
();
#endif
REPEAT
{
opsym
= *(PCHAR
)_tword
;
IF
(opsym
!='*')
IF
(opsym
!='/')
IF
(opsym
!='&')
BREAK
;
t1
= _t
;
rdword
();
IF
(opsym
=='&')
IF
(*(PCHAR
)_tword
==opsym
)
rdword
(); //use '&' //C compatibility
val
();
_t
= _t
&_TYPEMASK
; //&(~_T_CONST);
rdword
();
#ifdef USE_HINTS
;; hintstr
("//mulval after val2"); hint_tword
();
#endif
IF
(t1
!= _t
) {errstr
("opsym "); err
(opsym
); errstr
(" type "); erruint
((UINT
)t1
); errstr
("!="); erruint
((UINT
)_t
); enderr
(); };
IF
(opsym
=='&') {cmdand
();
}ELSE IF
(opsym
=='*') {cmdmul
();
}ELSE
/**IF (opsym=='/')*/ {cmddiv
();
};
}UNTIL
(_waseof
);
#ifdef USE_HINTS
;; hinttype
("end mulval",_t
);
#endif
}
}
PROC eatsumval RECURSIVE
()
{
VAR CHAR opsym
;
VAR TYPE t1
;
{
//<mulval>[<+|-><mulval>...] => push[push<+|->...]
//ъюьрэфр єцх яЁюўшЄрэр
#ifdef USE_HINTS
;; hintstr
("//sumval"); endhint
();
#endif
eatmulval
();
REPEAT
{
opsym
= *(PCHAR
)_tword
;
IF
(opsym
!='+')
IF
(opsym
!='-')
IF
(opsym
!='|')
IF
(opsym
!='^')
BREAK
;
t1
= _t
;
rdword
();
IF
(*(PCHAR
)_tword
=='>') { //structinstancepointer->structfield
//ёЄЁєъЄєЁр єцх яЁюўшЄрэр ш рфЁхёютрэр _typeaddr, Єшя _t = эхъшщ єърчрЄхы№
IF
(_t
== _T_UNKNOWN
) {errstr
("nolbl:"); errstr
(_name
); enderr
(); };
getstructfield
(); //_t = Єшя яюы
IF
(!_addrexpr
) cmdpeek
(); //peek
rdword
(); //шёяюы№чютрыш structfield
}ELSE
{
IF
(opsym
=='|') //||(opsym=='^')
IF
(*(PCHAR
)_tword
==opsym
)
rdword
(); //use '|' or '^' //C compatibility
eatmulval
();
_t
= _t
&_TYPEMASK
; //&(~_T_CONST);
IF
(t1
!= _t
) /**&& ((t&_T_POI)!=0x00)*/ {errstr
("opsym "); err
(opsym
); errstr
(" type "); erruint
((UINT
)t1
); errstr
("!="); erruint
((UINT
)_t
); enderr
(); };
//todo addpointer
IF
(opsym
== '+') {cmdadd
();
}ELSE IF
(opsym
== '-') {cmdsub
(); //шч ёЄрЁюую т√ўхёЄ№ эютюх!
}ELSE IF
(opsym
== '|') {cmdor
();
}ELSE
/**IF (opsym == '^')*/ {cmdxor
();
};
};
}UNTIL
(_waseof
);
#ifdef USE_HINTS
;; hinttype
("end sumval",_t
);
#endif
}
}
PROC eatexpr RECURSIVE
()
{
VAR CHAR opsym
;
VAR TYPE t1
;
VAR BOOL modified
;
VAR BOOL dbl
;
{
//<sumval>[<=><sumval>...]
//ъюьрэфр єцх яЁюўшЄрэр (эєцэю фы do_call_par)
#ifdef USE_HINTS
;; hintstr
("//expr"); endhint
();
#endif
INC _exprlvl
;
eatsumval
();
REPEAT
{
opsym
= *(PCHAR
)_tword
;
IF
(opsym
!='<')
IF
(opsym
!='>')
IF
(opsym
!='=')
IF
(opsym
!='!')
BREAK
;
t1
= _t
;
rdword
();
modified
= (*(PCHAR
)_tword
=='=');
dbl
= (*(PCHAR
)_tword
==opsym
);
IF
( modified
||dbl
) rdword
(); //use '=' or '>' or '<'
eatsumval
();
_t
= _t
&_TYPEMASK
; //&(~_T_CONST);
IF
(t1
!= _t
) {errstr
("opsym "); err
(opsym
); errstr
(" type "); erruint
((UINT
)t1
); errstr
("!="); erruint
((UINT
)_t
); enderr
(); };
IF
(opsym
== '=') {
IF
(!dbl
) {errstr
( "assign in expr" ); enderr
(); };
cmdeq
(); //фхырхЄ _t = _T_BOOL
}ELSE IF
(opsym
== '!') {
cmdnoteq
(); //фхырхЄ _t = _T_BOOL
}ELSE IF
(opsym
== '<') {
IF
(dbl
) {
cmdshl
(); //ёЄрЁюх ёфтшэєЄ№ ёЄюы№ъю Ёрч, ёъюы№ъю уырёшЄ эютюх!
}ELSE IF
(modified
) {
cmdlesseq
(); //фхырхЄ _t = _T_BOOL
}ELSE cmdless
(); //фхырхЄ _t = _T_BOOL
}ELSE
/**IF (opsym == '>')*/ {
IF
(dbl
) {
cmdshr
(); //ёЄрЁюх ёфтшэєЄ№ ёЄюы№ъю Ёрч, ёъюы№ъю уырёшЄ эютюх!
}ELSE IF
(modified
) {
cmdmoreeq
(); //фхырхЄ _t = _T_BOOL
}ELSE cmdmore
(); //фхырхЄ _t = _T_BOOL
};
}UNTIL
(_waseof
);
//т _tword юцшфрхЄё ')' шыш фЁєующ эхёююЄтхЄёЄтє■∙шщ ёшьтюы
DEC _exprlvl
;
_addrexpr
= +FALSE
; //эх т√Ёрцхэшх ё &
#ifdef USE_HINTS
;; hinttype
("end expr",_t
);
;; hint_tword
();
#endif
}
}
PROC eatpoke
()
//poke*(<ptype>)(<pointerexpr>)=<expr>
{
VAR TYPE t
;
#ifdef USE_HINTS
;; hintstr
("//poke"); endhint
();
#endif
_exprlvl
= 0x01; //no jump optimization
eat
('*');
val
(); t
= _t
&~_T_POI
;
rdword
();
eat
('=');
eatexpr
();
IF
(t
!= _t
) {errstr
("poke variable type="); erruint
((UINT
)t
); errstr
(", but expr type="); erruint
((UINT
)_t
); enderr
(); };
cmdpoke
();
#ifdef USE_HINTS
;; hintstr
("//end poke"); endhint
();
#endif
}
PROC eatlet
()
//<var>[<[><expr><]>]=<expr>
//<var>-><field>=<expr>
{
VAR TYPE t
;
VAR BOOL ispoke
;
#ifdef USE_HINTS
;; hintstr
("//let"); endhint
();
#endif
_exprlvl
= 0x01; //no jp optimization
joinvarname
(/**iscall*/+FALSE
); t
= _t
; //t!!!
rdword
(); //'['
ispoke
= +FALSE
;
IF
(*(PCHAR
)_tword
== '[') {
t
= idxarray
(t
); //t = t&(~(_T_ARRAY|_T_POI));
eat
(']');
ispoke
= +TRUE
;
}ELSE
{
WHILE
(*(PCHAR
)_tword
== '-') {
_t
= t
;
IF
(ispoke
) { //эх яхЁт√щ ->
cmdpeek
();
}ELSE
{ //яхЁт√щ ->
cmdpushvar
(); //єърчрЄхы№ (т Єюь ўшёых эр ёЄЁєъЄєЁє) шыш юс√ўэр яхЁхьхээр
};
eat
('-');
//ёЄЁєъЄєЁр єцх яЁюўшЄрэр ш рфЁхёютрэр _typeaddr, Єшя _t = эхъшщ єърчрЄхы№
IF
(_t
== _T_UNKNOWN
) {errstr
("nolbl:"); errstr
(_name
); enderr
(); };
getstructfield
(); //_t = Єшя яюы
t
= _t
; //todo
rdword
(); //шёяюы№чютрыш structfield
ispoke
= +TRUE
;
};
};
eat
('=');
strpush
(_joined
,_lenjoined
);
eatexpr
(); //яюыєўрхЄ Єшя _t
_lenjoined
= strpop
(_joined
);
IF
(t
!=_t
) {
errstr
("let variable type="); erruint
((UINT
)t
); errstr
(", but expr type="); erruint
((UINT
)_t
); enderr
();
};
IF
(ispoke
) {
cmdpoke
();
}ELSE
{
cmdpopvar
();
};
#ifdef USE_HINTS
;; hintstr
("//end let"); hint_tword
();
#endif
}
PROC eatwhile RECURSIVE
()
//while<expr><cmd>
{
VAR UINT beglbl
;
VAR UINT wasendlbl
;
{
#ifdef USE_HINTS
;; hintstr
("//while"); endhint
();
#endif
_exprlvl
= 0x00; //jp optimization possible
wasendlbl
= _tmpendlbl
;
beglbl
= _curlbl
; INC _curlbl
;
_tmpendlbl
= _curlbl
; INC _curlbl
;
genjplbl
(beglbl
); cmdlabel
();
eat
('(');
eatexpr
(); //parentheses not included
genjplbl
(_tmpendlbl
); cmdjpiffalse
();
eat
(')');
eatcmd
(); //Єхыю while
genjplbl
(beglbl
); cmdjp
();
genjplbl
(_tmpendlbl
); cmdlabel
();
_tmpendlbl
= wasendlbl
;
#ifdef USE_HINTS
;; hintstr
("//end while"); endhint
();
#endif
}
}
PROC eatrepeat RECURSIVE
()
//repeat<cmd>until<expr>
{
VAR UINT beglbl
;
VAR UINT wasendlbl
;
{
#ifdef USE_HINTS
;; hintstr
("//repeat"); endhint
();
#endif
wasendlbl
= _tmpendlbl
;
beglbl
= _curlbl
; INC _curlbl
;
_tmpendlbl
= _curlbl
; INC _curlbl
;
genjplbl
(beglbl
); cmdlabel
();
eatcmd
(); //Єхыю repeat
IF
( (CHAR
)((BYTE
)(*(PCHAR
)_tword
)|0x20)!='u'/**"until"*/ ) err_tword
("UNTIL");
rdword
();
eat
('(');
_exprlvl
= 0x00; //jp optimization possible
eatexpr
(); //parentheses not included
eat
(')');
genjplbl
(beglbl
); cmdjpiffalse
();
genjplbl
(_tmpendlbl
); cmdlabel
();
_tmpendlbl
= wasendlbl
;
#ifdef USE_HINTS
;; hintstr
("//end repeat"); endhint
();
#endif
}
}
PROC eatbreak
() //todo inline
//break
{
genjplbl
(_tmpendlbl
);
cmdjp
();
}
PROC eatif RECURSIVE
()
//if <expr> <cmd>[else<cmd>];
//(; яЁюЄшт ю°шсъш "IF (expr);cmd" ш ю°шсъш тыюцхээюую if)
{
VAR UINT elselbl
;
VAR UINT endiflbl
;
{
#ifdef USE_HINTS
;; hintstr
("//if"); endhint
();
#endif
_exprlvl
= 0x00; //jp optimization possible
elselbl
= _curlbl
; INC _curlbl
;
endiflbl
= _curlbl
; INC _curlbl
;
eat
('(');
eatexpr
(); //parentheses not included
genjplbl
(elselbl
); cmdjpiffalse
();
eat
(')');
eatcmd
(); //Єхыю then
IF
(*(PCHAR
)_tword
!= ';'/**"endif"*/) {
IF
( (CHAR
)((BYTE
)(*(PCHAR
)_tword
)|0x20)!='e'/**"else"*/ ) err_tword
("ELSE or \';\'");
genjplbl
(endiflbl
); cmdjp
();
genjplbl
(elselbl
); cmdlabel
();
rdword
();
eatcmd
(); //Єхыю else
genjplbl
(endiflbl
); cmdlabel
();
IF
(*(PCHAR
)_tword
!= ';'/**"endif"*/) { errstr
( "\';\' expected, but we have \'"); err
(*(PCHAR
)_tword
); err
('\''); enderr
(); };
//эхы№ч ё·хфрЄ№ ';', юэ эєцхэ фы тыюцхээ√ї if
}ELSE
{ //юцшфрхь 'endif' (хёыш IF схч ELSE)
genjplbl
(elselbl
); cmdlabel
();
};
#ifdef USE_HINTS
;; hintstr
("//end if"); endhint
();
#endif
}
}
/**
PROC eatmodule RECURSIVE()
//module<lbl><cmd>
{
_lentitle = strjoin(_title, _lentitle, _tword);
_lentitle = stradd(_title, _lentitle, '.');
INC _namespclvl; //фюсрты хь ёыютю ъ title
rdword();
eatcmd();
DEC _namespclvl;
doprefix(_namespclvl); //to prefix
_lentitle = strcopy(_prefix, _lenprefix, _title); //title = prefix //юЄЁхчрхь фюсртыхээюх ёыютю
}
*/
PROC eatreturn
() //todo inline
{
//todo яЁютхЁшЄ№ isfunc (ўЄю ь√ т ЇєэъЎшш) фы т√тюфр ю°шсъш
#ifdef USE_HINTS
;; hintstr
("//return"); endhint
();
#endif
_exprlvl
= 0x01; //no jp optimization
eatexpr
(); //ёЁртэхэш эхы№ч схч ёъюсюъ!!!
IF
( _t
!= (_curfunct
&(~_T_RECURSIVE
)) ) {errstr
("return type="); erruint
((UINT
)_curfunct
); errstr
(", but expr type="); erruint
((UINT
)_t
); enderr
(); };
cmdresult
();
#ifdef USE_HINTS
;; hintstr
("//end return"); endhint
();
#endif
_wasreturn
= +TRUE
; //єёЄрэютшЄ№ яЁютхЁъє "юяхЁрЄюЁ яюёых return"
}
PROC eatinc
()
{
#ifdef USE_HINTS
;; hintstr
("//inc"); endhint
();
#endif
IF
(*(PCHAR
)_tword
== '*') {
rdword
(); //'('
eatexpr
();
_t
= _t
&~_T_POI
;
cmdincbyaddr
();
}ELSE
{
//эрўры№эр ўрёЄ№ шьхэш яхЁхьхээющ єцх яЁюўшЄрэр
adddots
(); //фюўшЄрЄ№ шь
joinvarname
(/**iscall*/+FALSE
); //doprefix(_namespclvl); //prefix:=title[FIRST to...];
cmdinc
();
rdword
();
};
}
PROC eatdec
()
{
#ifdef USE_HINTS
;; hintstr
("//dec"); endhint
();
#endif
IF
(*(PCHAR
)_tword
== '*') {
rdword
(); //'('
eatexpr
();
_t
= _t
&~_T_POI
;
cmddecbyaddr
();
}ELSE
{
//эрўры№эр ўрёЄ№ шьхэш яхЁхьхээющ єцх яЁюўшЄрэр
adddots
(); //фюўшЄрЄ№ шь
joinvarname
(/**iscall*/+FALSE
); //doprefix(_namespclvl); //prefix:=title[FIRST to...];
cmddec
();
rdword
();
};
}
PROC var_num
(TYPE t
, PCHAR s
)
{
VAR TYPE tmasked
= t
&(~_T_ARRAY
);
/** IF ( (t&_T_POI)!=(TYPE)0x00 ) { //шёяюы№чєхЄё фы ёЄЁюъ (эхы№ч equ)
varstr_tword(); //DB "str"
}ELSE*/ IF
( (t
&_T_CONST
)!=(TYPE
)0x00 ) {
varequ
(_title
); /**varstr(_title); varc( '=' );*/ varstr
(s
); endvar
();
}ELSE
{
IF
(t
==tmasked
/**(t&_T_ARRAY)==(TYPE)0x00*/) {
var_alignwsz_label
(t
);
//emitvarlabel(_joined); //varstr(_joined); /**varc( ':' );*/ endvar();
};
var_def
(tmasked
, s
);
};
}
//TODO т√Ёрцхэш (юЄфрЄ№ рёьє?) + ЄрсышЎє ъюэёЄрэЄ т ъюьяшы ЄюЁх?
PROC do_const_num
(TYPE t
)
{
IF
((*(PCHAR
)_tword
== '-') || (*(PCHAR
)_tword
== '+')) {
rdaddword
(); //яЁшъыхшЄ№ ўшёыю
var_num
(t
, _tword
);
}ELSE IF
(*(PCHAR
)_tword
== '\'') {
rdquotes
('\'');
rdch
(); //фюсрты хь чръЁ√тр■∙є■ ърт√ўъє
_tword
[_lentword
] = '\0'; //strclose(_tword, _lentword);
var_num
(t
, _tword
);
}ELSE IF
(*(PCHAR
)_tword
== '&') { //&<var>, &<func>, &<structinstance>
rdword
(); //шёяюы№чютрЄ№ &, яЁюўшЄрЄ№ эрўрыю шьхэш
adddots
(); //фюўшЄрЄ№ шь
var_num
(_T_ARRAY
|_T_UINT
, _tword
); //_T_ARRAY эх фр╕Є ёючфрЄ№ ьхЄъє
}ELSE IF
(*(PCHAR
)_tword
== '\"') {
_lenjoined
= strcopy
(_title
, _lentitle
, _joined
);
IF
((t
&_T_ARRAY
)!=(TYPE
)0x00) { //ёЄЁюър тэєЄЁш ьрёёштр
jdot
();
jautonum
(_curlbl
);
INC _curlbl
;
//_joined[_lenjoined] = '\0'; //strclose(_joined, _lenjoined);
var_num
(_T_ARRAY
|_T_UINT
, _joined
); //_T_ARRAY эх фр╕Є ёючфрЄ№ ьхЄъє
asmstrz
(); //ё ьхЄъющ _joined //ъюёЄ√ы№ тьхёЄю varstrz //todo Ўхышъюь чряюыэшЄ№ єърчрЄхыш, яюЄюь ухэхЁшЁютрЄ№ ёЄЁюъш? (эхы№ч сєфхЄ &str т const pchar arr[]?)
}ELSE
{
asmstrz
(); //varstrz(); //ё ьхЄъющ joined
};
}ELSE var_num
(t
, _tword
);
}
PROC eatextern
()
//extern<type><variable>[<[><expr><]>]
{
VAR TYPE t
;
#ifdef USE_HINTS
;; hintstr
("//extern"); endhint
();
#endif
_exprlvl
= 0x01; //no jump optimization
eatvarname
(); t
= _t
; //схч ёЁєсрэш тыюцхээюёЄхщ яю _ (ёючфр╕Є _name)
IF
(*(PCHAR
)_tword
== '[') {
//t = t|_T_ARRAY; //єцх т eatvarname
//rdbrackets(); //_tword='[' //TODO evaluate expr (т э╕ь эхы№ч яхЁхьхээ√х ш т√чют√, Є.х. эх чрярЁ√трхЄё joined?)
_lentword
= 0; //strclear(_tword); //ўшЄрхь ё яєёЄющ ёЄЁюъш
rdquotes
(']');
rdch
(); //яЁюяєёЄшЄ№ ']'
//_lenncells = strcopy(_tword, _lentword, _ncells); //n = _tword;
//}ELSE {
//n ="1";
//_lenncells = stradd(_ncells, strclear(_ncells), '1'); //n = n + '1';
//strclose(_ncells, _lenncells);
rdword
();
};
addlbl
(t
, /**isloc*/+FALSE
, (UINT
)_typesz
[t
&_TYPEMASK
]/**, _ncells, _lenncells*/); //(_name) //TODO ЁрчьхЁ ьрёёштр (ёЄЁєъЄєЁ√ эх с√тр■Є extern?)!
#ifdef USE_HINTS
;; hintstr
("//end extern"); endhint
();
#endif
}
PROC eatvar RECURSIVE
(BOOL ispar
, BOOL body
) //хёыш var, Єю body==+TRUE, шэрўх body==!forward
//var<type><variable>[<[><expr><]>][=<expr>]
//шыш т ярЁрьхЄЁрї яЁш юс· тыхэшш ЇєэъЎшш <type><variable>
{
VAR TYPE t
;
{
#ifdef USE_HINTS
;; hintstr
("//var"); endhint
();
#endif
_exprlvl
= 0x01; //no jump optimization
eatvarname
(); t
= _t
; //схч ёЁєсрэш тыюцхээюёЄхщ яю _ (ёючфр╕Є _name)
IF
(*(PCHAR
)_tword
== '[') {
//t = t|_T_ARRAY; //єцх т eatvarname
//strpush(_joined,_lenjoined);
//TODO evaluate expr (т э╕ь эхы№ч яхЁхьхээ√х ш т√чют√, Є.х. эх чрярЁ√трхЄё joined?)
_lentword
= 0; //strclear(_tword); //ўшЄрхь ё яєёЄющ ёЄЁюъш
rdquotes
(']');
//_lenjoined = strpop(_joined);
_lenncells
= strcopy
(_tword
, _lentword
, _ncells
); //n = _tword;
rdch
(); //яЁюяєёЄшЄ№ ']'
rdword
();
}ELSE
{ //n = "1"
_lenncells
= stradd
(_ncells
, 0/**strclear(_ncells)*/, '1'); //n = n + '1';
_ncells
[_lenncells
] = '\0'; //strclose(_ncells, _lenncells);
};
IF
(body
) addlbl
(t
, /**isloc*/(_namespclvl
!=0x00), (UINT
)_typesz
[t
&_TYPEMASK
]/**, _ncells, _lenncells*/); //(_name) //TODO ЁрчьхЁ ьрёёштр шыш ёЄЁєъЄєЁ√!
IF
(ispar
) { //parameter of func/proc
IF
(body
) {
var_alignwsz_label
(t
);
//emitvarlabel(_joined); //varstr(_joined); /**varc( ':' );*/ endvar();
};
_lenjoined
= strcopy
(_prefix
, _lenprefix
, _joined
); //_lenjoined = strjoin(/**to=*/_joined, 0/**strclear(_joined)*/, _prefix/**, _lenprefix*/); //prefix юёЄрыё юЄ doprefix/eatvarname т√°х
jautonum
(_parnum
);
INC _parnum
; //!!! todo эряшёрЄ№ яюўхьє
INC _curlbl
; //!!! todo эряшёрЄ№ яюўхьє
//_joined[_lenjoined] = '\0'; //strclose(_joined, _lenjoined);
_lenname
= strcopy
(_joined
, _lenjoined
, _name
);
addlbl
(t
, /**isloc*/+FALSE
, (UINT
)_typesz
[t
&_TYPEMASK
]/**, "0", _lenncells*/); //юЄьхЄшыш т ЄрсышЎх, ўЄю эх т√фхы Є№ ярь Є№ //(_name) //TODO ЁрчьхЁ ьрёёштр шыш ёЄЁєъЄєЁ√!
};
//printf("%s \n",_joined);
IF
(body
) {
IF
((t
&_T_ARRAY
)!=(TYPE
)0x00) {
var_alignwsz_label
(t
);
//emitvarlabel(_joined); //varstr(_joined); /**varc( ':' );*/ endvar();
var_ds
(); /**varstr( "\tDS " );*/ varuint
((UINT
)_typesz
[t
&_TYPEMASK
]); varc
('*'); varstr
(_ncells
); endvar
(); //todo ЁрёёўшЄрЄ№ ЁрчьхЁ єцх т addlbl, Єюуфр ьюцэю сєфхЄ фхырЄ№ +sizeof(<array>)
//printf("%s ds \n",_joined);
}ELSE
{
var_num
(t
, "0");
};
doexp
(); //_joined
};
IF
(*(PCHAR
)_tword
== '=') { //TODO яЁютхЁшЄ№, ўЄю ь√ тэєЄЁш ЇєэъЎшш (эхЁхъєЁёштэющ!)
rdword
(); //'='
strpush
(_joined
,_lenjoined
);
eatexpr
();
_lenjoined
= strpop
(_joined
);
//IF ( (t!=_t) && !( ((t&_T_POI)!=(TYPE)0x00) && (/**(texpr==_T_UINT)||*/((_t&_T_POI)!=(TYPE)0x00)) ) ) {errstr("let variable="); errstr(_joined); errstr(" type="); erruint((UINT)t); errstr(", but expr type="); erruint((UINT)_t); enderr(); };
IF
(t
!=_t
) {errstr
("let variable="); errstr
(_joined
); errstr
(" type="); erruint
((UINT
)t
); errstr
(", but expr type="); erruint
((UINT
)_t
); enderr
(); };
cmdpopvar
();
};
IF
(_isrecursive
&& !ispar
) { //local variable of recursive func/proc
_t
= t
;
cmdpushpar
(); //todo ўЄю фхырЄ№ ё ьрёёштрьш?
strpush
(_joined
,_lenjoined
);
WHILE
(*(PCHAR
)_tword
==';') {
rdword
();
}; //C compatibility
eatcmd
(); //recursive function body must be in {} after vars!
_lenjoined
= strpop
(_joined
);
_t
= t
;
cmdpoppar
(); //todo ўЄю фхырЄ№ ё ьрёёштрьш?
};
#ifdef USE_HINTS
;; hintstr
("//end var"); endhint
();
#endif
}
}
//TODO т√Ёрцхэш (юЄфрЄ№ рёьє?) + ЄрсышЎє ъюэёЄрэЄ?
PROC eatconst
()
//<constnum>::=[-]<num>|'<char>'|"<str>"["<str>"...]
//const<type><variable>[=<constnum>]
//|const<type><variable><[><expr><]>[<[><expr><]>...][={<constnum>[,<constnum>...]}] - тыюцхээ√х {} чряЁх∙хэ√ (todo ёфхырЄ№ шыш шуэюЁшЁютрЄ№ ё ртЄюяхЁхёў╕Єюь ьэюуюьхЁэ√ї ьрёёштют т юфэюьхЁэ√х)
//|const pchar<variable><[><expr><]><[><expr><]>={"<str>"[,"<str>"...]}
{
VAR TYPE t
;
VAR UINT i
= 0;
#ifdef USE_HINTS
;; hintstr
("//const"); endhint
();
#endif
_exprlvl
= 0x01; //no jump optimization
eattype
(); t
= _t
|_T_CONST
; //Єшя с√ы єцх яЁюўшЄрэ
adddots
();
doprefix
(_namespclvl
); //ёъыхшЄ№ n ёыют Єшяр 'word.' шч title т prefix (name схч яЁхЇшъёр)
rdword
(); //'['
IF
(*(PCHAR
)_tword
== '[') {
t
= t
|_T_ARRAY
;
};
//_joined ёюфхЁцшЄ шь ъюэёЄрэЄ√
//_name ёюфхЁцшЄ Єшя
_lentitle
= strcopy
(_joined
, _lenjoined
, _title
); //фы єэшъры№эюёЄш шь╕э ёЄЁюъют√ї ъюэёЄрэЄ
INC _namespclvl
; //фюсрты хь ёыютю ъ title
//эрь эєцэю яюыєўшЄ№ шь Єшяр
lbltype
();
_lenname
= strcopy
(_joined
, _lenjoined
, _name
); //шь ъюэёЄрэЄ√
_lencallee
= gettypename
(_callee
); //тч Є№ эрчтрэшх Єшяр ёЄЁєъЄєЁ√ т callee (ёЁрчє яюёых lbltype)
//title ёюфхЁцшЄ шь ъюэёЄрэЄ√ (эєцэю фы єэшъры№эюёЄш шь╕э ёЄЁюъют√ї ъюэёЄрэЄ т ьрёёштх т do_const_num)
//_joined Єюцх ёюфхЁцшЄ шь ъюэёЄрэЄ√
addlbl
(t
, /**isloc*/+FALSE
, (UINT
)_typesz
[t
&_TYPEMASK
]/**, _ncells, _lenncells*/); //(_name) //TODO ЁрчьхЁ ьрёёштр шыш ёЄЁєъЄєЁ√!
WHILE
(*(PCHAR
)_tword
== '[') { //[size]
_lentword
= 0; //strclear(_tword); //ўшЄрхь ё яєёЄющ ёЄЁюъш
rdquotes
(']');
rdch
(); //яЁюяєёЄшЄ№ ']'
rdword
();
};
IF
(*(PCHAR
)_tword
== '=') {
rdword
(); //num or '{'
IF
(*(PCHAR
)_tword
== '{') { //array or struct
var_alignwsz_label
(t
);
doexp
(); //_joined //эрфю ыш ¤ъёяюЁЄшЁютрЄ№ ъюэёЄрэЄ√? Єюы№ъю ъюэёЄрэЄэ√х ьрёёшт√/ёЄЁєъЄєЁ√
REPEAT
{ //¤ЄюЄ Ўшъы чряюЁЄшЄ _joined, эю шёяюы№чєхЄ _title
rdword
(); //num
IF
(t
== (_T_STRUCT
|_T_CONST
)) { //ёЄЁєъЄєЁр (є эх╕ эхЄ рЄюьрЁэюую Єшяр)
_lenjoined
= strcopy
(_callee
, _lencallee
, _joined
); //callee ёюфхЁцшЄ шь Єшяр ъюэёЄрэЄ√
_lenjoined
= stradd
(_joined
, _lenjoined
, '.');
jautonum
(i
);
_lenname
= strcopy
(_joined
, _lenjoined
, _name
);
_t
= lbltype
();
do_const_num
(lbltype
()&(~_T_TYPE
)|_T_ARRAY
); //_T_ARRAY эх фр╕Є ёючфрЄ№ ьхЄъє //TODO _t
INC i
;
}ELSE
{ //эх ёЄЁєъЄєЁр
do_const_num
(t
&(~_T_CONST
)); //_T_ARRAY эх фр╕Є ёючфрЄ№ ьхЄъє
};
rdword
(); //',' or '}'
}UNTIL
(*(PCHAR
)_tword
== '}');
}ELSE
{ //not array
do_const_num
(t
);
};
rdword
();
};
DEC _namespclvl
; doprefix
(_namespclvl
); _lentitle
=strcopy
(_prefix
,_lenprefix
,_title
);/**title =prefix;*/ //юЄЁхчрхь фюсртыхээюх ёыютю
//_isexp = +FALSE; //эрфю ыш ¤ъёяюЁЄшЁютрЄ№ ъюэёЄрэЄ√? Єюы№ъю ъюэёЄрэЄэ√х ьрёёшт√/ёЄЁєъЄєЁ√
#ifdef USE_HINTS
;; hintstr
("//end const"); endhint
();
#endif
}
PROC eatfunc
(BOOL isfunc
, TYPE oldfunct
, BOOL oldwasreturn
)
//proc<procname>[recursive][forward](<type><par>,...])[<cmd>]
//|func<type><funcname>[recursive][forward]([<type><par>,...])[<cmd>]
{
VAR BOOL isforward
;
_curlbl
= 0; //ёсЁрё√трхь эєьхЁрЎш■ ртЄюьхЄюъ, Є.ъ. є эшї яЁхЇшъё ЇєэъЎшш
IF
( isfunc
) {
eattype
(); _curfunct
= _t
;
}ELSE _curfunct
= _T_PROC
;
#ifdef USE_HINTS
;; hintstr
("//func "); hinttype
(_title
,_curfunct
);
#endif
_lenname
= strcopy
(_tword
, _lentword
, _name
);
jtitletword
();
rdword
(); //'(' or "recursive" or "forward"
IF
((CHAR
)((BYTE
)(*(PCHAR
)_tword
)|0x20) == 'r') {
_curfunct
= _curfunct
|_T_RECURSIVE
;
_isrecursive
= +TRUE
;
rdword
(); //'('
}ELSE _isrecursive
= +FALSE
;
IF
((CHAR
)((BYTE
)(*(PCHAR
)_tword
)|0x20) == 'f') {
isforward
= +TRUE
;
rdword
(); //'('
}ELSE isforward
= +FALSE
;
addlbl
(_curfunct
, /**isloc*/+FALSE
, 0/**, _ncells"0", 1*/); //(_name) //эхы№ч if (!isforward), яюЄюьє ўЄю эрфю чряюьэшЄ№ Єшя ЇєэъЎшш т forward
IF
(!isforward
) {
cmdlabel
(); //_joined
cmdfunc
(); //фхырхЄ initrgs
doexp
(); //_joined
};
jdot
();
_lentitle
= strcopy
(_joined
, _lenjoined
, _title
);
INC _namespclvl
; //фюсрты хь ёыютю ъ title
eat
('(');
_parnum
= 0;
WHILE
(!_waseof
) {
IF
(*(PCHAR
)_tword
== ')') BREAK
;
eatvar
(/**ispar*/+TRUE
, /**body*/!isforward
); //ьхЄър ярЁрьхЄЁр ёючфр╕Єё схч яЁхЇшъёр ш ё Їыруюь isloc, х∙╕ ёючфр╕Єё f.A.
IF
(*(PCHAR
)_tword
== ')') BREAK
; //шэрўх ','
rdword
(); //type or ')'
};
rdword
();
keepvars
(); //эхы№ч яхЁхф ярЁрьхЄЁрьш, Є.ъ. f.A. эрфю яюьэшЄ№ яюёых Єхыр ЇєэъЎшш
IF
(!isforward
) {
eatcmd
(); //Єхыю ЇєэъЎшш
_t
= _curfunct
&(~_T_RECURSIVE
);
cmdret
(isfunc
);
IF
(isfunc
&& !_wasreturn
) {errstr
("return expected"); enderr
(); };
#ifdef USE_HINTS
;; hintstr
("/////end func"); endhint
();
#endif
};
undovars
(); //TODO єэшўЄюцшЄ№ ъюЁюЄъшх ьхЄъш ярЁрьхЄЁют, шэрўх юэш чрЄЁєЄ уыюсры√ эртхўэю. ═рфю їЁрэшЄ№ рфЁхёр Єръшї ьхЄюъ т ЄрсышЎх
DEC _namespclvl
; doprefix
(_namespclvl
); _lentitle
=strcopy
(_prefix
,_lenprefix
,_title
);/**title =prefix;*/ //юЄЁхчрхь фюсртыхээюх ёыютю
_curfunct
= oldfunct
; //тючтЁрЄшЄ№ тэх°эшщ Єшя ЇєэъЎшш
_wasreturn
= oldwasreturn
; //ёсЁюёшЄ№ яЁютхЁъє "юяхЁрЄюЁ яюёых return"
_isexp
= +FALSE
;
}
PROC do_callpar RECURSIVE
(TYPE funct
, UINT parnum
)
{
VAR TYPE t
;
{
#ifdef USE_HINTS
;; hintstr
("//call_par"); endhint
();
#endif
IF
( (*(PCHAR
)_tword
!=')') && !_waseof
) {
_lenjoined
= strcopy
(_callee
, _lencallee
, _joined
);
jdot
();
jautonum
(parnum
);
//INC _curlbl; //эх эєцэю, Є.ъ. ¤Єю т√чют (Є.х. фЁєующ яЁхЇшъё)
//_joined[_lenjoined] = '\0'; //strclose(_joined, _lenjoined);
;; cmtstr
(";accesspar="); cmtstr
(_joined
); endcmt
();
_lenname
= strcopy
(_joined
, _lenjoined
, _name
);
t
= lbltype
(); //(_name)
IF
((funct
&_T_RECURSIVE
)!=(TYPE
)0x00/**isstacked*/) {
_t
= t
;
cmdpushpar
(); //(_joined)
};
strpush
(_joined
,_lenjoined
);
INC _exprlvl
; //no jump optimization
eatexpr
(); //ьюцхЄ ЁхъєЁёштэю т√чтрЄ№ do_call ш чрЄхЁхЄ№ callee (хёыш юэ уыюсры№э√щ)! //ёЁртэхэш эхы№ч схч ёъюсюъ!!!
DEC _exprlvl
;
IF
(t
!= _t
) {errstr
("callpar type="); erruint
((UINT
)t
); errstr
(", but expr type="); erruint
((UINT
)_t
); enderr
(); };
_lenjoined
= strpop
(_joined
);
cmdpopvar
(); //(_joined)
IF
(*(PCHAR
)_tword
== ',') rdword
(); //parameter or ')'
IF
(parnum
< _MAXPARS
) {
strpush
(_joined
,_lenjoined
);
do_callpar
(/**isfunc,*/ funct
, /**isstacked,*/ parnum
+1); //ЁхъєЁёштэю
_lenjoined
= strpop
(_joined
);
}/**ELSE {errstr("too many parameters"); enderr(); }*/;
IF
((funct
&_T_RECURSIVE
)!=(TYPE
)0x00/**isstacked*/) {
_t
= t
;
cmdpoppar
(); //(_joined)
};
}ELSE
{
_t
= funct
&(~_T_RECURSIVE
);
cmdcall
();
};
#ifdef USE_HINTS
;; hintstr
("//end call_par"); endhint
();
#endif
}
}
FUNC TYPE do_call RECURSIVE
(BOOL isfunc
)
//<lbl>([recursive][(<type>)<val>,...])
{
VAR TYPE t
;
{
INC _exprlvl
; //no jump optimization
joinvarname
(/**iscall*/+TRUE
); t
= _t
; //t!!!
IF
(t
== _T_UNKNOWN
) {errstr
("unknown function "); errstr
(_joined
); enderr
(); };
#ifdef USE_HINTS
;; hinttype
("call",t
);
#endif
IF
(!isfunc
) t
= (t
&_T_RECURSIVE
)|_T_PROC
; //ўЄюс√ ьюцэю с√ыю т√ч√трЄ№ ЇєэъЎшш ъръ яЁюЎхфєЁ√
strpush
(_callee
,_lencallee
); //эр ёыєўрщ тыюцхээ√ї т√чютют
_lencallee
= strcopy
(_joined
, _lenjoined
, _callee
); //схч Єюўъш
jdot
();
rdword
(); //'('
eat
('(');
do_callpar
(t
, /**parnum*/0); //ёюїЁрэхэшх [call]title, [ёюїЁрэхэшх яхЁхьхээющ], яЁшётрштрэшх, ЁхъєЁёш , [тюёёЄрэютыхэшх яхЁхьхээющ], тюёёЄрэютыхэшх [call]title
_lencallee
= strpop
(_callee
); //эр ёыєўрщ тыюцхээ√ї т√чютют
DEC _exprlvl
; //no jump optimization
RETURN t
&(~_T_RECURSIVE
);
}
}
PROC eatcallpoi
()
//call(<poi>)
{
//эрўры№эр ўрёЄ№ шьхэш яхЁхьхээющ єцх яЁюўшЄрэр
adddots
(); //фюўшЄрЄ№ шь
joinvarname
(/**iscall*/+FALSE
); //doprefix(_namespclvl); //prefix:=title[FIRST to...];
eat
('(');
eatexpr
();
//todo яЁютхЁшЄ№ pointer
eat
(')');
cmdcallval
();
rdword
();
}
PROC eatlbl
() //todo inline
//_lbl<lblname><:>
{
jtitletword
();
cmdlabel
();
rdword
(); //skip ':' for C compatibility
rdword
(); //эєцэю!
}
PROC eatgoto
() //яхЁхїюф Єюы№ъю тэєЄЁш Єхъє∙хщ яЁюЎхфєЁ√ //todo inline
//goto<lblname>
{
//rdword(); //lbl
jtitletword
();
cmdjp
();
rdword
();
}
PROC eatasm
()
//asm("asmtext")
{
//rdword(); //'('
rdword
(); //'\"'
WHILE
(!_waseof
) {
_lentword
= 0/**strclear(_tword)*/; //ўшЄрхь ё яєёЄющ ёЄЁюъш
rdquotes
('\"'/**, +FALSE*/);
asmstr
(_tword
); endasm
();
rdch
(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
IF
(_cnext
!= '\"') BREAK
;
rdword
(); //'\"' юЄъЁ√тр■∙р ърт√ўър яЁшъыххээющ ёЄЁюъш
};
rdword
(); //')'
rdword
();
}
PROC eatenum
()
//enum{<constname0>[=<num>],<constname1>...[,]}
{
//rdword(); //'{'
_lenncells
= strcopy
("-1", 2, _ncells
);
WHILE
(!_waseof
) {
rdword
(); //ьхЄър
IF
(*(PCHAR
)_tword
=='}') BREAK
; //BREAK ЁрсюЄрхЄ, р goto qqq эх ЁрсюЄрхЄ ('}' эх ё·хфхэр)
varequ
(_tword
); /**varstr(_tword); varc('=');*/
//ъюёЄ√ы№ фы script: ёючфр╕ь яхЁхьхээє■ UINT ё рфЁхёюь, ъръ Єхъє∙хх ўшёыю т enum:
// _lenname = strcopy(_tword, _lentword, _name);
// addlbl(_T_UINT, /**isloc*/+FALSE, /**varsz*/0/**, "0", _lenncells*/); //юЄьхЄшыш т ЄрсышЎх, ўЄю эх т√фхы Є№ ярь Є№
// rdword(); //',' шыш '}'
// IF (*(PCHAR)_tword=='=') {
IF
(_cnext
=='=') {
rdword
(); //ё·хыш =
rdword
(); //яхЁтюх ёыютю expr
//eatexpr(); //parentheses not included
//rdword(); //',' шыш '}'
varstr
(_tword
);
}ELSE
{
varstr
(_ncells
); varc
('+'); varc
('1'); /**varuint(i);*/
};
_lenncells
= strcopy
(_tword
, _lentword
, _ncells
);
endvar
();
rdword
(); //',' шыш '}'
IF
(*(PCHAR
)_tword
!=',') BREAK
; //}
};
rdword
(); //ёыютю яюёых }
}
PROC eatevar
()
//evar{<type><varname0>[=<addr>],<type><varname1>...[,]}
{
//rdword(); //'{'
_lenncells
= strcopy
("-1", 2, _ncells
);
WHILE
(!_waseof
) {
rdword
(); //type
IF
(*(PCHAR
)_tword
=='}') BREAK
; //BREAK ЁрсюЄрхЄ, р goto qqq эх ЁрсюЄрхЄ ('}' эх ё·хфхэр)
eattype
(); //_t //фхырхЄ rdword(); //ьхЄър
varequ
(_tword
); /**varstr(_tword); varc('=');*/
//ёючфр╕ь яхЁхьхээє■ Єшяр _t ё рфЁхёюь, ъръ Єхъє∙хх ўшёыю т evar:
_lenname
= strcopy
(_tword
, _lentword
, _name
);
addlbl
(_t
/**_T_UINT*/, /**isloc*/+FALSE
, /**varsz*/0/**, "0", _lenncells*/); //юЄьхЄшыш т ЄрсышЎх, ўЄю эх т√фхы Є№ ярь Є№
// rdword(); //',' шыш '}'
// IF (*(PCHAR)_tword=='=') {
IF
(_cnext
=='=') {
rdword
(); //ё·хыш =
rdword
(); //яхЁтюх ёыютю expr
//eatexpr(); //parentheses not included
//rdword(); //',' шыш '}'
varstr
(_tword
);
}ELSE
{
varstr
(_ncells
); varc
('+'); varc
('1'); /**varuint(i);*/
};
_lenncells
= strcopy
(_tword
, _lentword
, _ncells
);
endvar
();
rdword
(); //',' шыш '}'
IF
(*(PCHAR
)_tword
!=',') BREAK
; //}
};
rdword
(); //ёыютю яюёых }
}
PROC eatstruct
()
//struct<name>{<type1><field1>[;]<type2><field2>[;]...}
{
VAR UINT shift
= 0;
VAR UINT varszaddr
;
VAR UINT i
= 0;
VAR UINT sz
;
_lentitle
= strjoin
(/**to=*/_title
, _lentitle
, _tword
/**, _lentword*/);
_title
[_lentitle
] = '\0'; //strclose(_title, _lentitle);
//strpush(_title,_lentitle); //схч Єюўъш
_lenname
= strcopy
(_title
, _lentitle
, _name
); //схч Єюўъш
addlbl
(_T_STRUCT
|_T_TYPE
, /**isloc*/+FALSE
, 0/**, "0", _lenncells*/); //(_name) //яЁхфтрЁшЄхы№эю ёючфрыш, ўЄюс√ ёё√ырЄ№ё
varszaddr
= _varszaddr
;
_lentitle
= stradd
(_title
, _lentitle
, '.');
_title
[_lentitle
] = '\0'; //strclose(_title, _lentitle);
INC _namespclvl
; //фюсрты хь ёыютю ъ title
rdword
(); //шёяюы№чютрыш шь
eat
('{');
WHILE
(!_waseof
) {
eattype
(); //шёяюы№чютрыш Єшя
sz
= (UINT
)_typesz
[_t
&_TYPEMASK
];
//rdword(); //ьхЄър
jtitletword
();
shift
= varshift
(shift
, sz
);
_lenname
= strcopy
(_joined
, _lenjoined
, _name
);
addlbl
(_t
, /**isloc*/+FALSE
, sz
/**, "0", _lenncells*/); //(_name)
genjplbl
(i
);
_lenname
= strcopy
(_joined
, _lenjoined
, _name
);
addlbl
(_t
, /**isloc*/+FALSE
, sz
/**, "0", _lenncells*/); //ртЄюэєьхЁютрээр (_name)
INC i
;
shift
= shift
+ sz
;
rdword
(); //Єшя шыш ';' шыш '}' //шёяюы№чютрыш ьхЄъє
IF
(*(PCHAR
)_tword
==';') rdword
(); //Єшя
IF
(*(PCHAR
)_tword
=='}') BREAK
;
};
//_lenname = strpop(_name);
//addlbl(_T_STRUCT|_T_TYPE, /**isloc*/+FALSE/**, "0", _lenncells*/); //юЄьхЄшыш т ЄрсышЎх, ўЄю эх т√фхы Є№ ярь Є№ //(_name)
//Єрь цх ёюїЁрэшЄ№ sizeof_structname (=shift)
//яЁш ¤Єюь тё╕ х∙╕ ЁрчЁх°шЄ№ ёё√ырЄ№ё эр ¤Єє цх ёЄЁєъЄєЁє (Є.х. юяЁхфхышЄ№ х╕ Ёрэ№°х, р чряюыэшЄ№ фрээ√х яюЄюь; ёючфрЄ№ чрэютю эхы№ч - фЁєующ рфЁхё)
setvarsz
(varszaddr
, shift
);
DEC _namespclvl
;
doprefix
(_namespclvl
); //to prefix
_lentitle
= strcopy
(_prefix
, _lenprefix
, _title
); //title = prefix //юЄЁхчрхь фюсртыхээюх ёыютю
rdword
();
}
PROC eatswitch
() //яЁюЎхфєЁр ЄхюЁхЄшўхёъш ЁхъєЁёштэр , эю яЁръЄшўхёъш тыюцхээюёЄ№ switch чряЁх∙хэр
//'J' т эєьхЁютрээ√ї ьхЄърї ьюцэю єсЁрЄ№, Є.ъ. ртЄюьхЄъш ЄхяхЁ№ схч ЎшЇЁ ш эх яхЁхёхъєЄё (ьюцэю ёъыхштрЄ№ '.' ё ўшёыюь)
//switch (<byteexpr>){...};
//case <byteconst>: //ухэхЁшЁєхЄё ртЄюьхЄър ё ўшёыюь (эх яхЁхёхў╕Єё эш ё ўхь)
//default: //ухэхЁшЁєхЄё ртЄюьхЄър ё Єюўъющ (эх яхЁхёхў╕Єё эш ё ўхь)
{
VAR BYTE ib
;
VAR UINT wastmpendlbl
;
//rdword(); //'('
wastmpendlbl
= _tmpendlbl
;
_tmpendlbl
= _curlbl
; INC _curlbl
;
//pushvar <title>.J
_lenjoined
= strcopy
(_title
, _lentitle
, _joined
);
_lenjoined
= stradd
(_joined
, _lenjoined
, 'J');
_joined
[_lenjoined
] = '\0'; //strclose(_joined , _lenjoined);
_t
= _T_UINT
|_T_POI
;
cmdpushnum
(); //шёяюы№чютрэшх єърчрЄхы т ърўхёЄтх ьрёёштр - ўшЄрхь хую чэрўхэшх
eatidx
();
_t
= _T_UINT
; //Єшя ¤ыхьхэЄр ьрёёштр
cmdaddpoi
();
cmdpeek
();
cmdjpval
();
//ухэхЁшЁютрЄ№ ёяшёюъ эрўры№э√ї чэрўхэшщ эєьхЁютрээ√ї ьхЄюъ яхЁхїюфр
//procname.aab.<num> = procname.aab.default (яюър схч aab TODO)
//ухэхЁшЁютрЄ№ ЄрсышЎє яхЁхїюфют, чряюыэхээє■ эєьхЁютрээ√ьш ьхЄърьш яхЁхїюфр
//DW procname.aab.1 (яюър схч aab TODO)
varstr
(_title
); varc
('J'); endvar
();
ib
= 0x00;
REPEAT
{
asmstr
(_title
); asmuint
((UINT
)ib
); asmc
('='); asmstr
(_title
); asmstr
("default"); endasm
(); //фю ъюфр! яю¤Єюьє asm
var_dw
(); varstr
(_title
); varuint
((UINT
)ib
); endvar
(); //TODO "DP", Є.х. эр °шЁшэє POINTER?
INC ib
;
}UNTIL
(ib
== 0x00);
eatcmd
(); //{...}
genjplbl
(_tmpendlbl
); cmdlabel
();
_tmpendlbl
= wastmpendlbl
;
}
PROC eatcase
()
//case <byteconst>:
{
//rdword(); //byteconst
//чряюыэшЄ№ эєьхЁютрээє■ ьхЄъє яхЁхїюфр
//procname.aab.#<_tword> = $ (яюър схч aab TODO)
asmstr
(_title
); asmc
('#'); asmstr
(_tword
); asmc
('='); asmc
('$'); endasm
();
rdword
(); //skip ':' for C compatibility
rdword
(); //эєцэю!
}
FUNC BOOL eatcmd RECURSIVE
() //тючтЁр∙рхЄ +FALSE, хёыш ъюэхЎ сыюър
{
{
//эрўры№эр ўрёЄ№ шьхэш яхЁхьхээющ єцх яЁюўшЄрэр
adddots
(); //фюўшЄрЄ№ шь
//ўЄюс√ ЁхрышчютрЄ№ юс· тыхэш схч VAR ш FUNC, эрфю єцх ёхщўрё яЁютхЁшЄ№ Єшя ьхЄъш TODO FAST!!!
_c0
= *(PCHAR
)_tword
;
IF
((_c0
=='}') || _waseof
) {
rdword
();
_morecmd
= +FALSE
;
}ELSE
{
// IF (_wasreturn) {
// IF (_c0!=';') {errstr("cmd after return!"); enderr(); };
// };
IF
(_cnext
=='=') { //let
eatlet
();
}ELSE IF
( (((BYTE
)_cnext
-0x28/**'('*/) | ((BYTE
)_spcsize
/**==0x00*/)) == 0x00) { //call
do_call
(/**isfunc*/+FALSE
); rdword
();
}ELSE IF
(_cnext
=='[') { //let []
eatlet
();
}ELSE IF
( _cnext
==':' ) { //lbl
eatlbl
();
}ELSE IF
(_cnext
=='-') { //let ->
eatlet
();
}ELSE
{
IF
(_c0
==';') {
rdword
(); //C compatibility
}ELSE IF
(_c0
=='{') {
rdword
(); WHILE
(eatcmd
()) {};
}ELSE
{
_c0
= (CHAR
)((BYTE
)_c0
|0x20);
IF
(_c0
=='v') { //var
rdword
(); eatvar
(/**ispar*/+FALSE
, /**body*/+TRUE
);
_isexp
= +FALSE
; //эхы№ч тэєЄЁ№, шэрўх эх ¤ъёяюЁЄшЁє■Єё ярЁрьхЄЁ√ яЁюЎхфєЁ√
}ELSE IF
(_c0
=='f') { //func
rdword
(); eatfunc
(+TRUE
, _curfunct
, _wasreturn
);
}ELSE IF
( _c0
=='w' ) { //while
rdword
(); eatwhile
();
}ELSE IF
( _c0
=='b' ) { //break
rdword
(); eatbreak
(); //no parameters (rds nothing)
}ELSE
{
_c2
= (CHAR
)((BYTE
)_tword
[2]|0x20);
IF
(_c0
=='c') { //const //case //call
IF
(_c2
=='n') { //const
rdword
(); eatconst
();
}ELSE IF
(_c2
=='l') { //call
rdword
(); eatcallpoi
();
}ELSE
{ //case
rdword
(); eatcase
();
};
}ELSE IF
(_c0
=='p') { //proc //poke
IF
(_c2
=='o') { //proc
rdword
(); eatfunc
(+FALSE
, _curfunct
, _wasreturn
);
}ELSE
{ //poke
rdword
(); eatpoke
();
};
}ELSE IF
(_c0
=='r') { //return //repeat
IF
(_c2
=='t') { //return
rdword
(); eatreturn
();
}ELSE
{ //repeat
rdword
(); eatrepeat
();
};
}ELSE IF
( _c0
=='d' ) { //dec
rdword
(); eatdec
();
}ELSE IF
( _c0
=='i' ) { //inc //if
IF
( _c2
=='c' ) { //inc
rdword
(); eatinc
();
}ELSE
{ //if
rdword
(); eatif
();
};
}ELSE IF
(_c0
=='e') { //enum //extern //export //evar
IF
(_c2
=='t') { //extern
rdword
(); eatextern
();
}ELSE IF
(_c2
=='p') { //export
rdword
(); _isexp
= +TRUE
;
}ELSE IF
(_c2
=='a') { //evar
rdword
(); eatevar
();
}ELSE
{ //enum
rdword
(); eatenum
();
};
}ELSE IF
( _c0
=='g' ) { //goto
rdword
(); eatgoto
();
}ELSE IF
( _c0
=='a' ) { //asm
rdword
(); eatasm
();
}ELSE IF
( _c0
=='s' ) { //struct //switch
IF
(_c2
=='r') { //struct
rdword
(); eatstruct
();
}ELSE
{ //switch
rdword
(); eatswitch
();
};
// }ELSE IF ( _c0=='m' ) { //module
// rdword(); eatmodule();
}ELSE IF
( _c0
=='t' ) { //typedef <type> <name>
rdword
();
eattype
();
_lenname
= strcopy
(_tword
, _lentword
, _name
);
addlbl
(_T_TYPE
+ _t
, /**isloc*/+FALSE
, (UINT
)_typesz
[_t
]);
rdword
(); //шёяюы№чютрыш шь
}ELSE IF
( _c0
=='#' ) { //define, include... (ё■фр яюярфрхь фрцх т эхръЄштэ√ї тхЄърї єёыютэющ ъюьяшы Ўшш)
rdword
(); //define, undef, include, if, else, [elif], ifdef, ifndef, endif, [import], [line], [error], [pragma]
//тыюцхээр єёыютэр ъюьяшы Ўш :
//_doskipcond т сшЄютюь тшфх яюьэшЄ, ёъюы№ъю єЁютэхщ ръЄштэ√ї ifdef ш ёъюы№ъю єЁютэхщ эхръЄштэ√ї (ъЁюьх Єхъє∙хую)
//(тэєЄЁш эхръЄштэюую ьюуєЄ с√Є№ Єюы№ъю эхръЄштэ√х)
//хёыш (_doskipcond&1) == 0 (Є.х. ь√ т эхръЄштэющ тхЄъх), Єю Єхъє∙шщ ifdef шуэюЁшЁєхЄё ёю тёхьш тїюф ∙шьш (Є.х. else эх ЁрсюЄрхЄ)
//эхръЄштэюёЄ№ Єхъє∙хщ тхЄъш ifdef ыхцшЄ т _doskip
//эр тхЁїэхь єЁютэх _doskipcond = 1, _doskip = +FALSE
//хёыш ifdef, Єю:
//_doskipcond = _doskipcond+_doskipcond
//хёыш !_doskip, Єю:
//INC _doskipcond;
//хёыш ifdef эх уюфхэ, Єю _doskip = +TRUE
//хёыш else ш ((_doskipcond&1) != 0), Єю _doskip = !_doskip
//хёыш endif, Єю _doskip = ((_doskipcond&1) == 0); _doskipcond = _doskipcond>>1
_c2
= _tword
[2];
IF
((_c2
== 'c')&&(!_doskip
)) { //include
rdword
(); //"
_lentword
= 0;
rdquotes
('\"'/**, +FALSE*/); //IF (_c0 == '\"') { rdquotes('>'); }ELSE rdquotes('\"');
_hinclfile
[_nhinclfiles
] = _fin
;
_hnline
[_nhinclfiles
] = _curline
;
INC _nhinclfiles
; compfile
(_tword
); DEC _nhinclfiles
;
_fin
= _hinclfile
[_nhinclfiles
];
_curline
= _hnline
[_nhinclfiles
];
_waseof
= +FALSE
;
rdch
(); //яЁюяєёЄшЄ№ чръЁ√тр■∙є■ ърт√ўъє
}ELSE IF
(_c2
== 'd') { //ifdef/endif/undef
IF
(*(PCHAR
)_tword
== 'e') { //endif
//_doskip = +FALSE; //todo тыюцхээюёЄ№ (яюфёў╕Є ўшёыр шЇют)
_doskip
= ((_doskipcond
&1) == 0);
_doskipcond
= _doskipcond
>>1;
//erruint(_doskipcond); errstr("#endif "); erruint((UINT)_doskip); enderr();
}ELSE IF
(*(PCHAR
)_tword
== 'i') { //ifdef
_doskipcond
= _doskipcond
+_doskipcond
;
rdword
(); //шь
_lenname
= strcopy
(_tword
, _lentword
, _name
);
//_t = lbltype(); //хёыш эхЄє, Єю _T_UNKNOWN
IF
(!_doskip
) {
INC _doskipcond
; //эх шуэюЁшЁєхь ¤ЄюЄ ifdef
//эхЄ ьхЄъш - яЁюяєёЄшЄ№ Єхыю
_doskip
= (lbltype
() == _T_UNKNOWN
); //тъы■ўшЄ№ яЁюяєёъ ёЄЁюъ, ъЁюьх эрўшэр■∙шїё ё #, р чфхё№ юсЁрсрЄ√трЄ№ Єюы№ъю шї
};
//erruint(_doskipcond); errstr("#ifdef "); erruint((UINT)_doskip); enderr();
}ELSE
{ //undef
rdword
(); //шь
_lenname
= strcopy
(_tword
, _lentword
, _name
);
dellbl
();
};
}ELSE IF
(_c2
== 'n') { //ifndef
_doskipcond
= _doskipcond
+_doskipcond
;
rdword
(); //шь
_lenname
= strcopy
(_tword
, _lentword
, _name
);
//_t = lbltype(); //хёыш эхЄє, Єю _T_UNKNOWN
IF
(!_doskip
) {
INC _doskipcond
; //эх шуэюЁшЁєхь ¤ЄюЄ ifndef
//хёЄ№ ьхЄър - яЁюяєёЄшЄ№ Єхыю
_doskip
= (lbltype
() != _T_UNKNOWN
); //тъы■ўшЄ№ яЁюяєёъ ёЄЁюъ, ъЁюьх эрўшэр■∙шїё ё #, р чфхё№ юсЁрсрЄ√трЄ№ Єюы№ъю шї
};
}ELSE IF
(_c2
== 's') { //else
//_doskip = !_doskip;
IF
((_doskipcond
&1) != 0) _doskip
= !_doskip
; //эх шуэюЁшЁєхь ¤ЄюЄ ifdef
//erruint(_doskipcond); errstr("#else "); erruint((UINT)_doskip); enderr();
}ELSE IF
((_c2
== 'f')&&(!_doskip
)) { //define
rdword
(); //шь
twordtojoined
(); //_lenjoined = strcopy(_tword, _lentword, _joined);
rdword
(); //чэрўхэшх шыш (
IF
(*(PCHAR
)_tword
== '(') { //TODO ¤Єє ъюэёЄЁєъЎш■ яЁшьхэшЄ№ ш т const
rdword
(); //eat('(');
eattype
();
eat
(')');
rdquotes
(')');
rdch
(); //фюсрты хь чръЁ√тр■∙є■ ёъюсъє
_tword
[_lentword
] = '\0'; //strclose(_tword, _lentword);
}ELSE
{
numtype
(); //_t
};
_lenname
= strcopy
(_joined
, _lenjoined
, _name
);
addlbl
(_t
|_T_CONST
, /**isloc*/+FALSE
, (UINT
)_typesz
[_t
/**&_TYPEMASK*/]/**, _ncells, _lenncells*/); //(_name) //TODO ЁрчьхЁ ьрёёштр шыш ёЄЁєъЄєЁ√!
emitvarpreequ
(_name
);
varequ
(_name
); /**varstr(_name); varc( '=' );*/ varstr
(_tword
); endvar
();
emitvarpostequ
();
};
//rdchcmt(); //rdaddword(); //шёяюы№чєхь яхЁт√щ ёшьтюы чэрър ъюььхэЄрЁш , ўшЄрхь ёыхфє■∙шщ ёшьтюы
WHILE
(_waseols
==0/** && !_waseof*/ ) {
rdchcmt
(); //яЁюяєёърхЄ тёх хэЄхЁ√
};
_tword
[_lentword
] = '\0'; //strclose(_tword, _lentword); //todo эрЁє°хэр ярЁэюёЄ№ clear..close
IF
((BYTE
)_cnext
< (BYTE
)'!') {
rdch
(); //шёяюы№чєхь яюёыхфэшщ ёшьтюы ъюььхэЄрЁш , ўшЄрхь ёыхфє■∙шщ ёшьтюы (TODO єэшЇшЎшЁютрЄ№ ъръ /* */)
};
rdword
();
}ELSE
{
errstr
("WRONG COMMAND "); errstr
(_tword
); enderr
();
rdword
();
};
};
};
}; //not a headless cmd
_morecmd
= +TRUE
;
}; //not '{'
RETURN _morecmd
;
}
}
PROC compfile RECURSIVE
(PCHAR fn
)
{
_fin
= nfopen
(fn
, "rb");
IF
(_fin
!= (PBYTE
)0) {
strpush
(_fn
,_lenfn
);
_lenfn
= strjoineol
(_fn
, 0/**_lenfn*/, fn
, '\0');
_fn
[_lenfn
] = '\0';
_waseof
= +FALSE
;
_curline
= 1;
initrd
();
rdword
();
WHILE
(eatcmd
()) {};
fclose(_fin
);
_lenfn
= strpop
(_fn
);
}ELSE
{
errstr
("no file "); errstr
(fn
); enderr
();
};
}
FUNC UINT strjoineollast
(PCHAR to
, UINT tolen
, PCHAR s2
/**, UINT s2len*/, CHAR eol
) //фышэр схч ЄхЁьшэрЄюЁр!
{ //to = to + s2;
VAR UINT len
;
VAR UINT last
;
VAR CHAR c
;
to
= &to
[tolen
];
len
= tolen
; //фышэр схч ЄхЁьшэрЄюЁр!
last
= 0; //яюёых яюёыхфэхую ЄхЁьшэрЄюЁр
loop
:
c
= *(PCHAR
)s2
;
IF
((c
== '\0') || (len
>=_STRMAX
)) goto endloop
; //ЄхЁьшэрЄюЁ эх ъюяшЁєхЄё
POKE
*(PCHAR
)(to
) = c
;
INC s2
;
IF
(c
== eol
) last
= len
;
INC to
;
INC len
;
goto loop
; //ЄхЁьшэрЄюЁ эх ъюяшЁєхЄё
endloop
:
RETURN last
; //яюёых яюёыхфэхую ЄхЁьшэрЄюЁр
}
PROC compile
(PCHAR fn
)
{
_doskipcond
= 1;
_prefix
= (PCHAR
)_s1
; //чряюыэ хЄё т doprefix: module/func/const/var/extern - ыюъры№эю, joinvarname
_title
= (PCHAR
)_s2
;
_callee
= (PCHAR
)_s3
;
_name
= (PCHAR
)_s4
;
_joined
= (PCHAR
)_s5
;
_ncells
= (PCHAR
)_s6
;
_fn
= (PCHAR
)_m_fn
;
_lenfn
= 0;
_tmpendlbl
= 0; //ўЄюс√ эшъюуфр эх ёютярыю (break тэх ЇєэъЎшш т√фрёЄ ю°шсъє т рёьх)
_lenstrstk
= 0;
_curlbl
= 0; //ёсЁрё√трхь эєьхЁрЎш■ ртЄюьхЄюъ (фы ьрёёштют ёЄЁюъ)
initlblbuf
();
_lenname
= strcopy
("INT", 3, _name
);
addlbl
(_T_TYPE
+ _T_INT
, +FALSE
, (UINT
)_typesz
[_T_INT
]);
_lenname
= strcopy
("UINT", 4, _name
);
addlbl
(_T_TYPE
+ _T_UINT
, +FALSE
, (UINT
)_typesz
[_T_UINT
]);
_lenname
= strcopy
("BYTE", 4, _name
);
addlbl
(_T_TYPE
+ _T_BYTE
, +FALSE
, (UINT
)_typesz
[_T_BYTE
]);
_lenname
= strcopy
("BOOL", 4, _name
);
addlbl
(_T_TYPE
+ _T_BOOL
, +FALSE
, (UINT
)_typesz
[_T_BOOL
]);
_lenname
= strcopy
("LONG", 4, _name
);
addlbl
(_T_TYPE
+ _T_LONG
, +FALSE
, (UINT
)_typesz
[_T_LONG
]);
_lenname
= strcopy
("CHAR", 4, _name
);
addlbl
(_T_TYPE
+ _T_CHAR
, +FALSE
, (UINT
)_typesz
[_T_CHAR
]);
_lenname
= strcopy
("FLOAT", 5, _name
);
addlbl
(_T_TYPE
+ _T_FLOAT
, +FALSE
, (UINT
)_typesz
[_T_FLOAT
]);
_lenname
= strcopy
("STRUCT", 6, _name
);
addlbl
(_T_TYPE
+ _T_STRUCTWORD
, +FALSE
, (UINT
)_typesz
[_T_STRUCT
]);
_lenname
= strcopy
("PINT", 4, _name
);
addlbl
(_T_TYPE
+ _T_POI
+ _T_INT
, +FALSE
, (UINT
)_typesz
[_T_POI
]);
_lenname
= strcopy
("PUINT", 5, _name
);
addlbl
(_T_TYPE
+ _T_POI
+ _T_UINT
, +FALSE
, (UINT
)_typesz
[_T_POI
]);
_lenname
= strcopy
("PBYTE", 5, _name
);
addlbl
(_T_TYPE
+ _T_POI
+ _T_BYTE
, +FALSE
, (UINT
)_typesz
[_T_POI
]);
_lenname
= strcopy
("PBOOL", 5, _name
);
addlbl
(_T_TYPE
+ _T_POI
+ _T_BOOL
, +FALSE
, (UINT
)_typesz
[_T_POI
]);
_lenname
= strcopy
("PLONG", 5, _name
);
addlbl
(_T_TYPE
+ _T_POI
+ _T_LONG
, +FALSE
, (UINT
)_typesz
[_T_POI
]);
_lenname
= strcopy
("PCHAR", 5, _name
);
addlbl
(_T_TYPE
+ _T_POI
+ _T_CHAR
, +FALSE
, (UINT
)_typesz
[_T_POI
]);
_lenname
= strcopy
("PFLOAT", 6, _name
);
addlbl
(_T_TYPE
+ _T_POI
+ _T_FLOAT
, +FALSE
, (UINT
)_typesz
[_T_POI
]);
//_lenname = strcopy("PPROC", 5, _name);
//addlbl(_T_TYPE + _T_POI + _T_PROC, +FALSE, (UINT)_typesz[_T_POI]);
_lentitle
= 0/**strclear(_title)*/;
POKE
*(PCHAR
)(_title
) = '\0'; //strclose(_title, _lentitle);
_namespclvl
= 0x00;
//_exprlvl = 0x00; //ёхщўрё тхчфх ЁрёёЄртыхэю 0 (ьюцэю юяЄшьшчшЁютрЄ№ ёЁртэхэш ) шыш 1 (эхы№ч ) шыш inc-dec (фы тыюцхээ√ї т√ўшёыхэшщ Єюцх эхы№ч )
_addrexpr
= +FALSE
;
_isexp
= +FALSE
;
_curfunct
= _T_UNKNOWN
; //эр тё ъшщ ёыєўрщ
_wasreturn
= +FALSE
; //ёсЁюёшЄ№ яЁютхЁъє "юяхЁрЄюЁ яюёых return"
_lenjoined
= strjoineollast
(_joined
, 0, fn
, '.');
_lenjoined
= strjoin
(_joined
, _lenjoined
, ".ast");
_joined
[_lenjoined
] = '\0'; //strclose(_joined, _lenjoined);
_fout
= openwrite
(_joined
);
_lenjoined
= strjoineollast
(_joined
, 0, fn
, '.');
_lenjoined
= strjoin
(_joined
, _lenjoined
, ".var");
_joined
[_lenjoined
] = '\0'; //strclose(_joined, _lenjoined);
_fvar
= openwrite
(_joined
);
_nhinclfiles
= 0x00;
initcmd
();
initcode
(); //т√ч√трхЄ emitregs
compfile
(fn
);
endcode
();
fclose(_fvar
);
fclose(_fout
);
}