X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fas3%2Fparser.y;h=a1ce232fd4213ef1fb46b933c947d50d120b661c;hp=f37a3ffecbfd8376754474b1d41f73ac0b1d7769;hb=62a83d162b254d91da418cee25f5b87b067a3f92;hpb=dd5f16e46f47e5833d68c75ecde8f33e0d1997fd diff --git a/lib/as3/parser.y b/lib/as3/parser.y index f37a3ff..a1ce232 100644 --- a/lib/as3/parser.y +++ b/lib/as3/parser.y @@ -33,6 +33,7 @@ #include "code.h" #include "opcodes.h" #include "compiler.h" +#include "ast.h" extern int a3_lex(); @@ -80,8 +81,6 @@ extern int a3_lex(); %token T_EMPTY %token T_INT %token T_UINT -%token T_BYTE -%token T_SHORT %token T_FLOAT %token T_FOR "for" @@ -102,6 +101,7 @@ extern int a3_lex(); %token KW_FUNCTION "function" %token KW_FINALLY "finally" %token KW_UNDEFINED "undefined" +%token KW_NAN "NaN" %token KW_CONTINUE "continue" %token KW_CLASS "class" %token KW_CONST "const" @@ -191,7 +191,6 @@ extern int a3_lex(); %type EXPRESSION NONCOMMAEXPRESSION %type MAYBEEXPRESSION %type E DELETE -%type CONSTANT %type FOR FOR_IN IF WHILE DO_WHILE MAYBEELSE BREAK RETURN CONTINUE TRY %type INNERFUNCTION %type USE_NAMESPACE @@ -205,7 +204,7 @@ extern int a3_lex(); %type MAYBE_MODIFIERS %type MODIFIER_LIST %type MODIFIER -%type STATICCONSTANT MAYBESTATICCONSTANT +%type CONSTANT MAYBECONSTANT %type IMPLEMENTS_LIST %type EXTENDS CLASS_SPEC %type EXTENDS_LIST @@ -258,7 +257,7 @@ extern int a3_lex(); // needed for "return" precedence: %nonassoc T_STRING T_REGEXP -%nonassoc T_INT T_UINT T_BYTE T_SHORT T_FLOAT +%nonassoc T_INT T_UINT T_FLOAT KW_NAN %nonassoc "false" "true" "null" "undefined" "super" "function" %left above_function @@ -1609,10 +1608,21 @@ code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to) if((TYPE_IS_NUMBER(from) || TYPE_IS_UINT(from) || TYPE_IS_INT(from)) && (TYPE_IS_NUMBER(to) || TYPE_IS_UINT(to) || TYPE_IS_INT(to))) { // allow conversion between number types + if(TYPE_IS_UINT(to)) + return abc_convert_u(c); + else if(TYPE_IS_INT(to)) + return abc_convert_i(c); + else if(TYPE_IS_NUMBER(to)) + return abc_convert_d(c); return abc_coerce2(c, &m); } - //printf("%s.%s\n", from.package, from.name); - //printf("%s.%s\n", to.package, to.name); + + if(TYPE_IS_BOOLEAN(to)) + return abc_convert_b(c); + if(TYPE_IS_STRING(to)) + return abc_convert_s(c); + if(TYPE_IS_OBJECT(to)) + return abc_convert_o(c); classinfo_t*supertype = from; while(supertype) { @@ -1638,8 +1648,8 @@ code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to) return c; as3_error("can't convert type %s%s%s to %s%s%s", - from->package, from->package?".":"", from->name, - to->package, to->package?".":"", to->name); + from->package, from->package[0]?".":"", from->name, + to->package, to->package[0]?".":"", to->name); return c; } @@ -2842,26 +2852,31 @@ PASS12 /* ------------ constants -------------------------------------- */ -MAYBESTATICCONSTANT: {$$=0;} -MAYBESTATICCONSTANT: '=' STATICCONSTANT {$$=$2;} - -STATICCONSTANT : T_BYTE {$$ = constant_new_int($1);} -STATICCONSTANT : T_INT {$$ = constant_new_int($1);} -STATICCONSTANT : T_UINT {$$ = constant_new_uint($1);} -STATICCONSTANT : T_FLOAT {$$ = constant_new_float($1);} -STATICCONSTANT : T_STRING {$$ = constant_new_string2($1.str,$1.len);free((char*)$1.str);} -//STATICCONSTANT : T_NAMESPACE {$$ = constant_new_namespace($1);} -STATICCONSTANT : "true" {$$ = constant_new_true($1);} -STATICCONSTANT : "false" {$$ = constant_new_false($1);} -STATICCONSTANT : "null" {$$ = constant_new_null($1);} -STATICCONSTANT : T_IDENTIFIER { +MAYBECONSTANT: {$$=0;} +MAYBECONSTANT: '=' CONSTANT {$$=$2;} + +//CONSTANT : T_NAMESPACE {$$ = constant_new_namespace($1);} +CONSTANT : T_INT {$$ = constant_new_int($1);} +CONSTANT : T_UINT { + $$ = constant_new_uint($1); +} +CONSTANT : T_FLOAT {$$ = constant_new_float($1);} +CONSTANT : T_STRING {$$ = constant_new_string2($1.str,$1.len);free((char*)$1.str);} +CONSTANT : "true" {$$ = constant_new_true($1);} +CONSTANT : "false" {$$ = constant_new_false($1);} +CONSTANT : "null" {$$ = constant_new_null($1);} +CONSTANT : "undefined" {$$ = constant_new_undefined($1);} +CONSTANT : KW_NAN {$$ = constant_new_float(__builtin_nan(""));} + +/* +CONSTANT : T_IDENTIFIER { if(!strcmp($1, "NaN")) { $$ = constant_new_float(__builtin_nan("")); } else { as3_warning("Couldn't evaluate constant value of %s", $1); $$ = constant_new_null($1); } -} +}*/ /* ------------ classes and interfaces (body, functions) ------- */ @@ -2901,7 +2916,7 @@ PARAM_LIST: PARAM { list_append($$.list, $1); } -PARAM: T_IDENTIFIER ':' TYPE MAYBESTATICCONSTANT { +PARAM: T_IDENTIFIER ':' TYPE MAYBECONSTANT { PASS12 $$ = rfx_calloc(sizeof(param_t)); $$->name=$1; @@ -2909,7 +2924,7 @@ PARAM: T_IDENTIFIER ':' TYPE MAYBESTATICCONSTANT { PASS2 $$->value = $4; } -PARAM: T_IDENTIFIER MAYBESTATICCONSTANT { +PARAM: T_IDENTIFIER MAYBECONSTANT { PASS12 $$ = rfx_calloc(sizeof(param_t)); $$->name=$1; @@ -3186,13 +3201,17 @@ VOIDEXPRESSION : EXPRESSION %prec below_minus { // ----------------------- expression evaluation ------------------------------------- E : INNERFUNCTION %prec prec_none {$$ = $1;} -E : CONSTANT -E : VAR_READ %prec T_IDENTIFIER {$$ = $1;} -E : NEW {$$ = $1;} -E : DELETE {$$ = $1;} +E : VAR_READ %prec T_IDENTIFIER {$$ = $1;} +E : NEW {$$ = $1;} +E : DELETE {$$ = $1;} E : FUNCTIONCALL +E : CONSTANT { + node_t*n = mkconstnode($1); + $$ = node_read(n); +} + E : T_REGEXP { $$.c = 0; namespace_t ns = {ACCESS_PACKAGE, ""}; @@ -3210,39 +3229,6 @@ E : T_REGEXP { $$.t = TYPE_REGEXP; } -CONSTANT : T_BYTE {$$.c = abc_pushbyte(0, $1); - //MULTINAME(m, registry_getintclass()); - //$$.c = abc_coerce2($$.c, &m); // FIXME - $$.t = TYPE_INT; - } -CONSTANT : T_SHORT {$$.c = abc_pushshort(0, $1); - $$.t = TYPE_INT; - } -CONSTANT : T_INT {$$.c = abc_pushint(0, $1); - $$.t = TYPE_INT; - } -CONSTANT : T_UINT {$$.c = abc_pushuint(0, $1); - $$.t = TYPE_UINT; - } -CONSTANT : T_FLOAT {$$.c = abc_pushdouble(0, $1); - $$.t = TYPE_FLOAT; - } -CONSTANT : T_STRING {$$.c = abc_pushstring2(0, &$1);free((char*)$1.str); - $$.t = TYPE_STRING; - } -CONSTANT : "undefined" {$$.c = abc_pushundefined(0); - $$.t = TYPE_ANY; - } -CONSTANT : "true" {$$.c = abc_pushtrue(0); - $$.t = TYPE_BOOLEAN; - } -CONSTANT : "false" {$$.c = abc_pushfalse(0); - $$.t = TYPE_BOOLEAN; - } -CONSTANT : "null" {$$.c = abc_pushnull(0); - $$.t = TYPE_NULL; - } - E : E '<' E {$$.c = code_append($1.c,$3.c);$$.c = abc_greaterequals($$.c);$$.c=abc_not($$.c); $$.t = TYPE_BOOLEAN; }