X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Ftokenizer.lex;h=8002657a200fb1f859827772ed9d08d007e24c44;hb=d55df27a66db460b764ba10b3f474d7b91fb4814;hp=c84e3b3035609d62120a91209d503b5e52da6230;hpb=f4992808059471b4f7f0f75f0b2f526d37d7715f;p=swftools.git diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index c84e3b3..8002657 100644 --- a/lib/as3/tokenizer.lex +++ b/lib/as3/tokenizer.lex @@ -109,6 +109,8 @@ void as3_file_input(FILE*fi) } void as3_buffer_input(void*buffer, int len) { + if(!buffer) + syntaxerror("trying to parse zero bytearray"); as3_buffer = buffer; as3_buffer_len = len; as3_buffer_pos = 0; @@ -309,15 +311,6 @@ static void handleString(char*s, int len) char start_of_expression; -static inline int handleIdentifier(int type) -{ - char*s = malloc(yyleng+1); - memcpy(s, yytext, yyleng); - s[yyleng]=0; - a3_lval.id = s; - return type; -} - static inline int m(int type) { a3_lval.token = type; @@ -523,6 +516,29 @@ static inline void c() { current_column+=yyleng; } +static trie_t*namespaces = 0; +void tokenizer_register_namespace(const char*id) +{ + trie_put(&namespaces, id); +} +static inline tokenizer_is_namespace(const char*id) +{ + return trie_lookup(namespaces, id); +} + +static inline int handleIdentifier() +{ + char*s = malloc(yyleng+1); + memcpy(s, yytext, yyleng); + s[yyleng]=0; + a3_lval.id = s; + if(tokenizer_is_namespace(s)) + return T_NAMESPACE; + else + return T_IDENTIFIER; +} + + //Boolean {c();return m(KW_BOOLEAN);} //int {c();return m(KW_INT);} //uint {c();return m(KW_UINT);} @@ -539,7 +555,7 @@ _ [^a-zA-Z0-9_\\] HEXINT 0x[a-zA-Z0-9]+ HEXFLOAT 0x[a-zA-Z0-9]*\.[a-zA-Z0-9]* INT [0-9]+ -FLOAT [0-9]+(\.[0-9]*)?|\.[0-9]+ +FLOAT ([0-9]+(\.[0-9]*)?|\.[0-9]+)(e[0-9]+)? HEXWITHSIGN [+-]?({HEXINT}) HEXFLOATWITHSIGN [+-]?({HEXFLOAT}) @@ -550,7 +566,7 @@ CDATA ])*\]*\]\]\> STRING ["](\\[\x00-\xff]|[^\\"\n])*["]|['](\\[\x00-\xff]|[^\\'\n])*['] S [ \n\r\t] MULTILINE_COMMENT [/][*]+([*][^/]|[^/*]|[^*][/]|[\x00-\x1f])*[*]+[/] -SINGLELINE_COMMENT \/\/[^\n]*\n +SINGLELINE_COMMENT \/\/[^\n\r]*[\n\r] REGEXP [/]([^/\n]|\\[/])*[/][a-zA-Z]* %% @@ -566,19 +582,19 @@ REGEXP [/]([^/\n]|\\[/])*[/][a-zA-Z]* { {REGEXP} {c(); BEGIN(INITIAL);return handleregexp();} -{HEXWITHSIGN} {c(); BEGIN(INITIAL);return handlehex();} -{HEXFLOATWITHSIGN} {c(); BEGIN(INITIAL);return handlehexfloat();} -{INTWITHSIGN} {c(); BEGIN(INITIAL);return handleint();} -{FLOATWITHSIGN} {c(); BEGIN(INITIAL);return handlefloat();} +{HEXWITHSIGN}/{_} {c(); BEGIN(INITIAL);return handlehex();} +{HEXFLOATWITHSIGN}/{_} {c(); BEGIN(INITIAL);return handlehexfloat();} +{INTWITHSIGN}/{_} {c(); BEGIN(INITIAL);return handleint();} +{FLOATWITHSIGN}/{_} {c(); BEGIN(INITIAL);return handlefloat();} } \xef\xbb\xbf {/* utf 8 bom */} {S} {l();} -{HEXINT} {c(); BEGIN(INITIAL);return handlehex();} -{HEXFLOAT} {c(); BEGIN(INITIAL);return handlehexfloat();} -{INT} {c(); BEGIN(INITIAL);return handleint();} -{FLOAT} {c(); BEGIN(INITIAL);return handlefloat();} +{HEXINT}/{_} {c(); BEGIN(INITIAL);return handlehex();} +{HEXFLOAT}/{_} {c(); BEGIN(INITIAL);return handlehexfloat();} +{INT}/{_} {c(); BEGIN(INITIAL);return handleint();} +{FLOAT}/{_} {c(); BEGIN(INITIAL);return handlefloat();} 3rr0r {/* for debugging: generates a tokenizer-level error */ syntaxerror("3rr0r");} @@ -667,9 +683,10 @@ is {c();return m(KW_IS) ;} in {c();return m(KW_IN) ;} if {c();return m(KW_IF) ;} as {c();return m(KW_AS);} -{NAME} {c();BEGIN(INITIAL);return handleIdentifier(T_IDENTIFIER);} +{NAME} {c();BEGIN(INITIAL);return handleIdentifier();} -[+-\/*^~@$!%&\(=\[\]\{\}|?:;,<>] {c();BEGIN(REGEXPOK);return m(yytext[0]);} +[\]\}] {c();BEGIN(INITIAL);return m(yytext[0]);} +[+-\/*^~@$!%&\(=\[\{|?:;,<>] {c();BEGIN(REGEXPOK);return m(yytext[0]);} [\)\]] {c();BEGIN(INITIAL);return m(yytext[0]);} . {/* ERROR */ @@ -714,12 +731,27 @@ int yywrap() static char mbuf[256]; char*token2string(enum yytokentype nr, YYSTYPE v) { - if(nr==T_STRING) return ""; + if(nr==T_STRING) { + char*s = malloc(v.str.len+10); + strcpy(s, ""); + memcpy(s+8, v.str.str, v.str.len); + sprintf(s+8+v.str.len, " (%d bytes)", v.str.len); + return s; + } + else if(nr==T_REGEXP) { + char*s = malloc(strlen(v.regexp.pattern)+10); + sprintf(s, "%s", v.regexp.pattern); + return s; + } + else if(nr==T_IDENTIFIER) { + char*s = malloc(strlen(v.id)+10); + sprintf(s, "%s", v.id); + return s; + } 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***"; else if(nr==T_GE) return ">="; else if(nr==T_LE) return "<="; @@ -758,7 +790,6 @@ char*token2string(enum yytokentype nr, YYSTYPE v) else if(nr==KW_VAR) return "var"; else if(nr==KW_IS) return "is"; else if(nr==KW_AS) return "as"; - else if(nr==T_IDENTIFIER) return "ID"; else { sprintf(mbuf, "%d", nr); return mbuf;