remove quotes around strings added if/else,==,!=
[swftools.git] / lib / as3 / tokenizer.lex
index 7a17622..1be891f 100644 (file)
@@ -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 <kramm@quiss.org>
+   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 <string.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -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)
@@ -121,9 +161,10 @@ static inline int handlenumber()
     char is_float=0;
     for(t=0;t<yyleng;t++) {
         if(yytext[t]=='.') {
+            if(is_float)
+                syntaxerror("Invalid number");
             is_float=1;
-        } 
-        if(!strchr("0123456789", yytext[t])) {
+        } else if(!strchr("-0123456789", yytext[t])) {
             syntaxerror("Invalid number");
         }
     }
@@ -131,31 +172,39 @@ static inline int handlenumber()
         avm2_lval.number_float = atof(s);
         return T_FLOAT;
     } 
-    int l=0;
-    if(yytext[0]=='-')
-        l++;
+    char l = (yytext[0]=='-');
 
-    char*max = l?"2147483648":"4294967296";
-    if(yyleng>10)
+    char*max = l?"1073741824":"2147483647";
+    if(yyleng-l>10)
         syntaxerror("integer overflow");
-    if(yyleng==10) {
+    if(yyleng-l==10) {
         int t;
         for(t=0;t<yyleng-l;t++) {
             if(yytext[l+t]>max[t])
-                syntaxerror("integer overflow");
+                syntaxerror("integer overflow %s > %s", s+l,max);
             else if(yytext[l+t]<max[t])
                 break;
         }
     }
     if(yytext[0]=='-') {
-        avm2_lval.number_int = atoi(s);
-        return T_INT;
+        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;
     } else {
-        unsigned int v = atoi(s);
+        unsigned int v = 0;
+        for(t=0;t<yyleng;t++) {
+            v*=10;
+            v+=yytext[t]-'0';
+        }
         avm2_lval.number_uint = v;
-        if(v<256)
+        if(v<128)
             return T_BYTE;
-        else if(v<0x80000000)
+        else if(v<32768)
             return T_SHORT;
         else
             return T_UINT;
@@ -190,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;}
 
 <BEGINNING,REGEXPOK>{
 {REGEXP}                     {c(); BEGIN(INITIAL);return m(T_REGEXP);} 
@@ -201,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);}
@@ -230,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);}
@@ -242,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);}
 
@@ -324,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";