From 348ac4449eb156089ed17c821ef6a39ac41a7b6a Mon Sep 17 00:00:00 2001 From: kramm Date: Tue, 30 Dec 2008 23:06:06 +0000 Subject: [PATCH] added void,typeof,undefined keywords --- lib/as3/tokenizer.lex | 117 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 82 insertions(+), 35 deletions(-) diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index ee71c96..89f5e19 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); } } @@ -347,8 +382,13 @@ void initialize_scanner(); NAME [a-zA-Z_][a-zA-Z0-9_\\]* -NUMBER [0-9]+(\.[0-9]*)?|-?\.[0-9]+ -NUMBERWITHSIGN [+-]?({NUMBER}) +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] @@ -368,13 +408,17 @@ REGEXP [/]([^/\n]|\\[/])*[/][a-zA-Z]* { {REGEXP} {c(); BEGIN(INITIAL);return m(T_REGEXP);} -{NUMBERWITHSIGN} {c(); BEGIN(INITIAL);return handlenumber();} +{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");} @@ -409,6 +453,7 @@ 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);} @@ -422,12 +467,14 @@ public {c();return m(KW_PUBLIC);} native {c();return m(KW_NATIVE);} static {c();return m(KW_STATIC);} import {c();return m(KW_IMPORT);} +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);} +void {c();return m(KW_VOID);} true {c();return m(KW_TRUE);} null {c();return m(KW_NULL);} else {c();return m(KW_ELSE);} -- 1.7.10.4