#include <stdio.h>
#include <string.h>
-#define USE_SCOPE_CHAR 0
-
#define DEBUG 0
#define ARRAY_SIZE(x) ((sizeof(x))/(sizeof((x)[0])))
{TOK_RWD_FUNCTION, "function"},
{TOK_RWD_RETURN, "return"},
+ {TOK_RWD_BREAK, "break"},
+ {TOK_RWD_CONTINUE, "continue"},
{TOK_RWD_NEW, "new"},
{TOK_RWD_IF, "if"},
{TOK_RWD_WHILE, "while"},
{TOK_RWD_FOR, "for"},
+ {TOK_RWD_NULL, "null"},
{TOK_RWD_VOID, "void"},
{TOK_RWD_OBJECT, "Object"},
{TOK_RWD_OPAQUE, "Opaque"},
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
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 '$':
// 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')
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
{