X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibspiderscript.so_src%2Flex.c;h=bb86198dc0e1021be0dfb2e7863912d2aff10bd3;hb=2ebf89999759fc9d1ece6f98dfd439170995bb28;hp=fd395e0f2d188f07a65473ceaea20184630c7555;hpb=270e5fe88b0666021a7a6393334db7feeb8245f8;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libspiderscript.so_src/lex.c b/Usermode/Libraries/libspiderscript.so_src/lex.c index fd395e0f..bb86198d 100644 --- a/Usermode/Libraries/libspiderscript.so_src/lex.c +++ b/Usermode/Libraries/libspiderscript.so_src/lex.c @@ -7,10 +7,6 @@ #include #include -// Make the scope character ('.') be a symbol, otherwise it's just -// a ident character -#define USE_SCOPE_CHAR 0 - #define DEBUG 0 #define ARRAY_SIZE(x) ((sizeof(x))/(sizeof((x)[0]))) @@ -29,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"}, @@ -37,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"}, @@ -163,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 @@ -210,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 '$': @@ -233,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') @@ -242,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 {