X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Ftokenizer.lex;h=f5239492216828584f350229f79c86f0218661ed;hb=3fb75ef418267cb0f7370d365b3a37b8013fbee9;hp=2238ace660a17c8e58051a37a50318ee30f9ab58;hpb=9e103111a918b0d69c2b25a8a199c54eb719b8ac;p=swftools.git diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index 2238ace..f523949 100644 --- a/lib/as3/tokenizer.lex +++ b/lib/as3/tokenizer.lex @@ -268,30 +268,47 @@ static inline int m(int type) static char numberbuf[64]; -static inline int handlenumber() +static char*nrbuf() { if(yyleng>sizeof(numberbuf)-1) syntaxerror("decimal number overflow"); - char*s = numberbuf; memcpy(s, yytext, yyleng); s[yyleng]=0; + return s; +} - int t; - char is_float=0; - for(t=0;t-128) + return T_BYTE; + else if(v>=-32768) + return T_SHORT; + else + return T_INT; +} +static inline int setuint(unsigned int v) +{ + avm2_lval.number_uint = v; + if(v<128) + return T_BYTE; + else if(v<32768) + return T_SHORT; + else + return T_UINT; +} + +static inline int handlefloat() +{ + char*s = nrbuf(); + avm2_lval.number_float = atof(s); + return T_FLOAT; +} + +static inline int handleint() +{ + char*s = nrbuf(); char l = (yytext[0]=='-'); char*max = l?"1073741824":"2147483647"; @@ -308,26 +325,44 @@ static inline int handlenumber() } if(yytext[0]=='-') { int v = atoi(s); - avm2_lval.number_int = v; - if(v>-128) - return T_BYTE; - else if(v>=-32768) - return T_SHORT; - else - return T_INT; + return setint(v); } else { unsigned int v = 0; + int t; for(t=0;t8) + syntaxerror("integer overflow"); + int t; + unsigned int v = 0; + for(t=l;t='0' && c<='9') + v|=(c&15); + else if(c>='a' && c<='f' || + c>='A' && c<='F') + v|=(c&0x0f)+9; + } + if(l && v>1073741824) + syntaxerror("signed integer overflow"); + if(!l && v>2147483647) + syntaxerror("unsigned integer overflow"); + + if(l) { + return setint(-(int)v); + } else { + return setuint(v); } } @@ -336,6 +371,10 @@ void initialize_scanner(); #define c() {countlines(yytext, yyleng);} +//Boolean {c();return m(KW_BOOLEAN);} +//int {c();return m(KW_INT);} +//uint {c();return m(KW_UINT);} +//Number {c();return m(KW_NUMBER);} %} %s REGEXPOK @@ -343,7 +382,13 @@ void initialize_scanner(); NAME [a-zA-Z_][a-zA-Z0-9_\\]* -NUMBER -?[0-9]+(\.[0-9]*)? +HEXINT 0x[a-zA-Z0-9]+ +INT [0-9]+ +FLOAT [0-9]+(\.[0-9]*)?|\.[0-9]+ + +HEXWITHSIGN [+-]?({HEXINT}) +INTWITHSIGN [+-]?({INT}) +FLOATWITHSIGN [+-]?({FLOAT}) STRING ["](\\[\x00-\xff]|[^\\"\n])*["]|['](\\[\x00-\xff]|[^\\'\n])*['] S [ \n\r\t] @@ -363,12 +408,17 @@ REGEXP [/]([^/\n]|\\[/])*[/][a-zA-Z]* { {REGEXP} {c(); BEGIN(INITIAL);return m(T_REGEXP);} +{HEXWITHSIGN} {c(); BEGIN(INITIAL);return handlehex();} +{INTWITHSIGN} {c(); BEGIN(INITIAL);return handleint();} +{FLOATWITHSIGN} {c(); BEGIN(INITIAL);return handlefloat();} } \xef\xbb\xbf {/* utf 8 bom */} {S} {c();} -{NUMBER} {c(); BEGIN(INITIAL);return handlenumber();} +{HEXINT} {c(); BEGIN(INITIAL);return handlehex();} +{INT} {c(); BEGIN(INITIAL);return handleint();} +{FLOAT} {c(); BEGIN(INITIAL);return handlefloat();} 3rr0r {/* for debugging: generates a tokenizer-level error */ syntaxerror("3rr0r");} @@ -376,6 +426,7 @@ REGEXP [/]([^/\n]|\\[/])*[/][a-zA-Z]* [&][&] {c();BEGIN(REGEXPOK);return m(T_ANDAND);} [|][|] {c();BEGIN(REGEXPOK);return m(T_OROR);} [!][=] {c();BEGIN(REGEXPOK);return m(T_NE);} +[!][=][=] {c();BEGIN(REGEXPOK);return m(T_NEE);} [=][=][=] {c();BEGIN(REGEXPOK);return m(T_EQEQEQ);} [=][=] {c();BEGIN(REGEXPOK);return m(T_EQEQ);} [>][=] {c();return m(T_GE);} @@ -402,32 +453,33 @@ implements {c();return m(KW_IMPLEMENTS);} interface {c();return m(KW_INTERFACE);} namespace {c();return m(KW_NAMESPACE);} protected {c();return m(KW_PROTECTED);} +undefined {c();return m(KW_UNDEFINED);} override {c();return m(KW_OVERRIDE);} internal {c();return m(KW_INTERNAL);} function {c();return m(KW_FUNCTION);} package {c();return m(KW_PACKAGE);} private {c();return m(KW_PRIVATE);} -Boolean {c();return m(KW_BOOLEAN);} dynamic {c();return m(KW_DYNAMIC);} extends {c();return m(KW_EXTENDS);} +delete {c();return m(KW_DELETE);} return {c();return m(KW_RETURN);} public {c();return m(KW_PUBLIC);} native {c();return m(KW_NATIVE);} static {c();return m(KW_STATIC);} import {c();return m(KW_IMPORT);} -Number {c();return m(KW_NUMBER);} +typeof {c();return m(KW_TYPEOF);} while {c();return m(KW_WHILE);} class {c();return m(KW_CLASS);} const {c();return m(KW_CONST);} final {c();return m(KW_FINAL);} false {c();return m(KW_FALSE);} break {c();return m(KW_BREAK);} +super {c();return m(KW_SUPER);} +void {c();return m(KW_VOID);} true {c();return m(KW_TRUE);} -uint {c();return m(KW_UINT);} null {c();return m(KW_NULL);} else {c();return m(KW_ELSE);} use {c();return m(KW_USE);} -int {c();return m(KW_INT);} new {c();return m(KW_NEW);} get {c();return m(KW_GET);} for {c();return m(KW_FOR);} @@ -438,7 +490,7 @@ if {c();return m(KW_IF) ;} as {c();return m(KW_AS);} {NAME} {c();BEGIN(INITIAL);return mkid(T_IDENTIFIER);} -[+-\/*^~@$!%&\(=\[\]\{\}|?:;,.<>] {c();BEGIN(REGEXPOK);return m(yytext[0]);} +[+-\/*^~@$!%&\(=\[\]\{\}|?:;,<>] {c();BEGIN(REGEXPOK);return m(yytext[0]);} [\)\]] {c();BEGIN(INITIAL);return m(yytext[0]);} . {char c1=yytext[0]; @@ -480,11 +532,12 @@ int yywrap() } static char mbuf[256]; -char*token2string(enum yytokentype nr) +char*token2string(enum yytokentype nr, YYSTYPE v) { if(nr==T_STRING) return ""; else if(nr==T_INT) return ""; else if(nr==T_UINT) return ""; + else if(nr==T_BYTE) return ""; else if(nr==T_FLOAT) return ""; else if(nr==T_REGEXP) return "REGEXP"; else if(nr==T_EOF) return "***END***";