📄 swf4compiler.y
字号:
| GOTOFRAME '(' NUMBER ')' { $$ = newBuffer(); bufferWriteU8($$, SWFACTION_GOTOFRAME); bufferWriteS16($$, 2); bufferWriteS16($$, atoi($3)); free($3); } | GOTOFRAME '(' STRING ')' { $$ = newBuffer(); bufferWriteU8($$, SWFACTION_GOTOLABEL); bufferWriteS16($$, strlen($3)+1); bufferWriteHardString($$, (byte*)$3, strlen($3)+1); free($3); } | GOTOFRAME '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_GOTOEXPRESSION); bufferWriteS16($$, 1); bufferWriteU8($$, 0); } /* XXX - and stop */ | GOTOANDPLAY '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_GOTOEXPRESSION); bufferWriteS16($$, 1); bufferWriteU8($$, 1); } /* XXX - and play */ | SETTARGET '(' STRING ')' { $$ = newBuffer(); bufferWriteU8($$, SWFACTION_SETTARGET); bufferWriteS16($$, strlen($3)+1); bufferWriteHardString($$, (byte*)$3, strlen($3)+1); free($3); } | SETTARGET '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_SETTARGETEXPRESSION); } | TELLTARGET '(' STRING ')' stmt { $$ = newBuffer(); /* SetTarget(STRING) */ bufferWriteU8($$, SWFACTION_SETTARGET); bufferWriteS16($$, strlen($3)+1); bufferWriteHardString($$, (byte*)$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_SETTARGETEXPRESSION); /* stmt */ bufferConcat($$, $5); /* SetTarget('') */ bufferWriteU8($$, SWFACTION_SETTARGET); bufferWriteS16($$, 1); bufferWriteU8($$, 0); } ;function_call : EVAL '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_GETVARIABLE); } | TIME '(' ')' { $$ = newBuffer(); bufferWriteU8($$, SWFACTION_GETTIMER); } | RANDOM '(' expr ')' { $$ = $3; bufferWriteU8($$, SWFACTION_RANDOM); } | 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); bufferWriteGetProperty($$, $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); bufferWriteGetProperty($$, $3); bufferWriteU8($$, SWFACTION_GETPROPERTY); free($3); free($1); } | "++" sprite '.' IDENTIFIER { $$ = newBuffer(); bufferWriteString($$, $2, strlen($2)+1); bufferWriteGetProperty($$, $4); bufferWriteString($$, $2, strlen($2)+1); bufferWriteSetProperty($$, $4); bufferWriteString($$, $2, strlen($2)+1); bufferWriteGetProperty($$, $4); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteU8($$, SWFACTION_SETPROPERTY); bufferWriteU8($$, SWFACTION_GETPROPERTY); free($2); free($4); } | "++" lhs_expr { $$ = $2; bufferWriteU8($$, SWFACTION_DUP); bufferWriteU8($$, SWFACTION_DUP); bufferWriteU8($$, SWFACTION_GETVARIABLE); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteU8($$, SWFACTION_SETVARIABLE); bufferWriteU8($$, SWFACTION_GETVARIABLE); } | "--" sprite '.' IDENTIFIER { $$ = newBuffer(); bufferWriteString($$, $2, strlen($2)+1); bufferWriteGetProperty($$, $4); bufferWriteString($$, $2, strlen($2)+1); bufferWriteSetProperty($$, $4); bufferWriteString($$, $2, strlen($2)+1); bufferWriteGetProperty($$, $4); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteU8($$, SWFACTION_SETPROPERTY); bufferWriteU8($$, SWFACTION_GETPROPERTY); free($2); free($4); } | "--" lhs_expr { $$ = $2; bufferWriteU8($$, SWFACTION_DUP); bufferWriteU8($$, SWFACTION_DUP); 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_DUP); 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_BRANCHIFTRUE); bufferWriteS16($1, 2); bufferWriteS16($1, bufferLength($5)+5); bufferConcat($1, $5); bufferWriteU8($1, SWFACTION_BRANCHALWAYS); 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 | 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); bufferWriteGetProperty($$, $4); bufferWriteU8($$, SWFACTION_GETPROPERTY); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_ADD); bufferWriteString($$, $2, strlen($2)+1); bufferWriteSetProperty($$, $4); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($2); free($4); } | "--" sprite '.' IDENTIFIER { $$ = newBuffer(); bufferWriteString($$, $2, strlen($2)+1); bufferWriteGetProperty($$, $4); bufferWriteU8($$, SWFACTION_GETPROPERTY); bufferWriteString($$, "1", 2); bufferWriteU8($$, SWFACTION_SUBTRACT); bufferWriteString($$, $2, strlen($2)+1); bufferWriteSetProperty($$, $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); bufferWriteSetProperty($$, $3); bufferConcat($$,$5); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($1); free($3); } | sprite '.' IDENTIFIER "*=" rhs_expr { $$ = newBuffer(); bufferWriteString($$, $1, strlen($1)+1); bufferWriteSetProperty($$, $3); bufferWriteString($$, $1, strlen($1)+1); bufferWriteGetProperty($$, $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); bufferWriteSetProperty($$, $3); bufferWriteString($$, $1, strlen($1)+1); bufferWriteGetProperty($$, $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); bufferWriteSetProperty($$, $3); bufferWriteString($$, $1, strlen($1)+1); bufferWriteGetProperty($$, $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); bufferWriteSetProperty($$, $3); bufferWriteString($$, $1, strlen($1)+1); bufferWriteGetProperty($$, $3); bufferWriteU8($$, SWFACTION_GETPROPERTY); bufferConcat($$, $5); bufferWriteU8($$, SWFACTION_SUBTRACT); bufferWriteU8($$, SWFACTION_SETPROPERTY); free($1); free($3); } ;expr : rhs_expr ;%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -