X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Ftokenizer.lex;h=1be891f14d9a1db951dadf8fe544bbc9b54f6ac5;hb=36b6d09b780c62b3aac511b620aa45b3ae7c1d37;hp=8bf8c89f06dba379b34a7f3bd5b3886dfe31e3aa;hpb=f68c14446f6fcd6ecaf36392cd943f32ff7e22cd;p=swftools.git diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index 8bf8c89..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) @@ -199,7 +239,7 @@ REGEXP [/]([^/\n]|\\[/])*[/][a-zA-Z]* ^include{S}+{STRING}{S}*/\n {c();handleInclude(yytext, yyleng, 1);} ^include{S}+[^" \t\r\n][\x20-\xff]*{S}*/\n {c();handleInclude(yytext, yyleng, 0);} -{STRING} {c(); BEGIN(INITIAL);return m(T_STRING);} +{STRING} {c(); BEGIN(INITIAL);handleString(yytext, yyleng);return T_STRING;} { {REGEXP} {c(); BEGIN(INITIAL);return m(T_REGEXP);} @@ -210,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);} @@ -239,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);} @@ -251,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);} @@ -333,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";