📄 swf5compiler.y
字号:
else // expr [ expr ] { $$ = $2.memexpr; /* i */ bufferConcat($$, $2.obj); /* i, a */ bufferWriteSetRegister($$, 0); /* ($2.memexpr can use reg0) */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, i, i */ bufferWriteRegister($$, 0); /* a, i, i, a */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ bufferWriteOp($$, $1); /* a, i, a[i]+1 */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ bufferWriteRegister($$, 0); /* a[i]+1 */ } } else // identifier { $$ = newBuffer(); bufferWriteBuffer($$, $2.ident); bufferWriteOp($$, SWFACTION_GETVARIABLE); bufferWriteOp($$, $1); bufferWriteOp($$, SWFACTION_PUSHDUP); bufferConcat($$, $2.ident); bufferWriteOp($$, SWFACTION_STACKSWAP); bufferWriteOp($$, SWFACTION_SETVARIABLE); } } | lvalue incdecop %prec POSTFIX { if($1.obj) { if($1.ident) { $$ = $1.obj; /* a */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, a */ bufferWriteBuffer($$, $1.ident); /* a, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_STACKSWAP); /* a.i, a */ bufferConcat($$, $1.ident); /* a.i, a, i */ bufferWriteRegister($$, 0); /* a.i, a, i, a.i */ bufferWriteOp($$, $2); /* a.i, a, i, a.i+1 */ bufferWriteOp($$, SWFACTION_SETMEMBER); } else { $$ = $1.memexpr; bufferConcat($$, $1.obj); /* i, a */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, i, i */ bufferWriteRegister($$, 0); /* a, i, i, a */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, $2); /* a, i, a[i]+1 */ bufferWriteOp($$, SWFACTION_SETMEMBER); bufferWriteRegister($$, 0); /* a[i] */ } } else { $$ = newBuffer(); bufferWriteBuffer($$, $1.ident); bufferWriteOp($$, SWFACTION_GETVARIABLE); bufferWriteOp($$, SWFACTION_PUSHDUP); bufferWriteOp($$, $2); bufferConcat($$, $1.ident); bufferWriteOp($$, SWFACTION_STACKSWAP); bufferWriteOp($$, SWFACTION_SETVARIABLE); } } | '(' expr ')' { $$ = $2; } | lvalue assignop expr { if($1.obj) { if($1.ident) { $$ = $1.obj; /* a */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, a */ bufferWriteBuffer($$, $1.ident); /* a, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ bufferConcat($$, $3); /* a, a.i, v */ bufferWriteOp($$, $2); /* a, a.i+v */ bufferConcat($$, $1.ident); /* a, a.i+v, i */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a.i+v */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+v */ bufferWriteRegister($$, 0); } else { $$ = $1.memexpr; /* i */ bufferConcat($$, $1.obj); /* i, a */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, i, i */ bufferWriteRegister($$, 0); /* a, i, i, a */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ bufferConcat($$, $3); /* a, i, a[i], v */ bufferWriteOp($$, $2); /* a, i, a[i]+v */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+v */ bufferWriteRegister($$, 0); } } else { $$ = $1.ident; bufferWriteOp($$, SWFACTION_PUSHDUP); bufferWriteOp($$, SWFACTION_GETVARIABLE); bufferConcat($$, $3); bufferWriteOp($$, $2); bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_SETVARIABLE); bufferWriteRegister($$, 0); } } ;primary_constant : BOOLEAN { $$ = newBuffer(); bufferWriteBoolean($$, $1); } | NULLVAL { $$ = newBuffer(); bufferWriteNull($$); } | UNDEFINED { $$ = newBuffer(); bufferWriteUndef($$); } | STRING { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); free($1); } | INTEGER { $$ = newBuffer(); bufferWriteInt($$, $1); } | DOUBLE { $$ = newBuffer(); bufferWriteDouble($$, $1); } ;init_vars : init_var | init_vars ',' init_var { $$ = $1; bufferConcat($$, $3); } ;init_var : identifier type_attr '=' expr_or_obj { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); free($1); bufferConcat($$, $4); bufferWriteOp($$, SWFACTION_DEFINELOCAL); } | identifier type_attr { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); free($1); bufferWriteOp($$, SWFACTION_DEFINELOCAL2); } ;assign_stmt : ASM '{' { asmBuffer = newBuffer(); } opcode_list '}' { $$ = asmBuffer; } | VAR init_vars { $$ = $2; } | void_function_call | delete_call { $$ = $1; bufferWriteOp($$, SWFACTION_POP); } | function_call { $$ = $1; bufferWriteOp($$, SWFACTION_POP); } | method_call { $$ = $1; bufferWriteOp($$, SWFACTION_POP); } | incdecop lvalue %prec INCR { if($2.obj) { if($2.ident) { $$ = $2.obj; /* a */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, a */ bufferWriteBuffer($$, $2.ident); /* a, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ bufferWriteOp($$, $1); /* a, a.i+1 */ bufferConcat($$, $2.ident); /* a, a.i+1, i */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a.i+1 */ bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+1 */ } else { /* weird contortions so that $2.memexpr can use reg 0 */ $$ = $2.memexpr; /* i */ bufferConcat($$, $2.obj); /* i, a */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, i, i */ bufferWriteRegister($$, 0); /* a, i, i, a */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ bufferWriteOp($$, $1); /* a, i, a[i]+1 */ bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ } } else { $$ = $2.ident; bufferWriteOp($$, SWFACTION_PUSHDUP); bufferWriteOp($$, SWFACTION_GETVARIABLE); bufferWriteOp($$, $1); bufferWriteOp($$, SWFACTION_SETVARIABLE); } } | lvalue incdecop %prec POSTFIX { if($1.obj) { if($1.ident) { $$ = $1.obj; /* a */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, a */ bufferWriteBuffer($$, $1.ident); /* a, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ bufferWriteOp($$, $2); /* a, a.i+1 */ bufferConcat($$, $1.ident); /* a, a.i+1, i */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a.i+1 */ bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+1 */ } else { /* weird contortions so that $1.memexpr can use reg 0 */ $$ = $1.memexpr; /* i */ bufferConcat($$, $1.obj); /* i, a */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, i, i */ bufferWriteRegister($$, 0); /* a, i, i, a */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ bufferWriteOp($$, $2); /* a, i, a[i]+1 */ bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+1 */ } } else { $$ = $1.ident; bufferWriteOp($$, SWFACTION_PUSHDUP); bufferWriteOp($$, SWFACTION_GETVARIABLE); bufferWriteOp($$, $2); bufferWriteOp($$, SWFACTION_SETVARIABLE); } } | lvalue '=' expr_or_obj { if($1.obj) { $$ = $1.obj; if($1.ident) bufferConcat($$, $1.ident); else bufferConcat($$, $1.memexpr); bufferConcat($$, $3); bufferWriteOp($$, SWFACTION_SETMEMBER); } else { $$ = $1.ident; bufferConcat($$, $3); bufferWriteOp($$, SWFACTION_SETVARIABLE); } } | lvalue assignop expr { if($1.obj) { if($1.ident) { $$ = $1.obj; /* a */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, a */ bufferWriteBuffer($$, $1.ident); /* a, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, a.i */ bufferConcat($$, $3); /* a, a.i, v */ bufferWriteOp($$, $2); /* a, a.i+v */ bufferConcat($$, $1.ident); /* a, a.i+v, i */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a.i+v */ bufferWriteOp($$, SWFACTION_SETMEMBER); /* a.i = a.i+v */ } else { $$ = $1.memexpr; /* i */ bufferConcat($$, $1.obj); /* i, a */ bufferWriteSetRegister($$, 0); bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i */ bufferWriteOp($$, SWFACTION_PUSHDUP); /* a, i, i */ bufferWriteRegister($$, 0); /* a, i, i, a */ bufferWriteOp($$, SWFACTION_STACKSWAP); /* a, i, a, i */ bufferWriteOp($$, SWFACTION_GETMEMBER); /* a, i, a[i] */ bufferConcat($$, $3); /* a, i, a[i], v */ bufferWriteOp($$, $2); /* a, i, a[i]+v */ bufferWriteOp($$, SWFACTION_SETMEMBER); /* a[i] = a[i]+v */ } } else { $$ = $1.ident; bufferWriteOp($$, SWFACTION_PUSHDUP); bufferWriteOp($$, SWFACTION_GETVARIABLE); bufferConcat($$, $3); bufferWriteOp($$, $2); bufferWriteOp($$, SWFACTION_SETVARIABLE); } } ;/* assembler stuff */opcode_list : opcode | opcode_list opcode { $$ = $1 + $2; } ;with : WITH { $$ = bufferWriteOp(asmBuffer, SWFACTION_WITH); } opcode_list END { $$ = $<len>2 + $3; bufferPatchLength(asmBuffer, $3); } ;push_item : STRING { $$ = bufferWriteConstantString(asmBuffer, $1, strlen($1)+1); } | INTEGER { $$ = bufferWriteInt(asmBuffer, $1); } | DOUBLE { $$ = bufferWriteDouble(asmBuffer, $1); } | BOOLEAN { bufferWriteU8(asmBuffer, PUSH_BOOLEAN); $$ = bufferWriteU8(asmBuffer, $1)+1; bufferPatchPushLength(asmBuffer, 2); } | NULLVAL { $$ = bufferWriteU8(asmBuffer, PUSH_NULL); bufferPatchPushLength(asmBuffer, 1); } | UNDEFINED { $$ = bufferWriteU8(asmBuffer, PUSH_UNDEF); bufferPatchPushLength(asmBuffer, 1); } | REGISTER { bufferWriteU8(asmBuffer, PUSH_REGISTER); $$ = bufferWriteU8(asmBuffer, (char)atoi($1))+1; bufferPatchPushLength(asmBuffer, 2); } ;push_list : push_item { $$ = $1; } | push_list ',' push_item { $$ = $1 + $3; } ;opcode : PUSH { $$ = bufferWritePushOp(asmBuffer); $$ += bufferWriteS16(asmBuffer, 0); } push_list { $$ = $<len>2 + $3; bufferPatchLength(asmBuffer, $3); } | with | SETREGISTER REGISTER { $$ = bufferWriteOp(asmBuffer, SWFACTION_STOREREGISTER); $$ += bufferWriteS16(asmBuffer, 1); $$ += bufferWriteU8(asmBuffer, (char)atoi($2)); } /* no args */ | CALLFUNCTION { $$ = bufferWriteOp(asmBuffer, SWFACTION_CALLFUNCTION); } | RETURN { $$ = bufferWriteOp(asmBuffer, SWFACTION_RETURN); } | CALLMETHOD { $$ = bufferWriteOp(asmBuffer, SWFACTION_CALLMETHOD); } | NEWOBJECT { $$ = bufferWriteOp(asmBuffer, SWFACTION_NEWOBJECT); } | NEWMETHOD { $$ = bufferWriteOp(asmBuffer, SWFACTION_NEWMETHOD); } | AND { $$ = bufferWriteOp(asmBuffer, SWFACTION_BITWISEAND); } | OR { $$ = bufferWriteOp(asmBuffer, SWFACTION_BITWISEOR); } | XOR { $$ = bufferWriteOp(asmBuffer, SWFACTION_BITWISEXOR); } | MODULO { $$ = bufferWriteOp(asmBuffer, SWFACTION_MODULO); } | ADD { $$ = bufferWriteOp(asmBuffer, SWFACTION_ADD2); } | LESSTHAN { $$ = bufferWriteOp(asmBuffer, SWFACTION_LESS2); } | EQUALS { $$ = bufferWriteOp(asmBuffer, SWFACTION_EQUALS2); } | INC { $$ = bufferWriteOp(asmBuffer, SWFACTION_INCREMENT); } | DEC { $$ = bufferWriteOp(asmBuffer, SWFACTION_DECREMENT); } | TYPEOF { $$ = bufferWriteOp(asmBuffer, SWFACTION_TYPEOF); } | INSTANCEOF { $$ = bufferWriteOp(asmBuffer, SWFACTION_INSTANCEOF); } | ENUMERATE { $$ = bufferWriteOp(asmBuffer, SWFACTION_ENUMERATE); } | DELETE { $$ = bufferWriteOp(asmBuffer, SWFACTION_DELETE); } | NEW { $$ = bufferWriteOp(asmBuffer, SWFACTION_NEWOBJECT); } | INITARRAY { $$ = bufferWriteOp(asmBuffer, SWFACTION_INITARRAY); } | INITOBJECT { $$ = bufferWriteOp(asmBuffer, SWFACTION_INITOBJECT); } | GETMEMBER { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETMEMBER); } | SETMEMBER { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETMEMBER); } | SHIFTLEFT { $$ = bufferWriteOp(asmBuffer, SWFACTION_SHIFTLEFT); } | SHIFTRIGHT { $$ = bufferWriteOp(asmBuffer, SWFACTION_SHIFTRIGHT); } | SHIFTRIGHT2 { $$ = bufferWriteOp(asmBuffer, SWFACTION_SHIFTRIGHT2); } | VAR { $$ = bufferWriteOp(asmBuffer, SWFACTION_DEFINELOCAL2); } | EXTENDS { $$ = bufferWriteOp(asmBuffer, SWFACTION_EXTENDS); } | TARGETPATH { $$ = bufferWriteOp(asmBuffer, SWFACTION_TARGETPATH); } | IMPLEMENTS { $$ = bufferWriteOp(asmBuffer, SWFACTION_IMPLEMENTSOP); } | FSCOMMAND2 { $$ = bufferWriteOp(asmBuffer, SWFACTION_FSCOMMAND2); } | CAST { $$ = bufferWriteOp(asmBuffer, SWFACTION_CASTOP); } /* f4 ops */ | OLDADD { $$ = bufferWriteOp(asmBuffer, SWFACTION_ADD); } | SUBTRACT { $$ = bufferWriteOp(asmBuffer, SWFACTION_SUBTRACT); } | MULTIPLY { $$ = bufferWriteOp(asmBuffer, SWFACTION_MULTIPLY); } | DIVIDE { $$ = bufferWriteOp(asmBuffer, SWFACTION_DIVIDE); } | OLDEQUALS { $$ = bufferWriteOp(asmBuffer, SWFACTION_EQUAL); } | OLDLESSTHAN { $$ = bufferWriteOp(asmBuffer, SWFACTION_LESSTHAN); } | LOGICALAND { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALAND); } | LOGICALOR { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALOR); } | NOT { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALNOT); } | STRINGEQ { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGEQ); } | STRINGLENGTH { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGLENGTH); } | SUBSTRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_SUBSTRING); } | INT { $$ = bufferWriteOp(asmBuffer, SWFACTION_INT); } | DUP { $$ = bufferWriteOp(asmBuffer, SWFACTION_PUSHDUP); } | SWAP { $$ = bufferWriteOp(asmBuffer, SWFACTION_STACKSWAP); } | POP { $$ = bufferWriteOp(asmBuffer, SWFACTION_POP); } | GETVARIABLE { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETVARIABLE); } | SETVARIABLE { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETVARIABLE); } | GETPROPERTY { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETPROPERTY); } | SETPROPERTY { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETPROPERTY); } | TONUMBER { $$ = bufferWriteOp(asmBuffer, SWFACTION_TONUMBER); } | TOSTRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_TOSTRING); } | SETTARGETEXPRESSION { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETTARGET2); } | CONCAT { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGCONCAT); } | DUPLICATEMOVIECLIP { $$ = bufferWriteOp(asmBuffer, SWFACTION_DUPLICATECLIP); } | REMOVEMOVIECLIP { $$ = bufferWriteOp(asmBuffer, SWFACTION_REMOVECLIP); } | TRACE { $$ = bufferWriteOp(asmBuffer, SWFACTION_TRACE); } | STRINGLESSTHAN { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGCOMPARE); } | RANDOM { $$ = bufferWriteOp(asmBuffer, SWFACTION_RANDOMNUMBER); } | MBLENGTH { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBLENGTH); } | ORD { $$ = bufferWriteOp(asmBuffer, SWFACTION_ORD); } | CHR { $$ = bufferWriteOp(asmBuffer, SWFACTION_CHR); } | GETTIMER { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETTIME); } | MBSUBSTRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBSUBSTRING); } | MBORD { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBORD); } | MBCHR { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBCHR); } /* with args */ | BRANCHALWAYS STRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_JUMP); $$ += bufferWriteS16(asmBuffer, 2); $$ += bufferBranchTarget(asmBuffer, $2); } | BRANCHIFTRUE STRING { $$ = bufferWriteOp(asmBuffer, SWFACTION_IF); $$ += bufferWriteS16(asmBuffer, 2); $$ += bufferBranchTarget(asmBuffer, $2); } ;property : STRING { $$ = lookupProperty($1); } // Ming extension ! | _P_X { $$ = PROPERTY_X; } | _P_Y { $$ = PROPERTY_Y; } | _P_XSCALE { $$ = PROPERTY_XSCALE; } | _P_YSCALE { $$ = PROPERTY_YSCALE; } | _P_CURRENTFRAME { $$ = PROPERTY_CURRENTFRAME; } | _P_TOTALFRAMES { $$ = PROPERTY_TOTALFRAMES; } | _P_ALPHA { $$ = PROPERTY_ALPHA; } | _P_VISIBLE { $$ = PROPERTY_VISIBLE; } | _P_WIDTH { $$ = PROPERTY_WIDTH; } | _P_HEIGHT { $$ = PROPERTY_HEIGHT; } | _P_ROTATION { $$ = PROPERTY_ROTATION; } | _P_TARGET { $$ = PROPERTY_TARGET; } | _P_FRAMESLOADED { $$ = PROPERTY_FRAMESLOADED; } | _P_NAME { $$ = PROPERTY_NAME; } | _P_DROPTARGET { $$ = PROPERTY_DROPTARGET; } | _P_URL { $$ = PROPERTY_URL; } | _P_HIGHQUALITY { $$ = PROPERTY_HIGHQUALITY; } | _P_FOCUSRECT { $$ = PROPERTY_FOCUSRECT; } | _P_SOUNDBUFTIME { $$ = PROPERTY_SOUNDBUFTIME; } | _P_QUALITY { $$ = PROPERTY_QUALITY; } | _P_XMOUSE { $$ = PROPERTY_XMOUSE; } | _P_YMOUSE { $$ = PROPERTY_YMOUSE; } ;%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -