SpiderScript - A day of debugging and improvements
[tpg/acess2.git] / Usermode / Libraries / libspiderscript.so_src / tokens.h
index 44c3a81..5a529f7 100644 (file)
@@ -3,6 +3,8 @@
 #ifndef _TOKENS_H_
 #define _TOKENS_H_
 
+#include <setjmp.h>
+
 // === TYPES ===
 typedef struct
 {      
@@ -10,14 +12,19 @@ typedef struct
        char    *BufStart;
        char    *CurPos;
        
+        int    LastLine;
         int    LastToken, LastTokenLen;
        char    *LastTokenStr;
        
+        int    NextLine;
         int    NextToken, NextTokenLen;
        char    *NextTokenStr;
        
+        int    CurLine;
         int    Token, TokenLen;
        char    *TokenStr;
+       
+       jmp_buf JmpTarget;
 }      tParser;
 
 // === FUNCTIONS ===
@@ -31,40 +38,149 @@ enum eTokens
        TOK_INVAL,
        TOK_EOF,
        
+       // Primitives
        TOK_STR,
        TOK_INTEGER,
        TOK_VARIABLE,
        TOK_IDENT,
        
+       // Reserved Words
+       // - Definitions
        TOK_RWD_FUNCTION,
+       TOK_RWD_NAMESPACE,
+       // - Control Flow
+       TOK_RWD_NEW,
+       TOK_RWD_RETURN,
+       TOK_RWD_BREAK,
+       TOK_RWD_CONTINUE,
+       // - Blocks
+       TOK_RWD_IF,
+       TOK_RWD_ELSE,
+       TOK_RWD_DO,
+       TOK_RWD_WHILE,
+       TOK_RWD_FOR,
+       // - Types
+       TOK_RWD_VOID,
+       TOK_RWD_OBJECT,
+       TOK_RWD_OPAQUE,
        TOK_RWD_STRING,
        TOK_RWD_INTEGER,
        TOK_RWD_REAL,
        
+       // 
        TOK_ASSIGN,
        TOK_SEMICOLON,
        TOK_COMMA,
        TOK_SCOPE,
        TOK_ELEMENT,
        
+       // Comparisons
        TOK_EQUALS,
        TOK_LT, TOK_LTE,
        TOK_GT, TOK_GTE,
        
+       // Operations
        TOK_DIV,        TOK_MUL,
        TOK_PLUS,       TOK_MINUS,
        TOK_SHL,        TOK_SHR,
        TOK_LOGICAND,   TOK_LOGICOR,    TOK_LOGICXOR,
        TOK_AND,        TOK_OR, TOK_XOR,
        
-       TOK_PAREN_OPEN,
-       TOK_PAREN_CLOSE,
-       TOK_BRACE_OPEN,
-       TOK_BRACE_CLOSE,
-       TOK_SQUARE_OPEN,
-       TOK_SQUARE_CLOSE,
+       // Assignment Operations
+       TOK_INCREMENT,          TOK_DECREMENT,
+       TOK_ASSIGN_DIV,         TOK_ASSIGN_MUL,
+       TOK_ASSIGN_PLUS,        TOK_ASSIGN_MINUS,
+       TOK_ASSIGN_SHL,         TOK_ASSIGN_SHR,
+       TOK_ASSIGN_LOGICAND,    TOK_ASSIGN_LOGICOR,     TOK_ASSIGN_LOGXICOR,
+       TOK_ASSIGN_AND,         TOK_ASSIGN_OR,  TOK_ASSIGN_XOR,
+       
+       TOK_PAREN_OPEN,         TOK_PAREN_CLOSE,
+       TOK_BRACE_OPEN,         TOK_BRACE_CLOSE,
+       TOK_SQUARE_OPEN,        TOK_SQUARE_CLOSE,
        
        TOK_LAST
 };
 
+#define TOKEN_GROUP_TYPES      TOK_RWD_VOID:\
+       case TOK_RWD_OBJECT:\
+       case TOK_RWD_OPAQUE:\
+       case TOK_RWD_INTEGER:\
+       case TOK_RWD_STRING:\
+       case TOK_RWD_REAL
+#define TOKEN_GROUP_TYPES_STR  "TOK_RWD_VOID, TOK_RWD_OBJECT, TOK_RWD_OPAQUE, TOK_RWD_INTEGER, TOK_RWD_STRING or TOK_RWD_REAL"
+
+#define TOKEN_GET_DATATYPE(_type, _tok) do { switch(_tok) {\
+       case TOK_RWD_VOID:  _type = SS_DATATYPE_UNDEF;  break;\
+       case TOK_RWD_INTEGER:_type = SS_DATATYPE_INTEGER;       break;\
+       case TOK_RWD_OPAQUE: _type = SS_DATATYPE_OPAQUE;        break;\
+       case TOK_RWD_OBJECT: _type = SS_DATATYPE_OBJECT;        break;\
+       case TOK_RWD_REAL:   _type = SS_DATATYPE_REAL;  break;\
+       case TOK_RWD_STRING: _type = SS_DATATYPE_STRING;        break;\
+       default:fprintf(stderr,\
+       "ERROR: Unexpected %s, expected "TOKEN_GROUP_TYPES_STR"\n",csaTOKEN_NAMES[Parser->Token]);\
+       break;\
+       } } while(0)
+
+# if WANT_TOKEN_STRINGS
+const char * const csaTOKEN_NAMES[] = {
+       "TOK_INVAL",
+       "TOK_EOF",
+       
+       "TOK_STR",
+       "TOK_INTEGER",
+       "TOK_VARIABLE",
+       "TOK_IDENT",
+       
+       "TOK_RWD_FUNCTION",
+       "TOK_RWD_NAMESPACE",
+       
+       "TOK_RWD_NEW",
+       "TOK_RWD_RETURN",
+       "TOK_RWD_BREAK",
+       "TOK_RWD_CONTINUE",
+       
+       "TOK_RWD_IF",
+       "TOK_RWD_ELSE",
+       "TOK_RWD_DO",
+       "TOK_RWD_WHILE",
+       "TOK_RWD_FOR",
+       
+       "TOK_RWD_VOID",
+       "TOK_RWD_OBJECT",
+       "TOK_RWD_OPAUQE",
+       "TOK_RWD_STRING",
+       "TOK_RWD_INTEGER",
+       "TOK_RWD_REAL",
+       
+       "TOK_ASSIGN",
+       "TOK_SEMICOLON",
+       "TOK_COMMA",
+       "TOK_SCOPE",
+       "TOK_ELEMENT",
+       
+       "TOK_EQUALS",
+       "TOK_LT",       "TOK_LTE",
+       "TOK_GT",       "TOK_GTE",
+       
+       "TOK_DIV",      "TOK_MUL",
+       "TOK_PLUS",     "TOK_MINUS",
+       "TOK_SHL",      "TOK_SHR",
+       "TOK_LOGICAND", "TOK_LOGICOR",  "TOK_LOGICXOR",
+       "TOK_AND",      "TOK_OR",       "TOK_XOR",
+       
+       "TOK_INCREMENT",        "TOK_DECREMENT",
+       "TOK_ASSIGN_DIV",       "TOK_ASSIGN_MUL",
+       "TOK_ASSIGN_PLUS",      "TOK_ASSIGN_MINUS",
+       "TOK_ASSIGN_SHL",       "TOK_ASSIGN_SHR",
+       "TOK_ASSIGN_LOGICAND",  "TOK_ASSIGN_LOGICOR",   "TOK_ASSIGN_LOGICXOR",
+       "TOK_ASSIGN_AND",       "TOK_ASSIGN_OR",        "TOK_ASSIGN_XOR",
+       
+       "TOK_PAREN_OPEN",       "TOK_PAREN_CLOSE",
+       "TOK_BRACE_OPEN",       "TOK_BRACE_CLOSE",
+       "TOK_SQUARE_OPEN",      "TOK_SQUARE_CLOSE",
+       
+       "TOK_LAST"
+};
+# endif
+
 #endif

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