📄 swf4compiler.y
字号:
{ $$ = $3; bufferWriteU8($$, SWFACTION_SETTARGET2); } | TELLTARGET '(' STRING ')' stmt { $$ = newBuffer(); /* SetTarget(STRING) */ bufferWriteU8($$, SWFACTION_SETTARGET); bufferWriteS16($$, strlen($3)+1); bufferWriteHardString($$, $3, strlen($3)+1); /* stmt */ bufferConcat($$, $5); /* SetTarget('') */ bufferWriteU8($$, SWFACTION_SETTARGET); bufferWriteS16($$, 1); bufferWriteU8($$, 0); free($3); } | TELLTARGET '(' expr ')' stmt { $$ = $3; /* SetTarget(expr) */ bufferWriteU8($$, SWFACTION_SETTARGET2); /* stmt */ bufferConcat($$, $5); /* SetTarget('') */ bufferWriteU8($$, SWFACTION_SETTARGET); bufferWriteS16($$, 1); bufferWriteU8($$, 0); } ;function_call : EVAL '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_GETVARIABLE); } | TIME '(' ')' { $$ = newBuffer(); bufferWriteU8($$, SWFACTION_GETTIME); } | RANDOM '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_RANDOMNUMBER); } | LENGTH '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_STRINGLENGTH); } | INT '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_INT); } | ORD '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_ORD); } | CHR '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_CHR); } | CONCAT '(' expr ',' expr ')' { $$ = $3; bufferConcat($$, $5); bufferWriteU8($$, SWFACTION_STRINGCONCAT); } | SUBSTR '(' expr ',' expr ',' expr ')' { $$ = $3; bufferConcat($$, $5); bufferConcat($$, $7); bufferWriteU8($$, SWFACTION_SUBSTRING); } | GETPROPERTY '(' expr ',' STRING ')' { $$ = newBuffer(); bufferConcat($$, $3); bufferWriteProperty($$, $5); bufferWriteU8($$, SWFACTION_GETPROPERTY); free($5); } ;pf_expr : lhs_expr "++" %prec POSTFIX { $$ = newBuffer(); bufferWriteBuffer($$, $1); bufferWriteU8($$, SWFACTION_GETVARIABLE); bufferWriteBuffer($$, $1); bufferConcat($$, $1); bufferWriteU8($$, SWFACTION_GETVARIABLE); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteU8($$, SWFACTION_SETVARIABLE); } | lhs_expr "--" %prec POSTFIX { $$ = newBuffer(); bufferWriteBuffer($$, $1); bufferWriteU8($$, SWFACTION_GETVARIABLE); bufferWriteBuffer($$, $1); bufferConcat($$, $1); bufferWriteU8($$, SWFACTION_GETVARIABLE); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_SUBTRACT); bufferWriteU8($$, SWFACTION_SETVARIABLE); } ;/* these leave a value on the stack */rhs_expr : function_call | '(' rhs_expr ')' { $$ = $2; } | NUMBER { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); free($1); } | '-' NUMBER %prec NEGATE { $$ = newBuffer(); bufferWriteString($$, "-", 2); bufferWriteString($$, $2, strlen($2)+1); free($2); } | STRING { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); free($1); } | variable { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); bufferWriteU8($$, SWFACTION_GETVARIABLE); free($1); } | sprite { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); free($1); } | sprite '.' IDENTIFIER { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferWriteU8($$, SWFACTION_GETPROPERTY); free($3); free($1); } | "++" sprite '.' IDENTIFIER { $$ = newBuffer(); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteU8($$, SWFACTION_SETPROPERTY); bufferWriteU8($$, SWFACTION_GETPROPERTY); free($2); free($4); } | "++" lhs_expr { $$ = $2; bufferWriteU8($$, SWFACTION_PUSHDUP); bufferWriteU8($$, SWFACTION_PUSHDUP); bufferWriteU8($$, SWFACTION_GETVARIABLE); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteU8($$, SWFACTION_SETVARIABLE); bufferWriteU8($$, SWFACTION_GETVARIABLE); } | "--" sprite '.' IDENTIFIER { $$ = newBuffer(); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteU8($$, SWFACTION_SETPROPERTY); bufferWriteU8($$, SWFACTION_GETPROPERTY); free($2); free($4); } | "--" lhs_expr { $$ = $2; bufferWriteU8($$, SWFACTION_PUSHDUP); bufferWriteU8($$, SWFACTION_PUSHDUP); bufferWriteU8($$, SWFACTION_GETVARIABLE); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_SUBTRACT); bufferWriteU8($$, SWFACTION_SETVARIABLE); bufferWriteU8($$, SWFACTION_GETVARIABLE); } | '-' rhs_expr %prec UMINUS { $$ = $2; bufferWriteString($2, "-1", 3); bufferWriteU8($2, SWFACTION_MULTIPLY); } | '!' rhs_expr { $$ = $2; bufferWriteU8($2, SWFACTION_LOGICALNOT); } | lhs_expr '=' rhs_expr /* assign and leave copy on stack */ { $$ = $1; bufferConcat($$, $3); bufferWriteU8($$, SWFACTION_PUSHDUP); bufferWriteU8($$, SWFACTION_SETVARIABLE); } | rhs_expr '*' rhs_expr { $$ = $1; bufferConcat($$, $3); bufferWriteU8($$, SWFACTION_MULTIPLY); } | rhs_expr '/' rhs_expr { $$ = $1; bufferConcat($$, $3); bufferWriteU8($$, SWFACTION_DIVIDE); } | rhs_expr '+' rhs_expr { $$ = $1; bufferConcat($$, $3); bufferWriteU8($$, SWFACTION_ADD); } | rhs_expr '-' rhs_expr { $$ = $1; bufferConcat($$, $3); bufferWriteU8($$, SWFACTION_SUBTRACT); } | rhs_expr '&' rhs_expr { $$ = $1; bufferConcat($$, $3); bufferWriteU8($$, SWFACTION_STRINGCONCAT); } | rhs_expr '<' rhs_expr { $$ = $1; bufferConcat($$, $3); bufferWriteU8($$, SWFACTION_LESSTHAN); } | rhs_expr '>' rhs_expr { $$ = $3; bufferConcat($$, $1); bufferWriteU8($$, SWFACTION_LESSTHAN); } | rhs_expr "<=" rhs_expr { $$ = $3; bufferConcat($$, $1); bufferWriteU8($$, SWFACTION_LESSTHAN); bufferWriteU8($$, SWFACTION_LOGICALNOT); } | rhs_expr ">=" rhs_expr { bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_LESSTHAN); bufferWriteU8($1, SWFACTION_LOGICALNOT); } | rhs_expr "!==" rhs_expr { bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_STRINGEQ); bufferWriteU8($1, SWFACTION_LOGICALNOT); } | rhs_expr "===" rhs_expr { bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_STRINGEQ); } | rhs_expr "<=>" rhs_expr { bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_STRINGCOMPARE); } | rhs_expr "==" rhs_expr { bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_EQUAL); } | rhs_expr "!=" rhs_expr { bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_EQUAL); bufferWriteU8($1, SWFACTION_LOGICALNOT); } | rhs_expr "&&" rhs_expr { bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_LOGICALAND); } | rhs_expr "||" rhs_expr { bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_LOGICALOR); } | rhs_expr '?' rhs_expr ':' rhs_expr { bufferWriteU8($1, SWFACTION_IF); bufferWriteS16($1, 2); bufferWriteS16($1, bufferLength($5)+5); bufferConcat($1, $5); bufferWriteU8($1, SWFACTION_JUMP); bufferWriteS16($1, 2); bufferWriteS16($1, bufferLength($3)); bufferConcat($1, $3); } ;variable : IDENTIFIER | sprite ':' IDENTIFIER { $$ = $1; $$ = stringConcat($$, strdup(":")); $$ = stringConcat($$, $3); } ;sprite : THIS { $$ = strdup(""); } | '.' { $$ = strdup(""); } | '/' { $$ = strdup("/"); } | PARENT { $$ = strdup(".."); } | IDENTIFIER { $$ = $1; } | PATH { $$ = $1; } ;lhs_expr : variable { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); free($1); } | STRING { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); free($1); } | '(' rhs_expr ')' { $$ = $2; } ;assign_stmt : pf_expr | ASM '{' { asmBuffer = newBuffer(); } opcode_list '}' { $$ = asmBuffer; } | void_function_call | "++" lhs_expr { $$ = $2; bufferWriteBuffer($$, $2); bufferWriteU8($$, SWFACTION_GETVARIABLE); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteU8($$, SWFACTION_SETVARIABLE); } | "--" lhs_expr { $$ = $2; bufferWriteBuffer($$, $2); bufferWriteU8($$, SWFACTION_GETVARIABLE); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_SUBTRACT); bufferWriteU8($$, SWFACTION_SETVARIABLE); } | "++" sprite '.' IDENTIFIER { $$ = newBuffer(); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteU8($$, SWFACTION_GETPROPERTY); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($2); free($4); } | "--" sprite '.' IDENTIFIER { $$ = newBuffer(); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteU8($$, SWFACTION_GETPROPERTY); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_SUBTRACT); bufferWriteString($$, $2, strlen($2)+1); bufferWriteProperty($$, $4); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($2); free($4); } | lhs_expr '=' rhs_expr { bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_SETVARIABLE); } | lhs_expr "*=" rhs_expr { bufferWriteBuffer($1, $1); bufferWriteU8($1, SWFACTION_GETVARIABLE); bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_MULTIPLY); bufferWriteU8($1, SWFACTION_SETVARIABLE); } | lhs_expr "/=" rhs_expr { bufferWriteBuffer($1, $1); bufferWriteU8($1, SWFACTION_GETVARIABLE); bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_DIVIDE); bufferWriteU8($1, SWFACTION_SETVARIABLE); } | lhs_expr "+=" rhs_expr { bufferWriteBuffer($1, $1); bufferWriteU8($1, SWFACTION_GETVARIABLE); bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_ADD); bufferWriteU8($1, SWFACTION_SETVARIABLE); } | lhs_expr "-=" rhs_expr { bufferWriteBuffer($1, $1); bufferWriteU8($1, SWFACTION_GETVARIABLE); bufferConcat($1, $3); bufferWriteU8($1, SWFACTION_SUBTRACT); bufferWriteU8($1, SWFACTION_SETVARIABLE); } | sprite '.' IDENTIFIER '=' rhs_expr { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferConcat($$,$5); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($1); free($3); } | sprite '.' IDENTIFIER "*=" rhs_expr { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferWriteU8($$, SWFACTION_GETPROPERTY); bufferConcat($$, $5); bufferWriteU8($$, SWFACTION_MULTIPLY); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($1); free($3); } | sprite '.' IDENTIFIER "/=" rhs_expr { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferWriteU8($$, SWFACTION_GETPROPERTY); bufferConcat($$, $5); bufferWriteU8($$, SWFACTION_DIVIDE); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($1); free($3); } | sprite '.' IDENTIFIER "+=" rhs_expr { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferWriteU8($$, SWFACTION_GETPROPERTY); bufferConcat($$, $5); bufferWriteU8($$, SWFACTION_ADD); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($1); free($3); } | sprite '.' IDENTIFIER "-=" rhs_expr { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferWriteString($$, $1, strlen($1)+1); bufferWriteProperty($$, $3); bufferWriteU8($$, SWFACTION_GETPROPERTY); bufferConcat($$, $5); bufferWriteU8($$, SWFACTION_SUBTRACT); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($1); free($3); } ;expr : rhs_expr ;push_item : STRING { $$ = bufferWriteU8(asmBuffer, PUSH_STRING); $$ += bufferWriteHardString(asmBuffer, $1, strlen($1) + 1); } push_list : push_item { $$ = $1; } | push_list ',' push_item { $$ = $1 + $3; }opcode_list : opcode | opcode_list opcode { $$ = $1 + $2; } ;opcode : ASMPUSH { $$ = bufferWritePushOp(asmBuffer); $$ += bufferWriteS16(asmBuffer, 0); } push_list { $$ = $<len>2 + $3; bufferPatchLength(asmBuffer, $3); } | ASMADD { $$ = bufferWriteOp(asmBuffer, SWFACTION_ADD); } | ASMSUBSTRACT { $$ = bufferWriteOp(asmBuffer, SWFACTION_SUBTRACT); } | ASMMULTIPLY { $$ = bufferWriteOp(asmBuffer, SWFACTION_MULTIPLY); } | ASMDIVIDE { $$ = bufferWriteOp(asmBuffer, SWFACTION_DIVIDE); } | ASMEQUALS { $$ = bufferWriteOp(asmBuffer, SWFACTION_EQUAL); } | ASMLESS { $$ = bufferWriteOp(asmBuffer, SWFACTION_LESSTHAN); } | ASMLOGICALAND { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALAND); } | ASMLOGICALOR { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALOR); } | ASMLOGICALNOT { $$ = bufferWriteOp(asmBuffer, SWFACTION_LOGICALNOT); } | ASMSTRINGAND { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGCONCAT); } | ASMSTRINGEQUALS { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGEQ); } | ASMSTRINGLENGTH { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGLENGTH); } | ASMSTRINGEXTRACT { $$ = bufferWriteOp(asmBuffer, SWFACTION_SUBSTRING); } | ASMMBSTRINGEXTRACT { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBSUBSTRING); } | ASMMBSTRINGLENGTH { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBLENGTH); } | ASMSTRINGLESS { $$ = bufferWriteOp(asmBuffer, SWFACTION_STRINGCOMPARE); } | ASMPOP { $$ = bufferWriteOp(asmBuffer, SWFACTION_POP); } | ASMASCIITOCHAR { $$ = bufferWriteOp(asmBuffer, SWFACTION_CHR); } | ASMCHARTOASCII { $$ = bufferWriteOp(asmBuffer, SWFACTION_ORD); } | ASMTOINTEGER { $$ = bufferWriteOp(asmBuffer, SWFACTION_INT); } | ASMMBASCIITOCHAR { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBCHR); } | ASMMBCHARTOASCII { $$ = bufferWriteOp(asmBuffer, SWFACTION_MBORD); } | ASMCALL { $$ = bufferWriteOp(asmBuffer, SWFACTION_CALLFRAME); } | ASMGETVARIABLE { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETVARIABLE); } | ASMSETVARIABLE { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETVARIABLE); } | ASMGETPROPERTY { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETPROPERTY); } | ASMSETPROPERTY { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETPROPERTY); } | ASMREMOVESPRITE { $$ = bufferWriteOp(asmBuffer, SWFACTION_REMOVECLIP); } | ASMSETTARGET2 { $$ = bufferWriteOp(asmBuffer, SWFACTION_SETTARGET2); } | ASMSTARTDRAG { $$ = bufferWriteOp(asmBuffer, SWFACTION_STARTDRAG); } | ASMENDDRAG { $$ = bufferWriteOp(asmBuffer, SWFACTION_ENDDRAG); } | ASMCLONESPRITE { $$ = bufferWriteOp(asmBuffer, SWFACTION_DUPLICATECLIP); } | ASMGETTIME { $$ = bufferWriteOp(asmBuffer, SWFACTION_GETTIME); } | ASMRANDOMNUMBER { $$ = bufferWriteOp(asmBuffer, SWFACTION_RANDOMNUMBER); } | ASMTRACE { $$ = bufferWriteOp(asmBuffer, SWFACTION_TRACE); } | ASMIF NUMBER { $$ = ( bufferWriteOp(asmBuffer, SWFACTION_IF) + bufferWriteS16(asmBuffer, 2) + bufferWriteS16(asmBuffer, atoi($2))); } | ASMJUMP NUMBER { $$ = ( bufferWriteOp(asmBuffer, SWFACTION_JUMP) + bufferWriteS16(asmBuffer, 2) + bufferWriteS16(asmBuffer, atoi($2))); } | ASMGETURL2 NUMBER { $$ = (bufferWriteOp(asmBuffer, SWFACTION_GETURL2) + bufferWriteS16(asmBuffer, 1) + bufferWriteU8(asmBuffer, atoi($2))); } | ASMGOTOFRAME2 NUMBER { $$ = (bufferWriteOp(asmBuffer, SWFACTION_GOTOFRAME2) + bufferWriteS16(asmBuffer, 1) + bufferWriteU8(asmBuffer, atoi($2))); /* SceneBias missing */ } | ASMWAITFORFRAME2 NUMBER { $$ = (bufferWriteOp(asmBuffer, SWFACTION_WAITFORFRAME2) + bufferWriteS16(asmBuffer, 1) + bufferWriteU8(asmBuffer, atoi($2))); } ;%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -