From d38bff51fe470dc652bb38f7da2e4cfebd800810 Mon Sep 17 00:00:00 2001 From: kramm Date: Tue, 9 Dec 2008 13:41:02 +0000 Subject: [PATCH] added +=,-=,=== --- lib/as3/tokenizer.h | 12 ++++++++++ lib/as3/tokenizer.lex | 62 +++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 69 insertions(+), 5 deletions(-) diff --git a/lib/as3/tokenizer.h b/lib/as3/tokenizer.h index a07ab51..0b2689c 100644 --- a/lib/as3/tokenizer.h +++ b/lib/as3/tokenizer.h @@ -25,6 +25,8 @@ DECLARE(token); DECLARE_LIST(token); +DECLARE(typedcode); +DECLARE(typedcode_list); struct _token { int type; @@ -35,8 +37,18 @@ struct _token { typedef struct _writeable { code_t*write; code_t*read; + multiname_t*type; } writeable_t; +struct _typedcode { + code_t*c; + multiname_t*t; +}; +struct _typedcode_list { + struct _typedcode typedcode; + struct _typedcode_list*nxt; +}; + extern char start_of_expression; typedef token_t*tokenptr_t; diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index 8bf8c89..76fb483 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) @@ -187,7 +227,7 @@ NUMBER -?[0-9]+(\.[0-9]*)? STRING ["](\\[\x00-\xff]|[^\\"\n])*["]|['](\\[\x00-\xff]|[^\\'\n])*['] S [ \n\r\t] -MULTILINE_COMMENT [/][*]([*][^/]|[^*]|[\x00-\x31])*[*]+[/] +MULTILINE_COMMENT [/][*]+([*][^/]|[^/*]|[\x00-\x1f])*[*]+[/] SINGLELINE_COMMENT \/\/[^\n]*\n REGEXP [/]([^/\n]|\\[/])*[/][a-zA-Z]* %% @@ -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,18 @@ REGEXP [/]([^/\n]|\\[/])*[/][a-zA-Z]* {NUMBER} {c(); BEGIN(INITIAL);return handlenumber();} +3rr0r {/* for debugging: generates a tokenizer-level error */ + syntaxerror("3rr0r");} + +[!][=] {BEGIN(REGEXPOK);return m(T_NE);} +[=][=][=] {BEGIN(REGEXPOK);return m(T_EQEQEQ);} +[=][=] {BEGIN(REGEXPOK);return m(T_EQEQ);} [>][=] {return m(T_GE);} [<][=] {return m(T_LE);} +[+][=] {return m(T_PLUSBY);} +[-][=] {return m(T_MINUSBY);} [-][-] {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);} @@ -236,13 +283,16 @@ native {return m(KW_NATIVE);} static {return m(KW_STATIC);} import {return m(KW_IMPORT);} Number {return m(KW_NUMBER);} +while {return m(KW_WHILE);} 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);} +break {return m(KW_BREAK);} +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 +301,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 +384,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"; -- 1.7.10.4