// ---- ८¡à §®¢ ¨¥ ⥪ã饣® ᨬ¢®« ¤«ï ª®áâãªæ¨© ⨯ : \n, \x00, â.¯. byte ConvertChar() dword hold; { IF(cha!='\\')return(cha); NextChar(); // Ž¡à ¡®âª á«¥¤ãî饣® § \ IF(AL>='0')&&(AL<='9'){ // „¥áïâ¨ç ï ª®áâ â EDX=0; AL-='0'; EAX=AL; EDX+=EAX; ECX=2; loop(ECX){ EBX=EDX; EDX<<=1; EBX<<=3; EDX+=EBX; NextChar(); EAX=AL; IF(AL<'0')||(AL>'9')GOTO ERR; AL-='0'; EDX+=EAX; } return(DL); ERR: expectederror("decimal digit"); return(0); } IF(cha=='a')return('\a'); IF(cha=='b') return('\b'); IF(cha=='f') return('\f'); IF(cha=='l') return(10); IF(cha=='n') return(13); IF(cha=='p') return('_'); IF(cha=='r') return(13); IF(cha=='t') return('\t'); IF(cha=='v') return('\v'); IF(cha=='x'){ // HEX ª®áâ â ECX=2; hold=0; loop(ECX){ $PUSH ECX; NextChar(); CharUpperA(AL); EBX=AL; IF(AL>='0')&&(AL<='9')GOTO LX1; IF(AL<'A')&&(AL>'F')GOTO ERR1; LX1: EDX=hold; EDX<<=4; IF(BL>='A')BL-='A'-10-'0'; BL-='0'; EDX+=EBX; hold=EDX; $POP ECX; } return(hold); ERR1: $POP ECX; expectederror("hexdecimal digit"); return(0); } return(cha); } // ---- §¤¥«¨â¥«¨ byte Delim1={'#','\"','\'','-','+','*','/','%','|','&','!','^','=','>','<','@',0}; byte Delim2={':',';','(',')','{','}','[',']',',','.','$','?','~',0}; // ---- Ž¯à¥¤¥«¥¨¥ ⨯ token TokScan(dword tok4,type4,src4,post4,string4,number4) dword useme,strptr; dword next; dword dirPrefix,locPrefix;// ”« £¨ ®¡ à㦥¨ï #directive ¨«¨ @LocalLabel { dirPrefix=0; locPrefix=0; SC_0: strptr=string4; next=1; EAX=number4; DSDWORD[EAX] = 0; EAX=type4; DSDWORD[EAX] = 0; EAX=src4; DSDWORD[EAX] = 0; EAX=post4; DSDWORD[EAX] = 0; WhiteSpaces(); ESI=string4; DSBYTE[ESI]=0; ECX=17; EDI=#Delim1; AL=cha; $REPNZ $SCASB; $JCXZ SC00 // ¥ ¯¥à¢ ï £à㯯 à §¤¥«¨â¥«¥ EDI=EDI-#Delim1-1<<2+#Jmp_Delim1; $JMP NEAR DSDWORD[EDI]; SC00: ECX=14; EDI=#Delim2; AL=cha; $REPNZ $SCASB; $JCXZ SC01 // ¥ ¢â®à ï £à㯯 à §¤¥«¨â¥«¥ EDI=EDI-#Delim2-1+#tk_delim2; EAX=DSBYTE[EDI]; EBX=tok4; DSDWORD[EBX]=EAX; $JMP ScEx SC01: IF(locPrefix){ EDI><strptr; AL='@'; $STOSB; strptr><EDI; } IF(cha==0){ // Š®¥æ ¢å®¤®£® ¡ãä¥à EAX=tok4; DSDWORD[EAX]=tk_eof; next=0; } else if(IsCharAlphaA(cha))||(cha=='_'){ // ˆ¤¥â¨ä¨ª â®à ç¨ ¥âáï á ¡ãª¢ë do{ do{ // Š®¯¨à㥬 ¨¤¥â¨ä¨ª â®à ¢ string4 UP: EDI><strptr; AL=cha; $STOSB; strptr><EDI; NextChar(); }while(IsCharAlphaNumericA(cha)); }while(cha=='_'); EAX=strptr-string4; IF(EAX>=IDLENGTH){ preerror("Maximum length for an identifier exceeded"); strptr = string4 + IDLENGTH - 1; } EDI=strptr; AL=0; $STOSB EBX=tok4; DSDWORD[EBX]=tk_id; IF(locPrefix)goto FL; FastSearch(string4,#St_Directives); // â® § १¥à¢¨à®¢ ®¥ á«®¢®? IF(CARRYFLAG){ // Š®¬ ¤ ®¡ à㦥 ¢ ᯨ᪥ EBX=number4; DSDWORD[EBX]=EAX; // ‡ ¯®¬¨¬ ¯®à浪®¢ë© ®¬¥à EBX=tok4; // “ª ¦¥¬ ᮮ⢥âáâ¢ãî騩 token IF(dirPrefix)DSDWORD[EBX]=tk_directive; ELSE DSDWORD[EBX]=tk_command; dirPrefix=0; next=0; $JMP ScEx } FastSearch(string4,#St_Mnemonics); // â® ¬¥¬®¨ª ? IF(CARRYFLAG){ // Œ¥¬®¨ª áᥬ¡«¥à EBX=number4; DSDWORD[EBX]=EAX; // ‡ ¯®¬¨¬ ®¬¥à ¬¥¬®¨ª¨ EBX=tok4; DSDWORD[EBX]=tk_mnemonics; next=0; $JMP ScEx } FastSearch(string4,#St_Registers); // â® ¨¬ï ॣ¨áâà ? IF(CARRYFLAG){ // ¥£¨áâà EBX=number4; DSDWORD[EBX]=EAX; // ‡ ¯®¬¨¬ ®¬¥à ॣ¨áâ EAX>>=3; $CMP EAX,2; $JG R0 // “¯à ¢«ïî騥 ॣ¨áâàë? EBX=tok4; DSDWORD[EBX]=tk_reg; EBX=type4; EAX<<=1; DSDWORD[EBX] = EAX + tk_byte; GOTO R1; R0: EBX=tok4; EAX-=3; DSDWORD[EBX]=EAX+tk_controlreg; R1: next=0; $JMP ScEx } FL: EAX=tok4; EAX=DSDWORD[EAX]; IF(AL==tk_id){ SearchLocals(tok4,type4,string4,number4); // …áâì ¢ ᯨ᪥ «®ª «ìëå? EAX=tok4; EAX=DSDWORD[EAX]; IF(AL==tk_id){ IF(locPrefix){ // @label EBX=tok4; DSDWORD[EBX]=tk_locallabel; IF(displaytokerrors)AddLocalvar(#string,tk_locallabel,0,0); locPrefix=0; GOTO FL; } SearchTree(tok4,type4,src4,post4,string4,number4); } } IF(dirPrefix){ // Š®áâàãªæ¨ï: #ident dirPrefix=0; EBX=tok4; EAX=DSDWORD[EBX]; IF(AL==tk_id){ // …áâì ¢ ᯨ᪥? IF(displaytokerrors){ EAX=post4; DSDWORD[EAX] = 1; // „®¡ ¢¨¬ ¢ ᯨ᮪ EBX=tok4; DSDWORD[EBX]=tk_undefproc; AddToTree(string4); } } // ˆ¤¥â¨ä¨ª â®à ¥áâì ¢ ᯨ᪥ EAX=post4; EAX=DSDWORD[EAX]; EBX=tok4; IF(EAX){ // …é¥ ¥ ®¡à ¡®â ë© ¨¤¥â¨ä¨ª â®à? DSDWORD[EBX] = tk_postnumber; } ELSE{ EAX=tok4; EAX=DSDWORD[EAX]; IF(EAX==tk_param)DSDWORD[EBX] = tk_locnumber; ELSE IF(EAX==tk_local)DSDWORD[EBX] = tk_locnumber; ELSE DSDWORD[EBX] = tk_number; } } next=0; $JMP ScEx } else if(IsNumber(cha)){ // ˆ¤¥â¨ä¨ª â®à ç¨ ¥âáï á æ¨äàë EAX=tok4; DSDWORD[EAX]=tokens; // ®ª ¥¨§¢¥áâë© token if(cha=='0'){ NextChar(); IF(cha=='X')||(cha=='x'){ // hex - ç¨á«® EAX=tok4; DSDWORD[EAX]=tk_number; HEX: NextChar(); CharUpperA(AL); $CMP AL,'0'; $JL EHEX; $CMP AL,'9'; $JA HEXAF AL-='0'; for(;;){ EBX=number4; ECX=DSDWORD[EBX]; ECX<<=4; EAX+=ECX; DSDWORD[EBX]=EAX; GOTO HEX; HEXAF: IF(AL<'A')||(AL>'F')BREAK; AL-='7'; } EHEX: } ELSE IF(cha=='B')||(cha=='b'){ // binary ç¨á«® EAX=tok4; DSDWORD[EAX]=tk_number; for(;;){ NextChar(); IF(AL!='0')||(AL!='1')BREAK; AL-='0'; EBX=number4; ECX=DSDWORD[EBX]; ECX<<=1; EAX+=ECX; DSDWORD[EBX]=EAX; } EBIN: } ELSE IF(cha=='O')||(cha=='o'){ // octal ç¨á«® EAX=tok4; DSDWORD[EAX]=tk_number; for(;;){ NextChar(); IF(AL<'0')||(AL>'7')BREAK; AL-='0'; EBX=number4; ECX=DSDWORD[EBX]; ECX<<=3; EAX+=ECX; DSDWORD[EBX]=EAX; } EOCT: } } EAX=tok4; EAX=DSDWORD[EAX]; IF(EAX!=tk_number){ // decimal ç¨á«® for(;;){ EAX=cha; IF(AL<'0')||(AL>'9')BREAK; AL-='0'; EBX=number4; EDX=DSDWORD[EBX]; ECX=EDX; EDX<<=1; ECX<<=3; EDX+=ECX; EAX+=EDX; DSDWORD[EBX]=EAX; NextChar(); } EAX=tok4; DSDWORD[EAX]=tk_number; } next=0; } ELSE{ IF(displaytokerrors)preerror("tokenizer: bad character value"); NextChar(); TokScan(tok4,type4,src4,post4,string4,number4); next=0; } $JMP ScEx Jmp_Number: // #directive || #identifier NextChar(); dirPrefix=1; $JMP SC_0 Jmp_Local: // @LocalLabel NextChar(); locPrefix=1; $JMP SC01 Jmp_String: // ‘âப ᨬ¢®«®¢ ¢ "" do{ NextChar(); IF(cha=='\"') // ‡ ªàë¢ îé ï ª ¢ëçª BREAK; EAX=strptr-string4; IF(EAX<STRLEN-1 ){ AL=ConvertChar(); EDI=strptr; $STOSB; IF(AL==13)&&(cha=='n'){ AL=10; $STOSB } // „®¡ ¢¨¬ char 10 ¤«ï \n strptr=EDI; } ELSE{ IF(displaytokerrors)preerror("Maximum String Length Exceeded"); WHILE(cha!='\"'){ // ®¨áª § ªàë¢ î饩 ª ¢ë窨 IF(endoffile)BREAK; NextChar(); } BREAK; } }while(cha==0); EDI=strptr; DSBYTE[EDI]=0; EDI-=string4; EAX=tok4; DSDWORD[EAX]=tk_string; EAX=number4; DSDWORD[EAX] = EDI; // ‡ ¯®¬¨¬ ¤«¨ã áâப IF(cha!='\"')expected('\"'); $JMP ScEx Jmp_Const: // ‘¨¬¢®«ì ï ª®áâ â : 'AbCD' NextChar(); EAX=tok4; DSDWORD[EAX]=tk_number; EAX=number4; DSDWORD[EAX] = 0; WHILE(cha != '\''){ IF(endoffile)BREAK; EAX=ConvertChar(); EBX=number4; ECX=DSDWORD[EBX]; ECX<<=8; EAX+=ECX; DSDWORD[EBX]=EAX; NextChar(); } IF(cha != '\''){ IF(displaytokerrors) expected(0x27/*'\''*/); } ELSE NextChar(); next = 0; $JMP ScEx Jmp_Minus: // - NextChar(); EBX=tok4; IF(cha=='=') DSDWORD[EBX]=tk_minusequals; // -= ELSE IF(cha=='-') DSDWORD[EBX]=tk_minusminus; // -- ELSE{ DSDWORD[EBX]=tk_minus; next = 0; } // - $JMP ScEx Jmp_Plus: // + NextChar(); EBX=tok4; IF(cha=='=')DSDWORD[EBX]=tk_plusequals; // += ELSE IF(cha=='+') DSDWORD[EBX]=tk_plusplus; // ++ ELSE{ WhiteSpaces(); EBX=tok4; // ¢®§¬®¦® «¨ç¨¥ ¯à®¡¥«®¢ IF(cha=='-')DSDWORD[EBX]=tk_minus; // ®¯â¨¬¨§ æ¨ï + - ELSE{ DSDWORD[EBX]=tk_plus; next = 0; } } $JMP ScEx Jmp_Mul: // * NextChar(); WhiteSpaces(); EBX=tok4; IF(cha == '-')DSDWORD[EBX] = tk_multminus; // *- ELSE{ DSDWORD[EBX] = tk_mult; next=0; // * } $JMP ScEx Jmp_Div: // / NextChar(); if(cha=='*'){ // Š®¬¬¥â ਩ NextChar(); useme = 1; // ‚ useme - áç¥â稪 ¢«®¦¥ëå ª®¬¬¥â ਥ¢ WHILE(useme>0){ WhiteSpaces(); IF( cha == '*' ){ NextChar(); IF(cha == '/' ){ // ‡ ªàë⨥ ª®¬¬¥â à¨ï IF(useme > 0)useme--; // “¬¥¨è¨¬ áç¥â稪 NextChar(); } } ELSE{ IF( cha == '/' ){ NextChar(); IF( cha == '*' ){ // ‚«®¦¥ë© ª®¬¬¥â ਩ useme++; NextChar(); } } ELSE // ¥ ®£à ¨ç¨â¥«¨ ª®¬¬¥â à¨ï NextChar(); } } IF(endoffile){ EAX=tok4; DSDWORD[EAX]=tk_eof; IF(useme > 0)&&(displaytokerrors)unexpectedeof(); } ELSE TokScan(tok4,type4,src4,post4,string4,number4); } ELSE IF(cha=='/'){ // Š®¬¬¥â ਩ ¤® ª®æ áâப¨ // do{ NextChar(); IF(endoffile)BREAK; } while(cha!=10 ); IF(endoffile){ EAX=tok4; DSDWORD[EAX]=tk_eof; } ELSE{ WhiteSpaces(); TokScan(tok4,type4,src4,post4,string4,number4); } } ELSE{ WhiteSpaces(); IF(cha=='-'){ EAX=tok4; DSDWORD[EAX]=tk_divminus; // /- NextChar(); } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_div; // / } } next = 0; $JMP ScEx Jmp_Mod: // % NextChar(); WhiteSpaces(); IF(cha == '-'){ EAX=tok4; DSDWORD[EAX] = tk_modminus; // %- } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_mod; next=0; } $JMP ScEx Jmp_Or: // | NextChar(); IF(cha=='='){ EAX=tok4; DSDWORD[EAX]=tk_orequals; // |= } ELSE IF(cha=='|'){ EAX=tok4; DSDWORD[EAX]=tk_oror; // || } ELSE{ WhiteSpaces(); IF(cha=='-'){ EAX=tok4; DSDWORD[EAX]=tk_orminus; // |- } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_or; next=0; // | } } $JMP ScEx Jmp_And: // & NextChar(); IF(cha=='='){ EAX=tok4; DSDWORD[EAX]=tk_andequals; // &= } ELSE IF(cha=='&'){ EAX=tok4; DSDWORD[EAX]=tk_andand; // && } ELSE{ WhiteSpaces(); IF(cha == '-'){ EAX=tok4; DSDWORD[EAX]=tk_andminus; // &- } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_and; next=0;// & } } $JMP ScEx Jmp_Not: // ! NextChar(); IF(cha == '='){ EAX=tok4; DSDWORD[EAX]=tk_notequal; // != } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_not; next=0; // ! } $JMP ScEx Jmp_Xor: // ^ NextChar(); IF(cha == '='){ EAX=tok4; DSDWORD[EAX]=tk_xorequals; // ^= } ELSE{ WhiteSpaces(); IF(cha == '-'){ EAX=tok4; DSDWORD[EAX]=tk_xorminus; // ^- } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_xor; next=0; // ^ } } $JMP ScEx Jmp_Equal: // = NextChar(); IF(cha == '='){ EAX=tok4; DSDWORD[EAX]=tk_equalto; // == } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_assign; next=0; // = } $JMP ScEx Jmp_Great: // > NextChar(); IF(cha=='>'){ NextChar(); IF( cha == '=' ){ EAX=tok4; DSDWORD[EAX]=tk_rrequals; // >>= } ELSE{ WhiteSpaces(); IF(cha == '-'){ EAX=tok4; DSDWORD[EAX]=tk_rrminus; // >>- } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_rr; next=0;// >> } } } ELSE IF(cha=='<'){ EAX=tok4; DSDWORD[EAX]=tk_swap; // >< } ELSE IF(cha=='='){ EAX=tok4; DSDWORD[EAX]=tk_greaterequal; // >= } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_greater; next= 0; // > } GOTO ScEx; Jmp_Less: // < NextChar(); IF(cha=='<'){ NextChar(); IF(cha=='='){ EAX=tok4; DSDWORD[EAX]=tk_llequals; // <<= } ELSE{ WhiteSpaces(); IF(cha == '-'){ EAX=tok4; DSDWORD[EAX]=tk_llminus; // <<- } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_ll; next=0; } } } ELSE IF(cha=='>'){ EAX=tok4; DSDWORD[EAX]=tk_notequal; // <> } ELSE IF(cha=='='){ EAX=tok4; DSDWORD[EAX]=tk_lessequal; // <= } ELSE{ EAX=tok4; DSDWORD[EAX]=tk_less; next=0; // < } ScEx: IF(next)NextChar(); } // '#','\"','\'','-','+','*','/','%','|','&','!','^','=','>','<','@' dword Jmp_Delim1={#Jmp_Number,#Jmp_String,#Jmp_Const,#Jmp_Minus, #Jmp_Plus,#Jmp_Mul,#Jmp_Div,#Jmp_Mod,#Jmp_Or,#Jmp_And, #Jmp_Not,#Jmp_Xor,#Jmp_Equal,#Jmp_Great,#Jmp_Less,#Jmp_Local}; // ':', ';', '(', ')', byte tk_delim2={tk_colon,tk_semicolon,tk_openbracket,tk_closebracket, // '{', '}', '[', ']', ',', tk_openbrace,tk_closebrace,tk_openblock,tk_closeblock,tk_comma, //'.', '$', '?', '~' tk_period,tk_dollar,tk_question,tk_tilda};