Merge branch 'master' of serenade.mutabah.net:acess2
[tpg/acess2.git] / Usermode / Libraries / libspiderscript.so_src / lex.c
index 7121ce1..bb86198 100644 (file)
@@ -7,8 +7,6 @@
 #include <stdio.h>
 #include <string.h>
 
-#define USE_SCOPE_CHAR 0
-
 #define DEBUG  0
 
 #define ARRAY_SIZE(x)  ((sizeof(x))/(sizeof((x)[0])))
@@ -27,6 +25,8 @@ const struct {
        {TOK_RWD_FUNCTION, "function"},
        
        {TOK_RWD_RETURN, "return"},
+       {TOK_RWD_BREAK, "break"},
+       {TOK_RWD_CONTINUE, "continue"},
        {TOK_RWD_NEW, "new"},
        
        {TOK_RWD_IF, "if"},
@@ -35,6 +35,7 @@ const struct {
        {TOK_RWD_WHILE, "while"},
        {TOK_RWD_FOR, "for"},
        
+       {TOK_RWD_NULL, "null"},
        {TOK_RWD_VOID, "void"},
        {TOK_RWD_OBJECT, "Object"},
        {TOK_RWD_OPAQUE, "Opaque"},
@@ -161,24 +162,65 @@ int GetToken(tParser *File)
                ret = TOK_AND;
                break;
        
-       case '/':       ret = TOK_DIV;  break;
-       case '*':       ret = TOK_MUL;  break;
-       case '+':       ret = TOK_PLUS; break;
+       case '/':
+               if( *File->CurPos == '=' ) {
+                       File->CurPos ++;
+                       ret = TOK_ASSIGN_DIV;
+                       break;
+               }
+               ret = TOK_DIV;
+               break;
+       case '*':
+               if( *File->CurPos == '=' ) {
+                       File->CurPos ++;
+                       ret = TOK_ASSIGN_MUL;
+                       break;
+               }
+               ret = TOK_MUL;
+               break;
+       case '+':
+               if( *File->CurPos == '+' ) {
+                       File->CurPos ++;
+                       ret = TOK_INCREMENT;
+                       break;
+               }
+               if( *File->CurPos == '=' ) {
+                       File->CurPos ++;
+                       ret = TOK_ASSIGN_PLUS;
+                       break;
+               }
+               ret = TOK_PLUS;
+               break;
        case '-':
+               if( *File->CurPos == '-' ) {
+                       File->CurPos ++;
+                       ret = TOK_DECREMENT;
+                       break;
+               }
+               if( *File->CurPos == '=' ) {
+                       File->CurPos ++;
+                       ret = TOK_ASSIGN_MINUS;
+                       break;
+               }
                if( *File->CurPos == '>' ) {
                        File->CurPos ++;
                        ret = TOK_ELEMENT;
+                       break;
                }
-               else
-                       ret = TOK_MINUS;
+               ret = TOK_MINUS;
                break;
        
        // Strings
        case '"':
                while( *File->CurPos && !(*File->CurPos == '"' && *File->CurPos != '\\') )
                        File->CurPos ++;
-               File->CurPos ++;
-               ret = TOK_STR;
+               if( *File->CurPos )
+               {
+                       File->CurPos ++;
+                       ret = TOK_STR;
+               }
+               else
+                       ret = TOK_EOF;
                break;
        
        // Brackets
@@ -208,6 +250,37 @@ int GetToken(tParser *File)
                ret = TOK_ASSIGN;
                break;
        
+       // Less-Than
+       case '<':
+               // Less-Than or Equal
+               if( *File->CurPos == '=' ) {
+                       File->CurPos ++;
+                       ret = TOK_LTE;
+                       break;
+               }
+               ret = TOK_LT;
+               break;
+       
+       // Greater-Than
+       case '>':
+               // Greater-Than or Equal
+               if( *File->CurPos == '=' ) {
+                       File->CurPos ++;
+                       ret = TOK_GTE;
+                       break;
+               }
+               ret = TOK_GT;
+               break;
+       
+       // Logical NOT
+       case '!':
+               ret = TOK_LOGICNOT;
+               break;
+       // Bitwise NOT
+       case '~':
+               ret = TOK_BWNOT;
+               break;
+       
        // Variables
        // \$[0-9]+ or \$[_a-zA-Z][_a-zA-Z0-9]*
        case '$':
@@ -231,7 +304,9 @@ int GetToken(tParser *File)
                // Numbers
                if( isdigit(*File->CurPos) )
                {
-                       if( *File->CurPos == '0' && File->CurPos[1] == 'x' ) {
+                       ret = TOK_INTEGER;
+                       if( *File->CurPos == '0' && File->CurPos[1] == 'x' )
+                       {
                                File->CurPos += 2;
                                while(('0' <= *File->CurPos && *File->CurPos <= '9')
                                   || ('A' <= *File->CurPos && *File->CurPos <= 'F')
@@ -240,24 +315,48 @@ int GetToken(tParser *File)
                                        File->CurPos ++;
                                }
                        }
-                       else {
+                       else
+                       {
                                while( isdigit(*File->CurPos) )
                                        File->CurPos ++;
+                               
+//                             printf("*File->CurPos = '%c'\n", *File->CurPos);
+                               
+                               // Decimal
+                               if( *File->CurPos == '.' )
+                               {
+                                       ret = TOK_REAL;
+                                       File->CurPos ++;
+                                       while( isdigit(*File->CurPos) )
+                                               File->CurPos ++;
+                               }
+                               // Exponent
+                               if( *File->CurPos == 'e' || *File->CurPos == 'E' )
+                               {
+                                       ret = TOK_REAL;
+                                       File->CurPos ++;
+                                       if(*File->CurPos == '-' || *File->CurPos == '+')
+                                               File->CurPos ++;
+                                       while( isdigit(*File->CurPos) )
+                                               File->CurPos ++;
+                               }
+                               
+//                             printf(" ret = %i\n", ret);
                        }
-                       ret = TOK_INTEGER;
                        break;
                }
        
                // Identifier
                if( is_ident(*File->CurPos) )
                {
+                       ret = TOK_IDENT;
+                       
                        // Identifier
                        while( is_ident(*File->CurPos) || isdigit(*File->CurPos) )
                                File->CurPos ++;
                        
                        // This is set later too, but we use it below
                        File->TokenLen = File->CurPos - File->TokenStr;
-                       ret = TOK_IDENT;
                        
                        // Check if it's a reserved word
                        {

UCC git Repository :: git.ucc.asn.au