From: kramm Date: Fri, 2 Jan 2009 19:51:39 +0000 (+0000) Subject: implemented switch X-Git-Tag: release-0-9-0~456 X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=commitdiff_plain;h=d9fc7aab1efc946d04f0e8cde52c88ffd4598943 implemented switch --- diff --git a/lib/as3/parser.y b/lib/as3/parser.y index f119828..8c99eca 100644 --- a/lib/as3/parser.y +++ b/lib/as3/parser.y @@ -72,6 +72,7 @@ %token T_FOR "for" %token T_WHILE "while" %token T_DO "do" +%token T_SWITCH "switch" %token KW_IMPLEMENTS %token KW_NAMESPACE "namespace" @@ -88,6 +89,8 @@ %token KW_CONTINUE "continue" %token KW_CLASS "class" %token KW_CONST "const" +%token KW_CATCH "catch" +%token KW_CASE "case" %token KW_SET "set" %token KW_VOID "void" %token KW_STATIC @@ -102,6 +105,7 @@ %token KW_OVERRIDE %token KW_FINAL %token KW_GET "get" +%token KW_TRY "try" %token KW_SUPER "super" %token KW_EXTENDS %token KW_FALSE "false" @@ -111,6 +115,7 @@ %token KW_INT "int" %token KW_NUMBER "Number" %token KW_STRING "String" +%token KW_DEFAULT "default" %token KW_DELETE "delete" %token KW_IF "if" %token KW_ELSE "else" @@ -147,7 +152,7 @@ %type VARCONST %type CODE %type CODEPIECE -%type CODEBLOCK MAYBECODE +%type CODEBLOCK MAYBECODE MAYBE_CASE_LIST CASE_LIST DEFAULT CASE SWITCH %type PACKAGE_DECLARATION %type FUNCTION_DECLARATION %type VARIABLE_DECLARATION ONE_VARIABLE VARIABLE_LIST @@ -1192,9 +1197,13 @@ static code_t* toreadwrite(code_t*in, code_t*middlepart, char justassign, char r /* ------------ code blocks / statements ---------------- */ -PROGRAM: MAYBECODE +PROGRAM: MAYBECODE { + /* todo: do something with this code if we're outside a function */ + if($1) + warning("ignored code"); +} -MAYBECODE: CODE {$$=$1;/*TODO: do something with this code if we're not in a function*/} +MAYBECODE: CODE {$$=$1;} MAYBECODE: {$$=code_new();} CODE: CODE CODEPIECE { @@ -1215,6 +1224,7 @@ CODEPIECE: VOIDEXPRESSION {$$=$1} CODEPIECE: FOR {$$=$1} CODEPIECE: WHILE {$$=$1} CODEPIECE: DO_WHILE {$$=$1} +CODEPIECE: SWITCH {$$=$1} CODEPIECE: BREAK {$$=$1} CODEPIECE: CONTINUE {$$=$1} CODEPIECE: RETURN {$$=$1} @@ -1292,7 +1302,7 @@ MAYBEELSE: %prec below_else {$$ = code_new();} MAYBEELSE: "else" CODEBLOCK {$$=$2;} //MAYBEELSE: ';' "else" CODEBLOCK {$$=$3;} -IF : "if" '(' {new_state();} EXPRESSION ')' CODEBLOCK MAYBEELSE { +IF : "if" '(' {new_state();} EXPRESSION ')' CODEBLOCK MAYBEELSE { $$ = code_new(); $$ = code_append($$, $4.c); code_t*myjmp,*myif = $$ = abc_iffalse($$, 0); @@ -1377,6 +1387,49 @@ CONTINUE : "continue" T_IDENTIFIER { $$ = abc___continue__(0, $2); } +MAYBE_CASE_LIST : {$$=0;} +MAYBE_CASE_LIST : CASE_LIST {$$=$1;} +MAYBE_CASE_LIST : DEFAULT {$$=$1;} +MAYBE_CASE_LIST : CASE_LIST DEFAULT {$$=code_append($1,$2);} +CASE_LIST: CASE {$$=$1} +CASE_LIST: CASE_LIST CASE {$$=code_append($$,$2);} + +CASE: "case" CONSTANT ':' MAYBECODE { + $$ = abc_dup(0); + $$ = code_append($$, $2.c); + code_t*j = $$ = abc_ifne($$, 0); + $$ = code_append($$, $4); + $$ = abc___continue__($$, ""); + code_t*e = $$ = abc_nop($$); + j->branch = e; +} +DEFAULT: "default" ':' MAYBECODE { + $$ = $3; +} +SWITCH : T_SWITCH '(' {new_state();} E ')' '{' MAYBE_CASE_LIST '}' { + $$=$4.c; + $$ = code_append($$, $7); + code_t*out = $$ = abc_pop($$); + breakjumpsto($$, $1, out); + + code_t*c = $$,*lastblock=0; + while(c) { + if(c->opcode == OPCODE_IFNE) { + lastblock=c->next; + } else if(c->opcode == OPCODE___CONTINUE__) { + if(lastblock) { + c->opcode = OPCODE_JUMP; + c->branch = lastblock; + } else { + /* fall through end of switch */ + c->opcode = OPCODE_NOP; + } + } + c=c->prev; + } + old_state(); +} + /* ------------ packages and imports ---------------- */ X_IDENTIFIER: T_IDENTIFIER