X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Ftokenizer.lex;h=1be891f14d9a1db951dadf8fe544bbc9b54f6ac5;hb=36b6d09b780c62b3aac511b620aa45b3ae7c1d37;hp=7a1762203a2090d0b58e8db642d4bf53bfca801c;hpb=747a523baa89370e4d2b8cbfe8b2ae2fa0b6edbd;p=swftools.git diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index 7a17622..1be891f 100644 --- a/lib/as3/tokenizer.lex +++ b/lib/as3/tokenizer.lex @@ -1,4 +1,28 @@ +/* tokenizer.lex + + Routines for compiling Flash2 AVM2 ABC Actionscript + + Extension module for the rfxswf library. + Part of the swftools package. + + Copyright (c) 2008 Matthias Kramm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ %{ + + #include #include #include @@ -92,6 +116,22 @@ void handleInclude(char*text, int len, char quotes) //BEGIN(INITIAL); keep context } +static void handleString(char*s, int len) +{ + if(s[0]=='"') { + if(s[len-1]!='"') syntaxerror("String doesn't end with '\"'"); + s++;len-=2; + } + else if(s[0]=='\'') { + if(s[len-1]!='\'') syntaxerror("String doesn't end with '\"'"); + s++;len-=2; + } + else syntaxerror("String incorrectly terminated"); + s[len] = 0; + avm2_lval.string = s; +} + + char start_of_expression; static inline int m(int type) @@ -121,9 +161,10 @@ static inline int handlenumber() char is_float=0; for(t=0;t10) + char*max = l?"1073741824":"2147483647"; + if(yyleng-l>10) syntaxerror("integer overflow"); - if(yyleng==10) { + if(yyleng-l==10) { int t; for(t=0;tmax[t]) - syntaxerror("integer overflow"); + syntaxerror("integer overflow %s > %s", s+l,max); else if(yytext[l+t]-128) + return T_BYTE; + else if(v>=-32768) + return T_SHORT; + else + return T_INT; } else { - unsigned int v = atoi(s); + unsigned int v = 0; + for(t=0;t{ {REGEXP} {c(); BEGIN(INITIAL);return m(T_REGEXP);} @@ -201,11 +250,12 @@ REGEXP [/]([^/\n]|\\[/])*[/][a-zA-Z]* {NUMBER} {c(); BEGIN(INITIAL);return handlenumber();} +[!][=] {BEGIN(REGEXPOK);return m(T_NE);} +[=][=] {BEGIN(REGEXPOK);return m(T_EQEQ);} [>][=] {return m(T_GE);} [<][=] {return m(T_LE);} [-][-] {BEGIN(INITIAL);return m(T_MINUSMINUS);} [+][+] {BEGIN(INITIAL);return m(T_PLUSPLUS);} -== {BEGIN(REGEXPOK);return m(T_EQEQ);} \.\. {return m(T_DOTDOT);} \. {return m('.');} :: {return m(T_COLONCOLON);} @@ -230,10 +280,11 @@ Number {return m(KW_NUMBER);} class {return m(KW_CLASS);} const {return m(KW_CONST);} final {return m(KW_FINAL);} -False {return m(KW_FALSE);} -True {return m(KW_TRUE);} +false {return m(KW_FALSE);} +true {return m(KW_TRUE);} uint {return m(KW_UINT);} null {return m(KW_NULL);} +else {return m(KW_ELSE);} use {return m(KW_USE);} int {return m(KW_INT);} new {return m(KW_NEW);} @@ -242,6 +293,7 @@ for {return m(KW_FOR);} set {return m(KW_SET);} var {return m(KW_VAR);} is {return m(KW_IS) ;} +if {return m(KW_IF) ;} as {return m(KW_AS);} {NAME} {c();BEGIN(INITIAL);return m(T_IDENTIFIER);} @@ -324,6 +376,7 @@ char*token2string(token_t*t) else if(nr==KW_TRUE) return "True"; else if(nr==KW_UINT) return "uint"; else if(nr==KW_NULL) return "null"; + else if(nr==KW_ELSE) return "else"; else if(nr==KW_USE) return "use"; else if(nr==KW_INT) return "int"; else if(nr==KW_NEW) return "new";