SpiderScript - Added tags to loops to allow arbitary depth breaks
[tpg/acess2.git] / Usermode / Libraries / libspiderscript.so_src / tokens.h
1 /*
2  */
3 #ifndef _TOKENS_H_
4 #define _TOKENS_H_
5
6 #include <setjmp.h>
7
8 // Make the scope character ('.') be a symbol, otherwise it's just
9 // a ident character
10 #define USE_SCOPE_CHAR  1
11
12 // === TYPES ===
13 typedef struct
14 {       
15         // Lexer State
16         const char      *BufStart;
17         const char      *CurPos;
18         
19         char    *Filename;
20         
21          int    LastLine;
22          int    LastToken, LastTokenLen;
23         const char      *LastTokenStr;
24         
25          int    NextLine;
26          int    NextToken, NextTokenLen;
27         const char      *NextTokenStr;
28         
29          int    CurLine;
30          int    Token, TokenLen;
31         const char      *TokenStr;
32         
33         jmp_buf JmpTarget;
34          int    ErrorHit;
35 }       tParser;
36
37 // === FUNCTIONS ===
38  int    GetToken(tParser *File);
39 void    PutBack(tParser *File);
40  int    LookAhead(tParser *File);
41
42 // === CONSTANTS ===
43 enum eTokens
44 {
45         TOK_INVAL,
46         TOK_EOF,
47         
48         // Primitives
49         TOK_STR,
50         TOK_INTEGER,
51         TOK_REAL,
52         TOK_VARIABLE,
53         TOK_IDENT,
54         
55         // Reserved Words
56         // - Definitions
57         TOK_RWD_FUNCTION,
58         TOK_RWD_NAMESPACE,
59         // - Control Flow
60         TOK_RWD_NEW,
61         TOK_RWD_RETURN,
62         TOK_RWD_BREAK,
63         TOK_RWD_CONTINUE,
64         // - Blocks
65         TOK_RWD_IF,
66         TOK_RWD_ELSE,
67         TOK_RWD_DO,
68         TOK_RWD_WHILE,
69         TOK_RWD_FOR,
70         // - Value
71         TOK_RWD_NULL,
72         // - Types
73         TOK_RWD_VOID,
74         TOK_RWD_OBJECT,
75         TOK_RWD_OPAQUE,
76         TOK_RWD_STRING,
77         TOK_RWD_INTEGER,
78         TOK_RWD_REAL,
79         
80         // 
81         TOK_ASSIGN,
82         TOK_SEMICOLON,
83         TOK_COMMA,
84         TOK_SCOPE,
85         TOK_ELEMENT,
86         
87         // Comparisons
88         TOK_EQUALS,
89         TOK_LT, TOK_LTE,
90         TOK_GT, TOK_GTE,
91         
92         // Operations
93         TOK_BWNOT,      TOK_LOGICNOT,
94         TOK_DIV,        TOK_MUL,
95         TOK_PLUS,       TOK_MINUS,
96         TOK_SHL,        TOK_SHR,
97         TOK_LOGICAND,   TOK_LOGICOR,    TOK_LOGICXOR,
98         TOK_AND,        TOK_OR, TOK_XOR,
99         
100         // Assignment Operations
101         TOK_INCREMENT,          TOK_DECREMENT,
102         TOK_ASSIGN_DIV,         TOK_ASSIGN_MUL,
103         TOK_ASSIGN_PLUS,        TOK_ASSIGN_MINUS,
104         TOK_ASSIGN_SHL,         TOK_ASSIGN_SHR,
105         TOK_ASSIGN_LOGICAND,    TOK_ASSIGN_LOGICOR,     TOK_ASSIGN_LOGXICOR,
106         TOK_ASSIGN_AND,         TOK_ASSIGN_OR,  TOK_ASSIGN_XOR,
107         
108         TOK_PAREN_OPEN,         TOK_PAREN_CLOSE,
109         TOK_BRACE_OPEN,         TOK_BRACE_CLOSE,
110         TOK_SQUARE_OPEN,        TOK_SQUARE_CLOSE,
111         
112         TOK_LAST
113 };
114
115 #define TOKEN_GROUP_TYPES       TOK_RWD_VOID:\
116         case TOK_RWD_OBJECT:\
117         case TOK_RWD_OPAQUE:\
118         case TOK_RWD_INTEGER:\
119         case TOK_RWD_STRING:\
120         case TOK_RWD_REAL
121 #define TOKEN_GROUP_TYPES_STR   "TOK_RWD_VOID, TOK_RWD_OBJECT, TOK_RWD_OPAQUE, TOK_RWD_INTEGER, TOK_RWD_STRING or TOK_RWD_REAL"
122
123 #define TOKEN_GET_DATATYPE(_type, _tok) do { switch(_tok) {\
124         case TOK_RWD_VOID:  _type = SS_DATATYPE_UNDEF;  break;\
125         case TOK_RWD_INTEGER:_type = SS_DATATYPE_INTEGER;       break;\
126         case TOK_RWD_OPAQUE: _type = SS_DATATYPE_OPAQUE;        break;\
127         case TOK_RWD_OBJECT: _type = SS_DATATYPE_OBJECT;        break;\
128         case TOK_RWD_REAL:   _type = SS_DATATYPE_REAL;  break;\
129         case TOK_RWD_STRING: _type = SS_DATATYPE_STRING;        break;\
130         default:_type=SS_DATATYPE_UNDEF;fprintf(stderr,\
131         "ERROR: Unexpected %s, expected "TOKEN_GROUP_TYPES_STR"\n",csaTOKEN_NAMES[Parser->Token]);\
132         break;\
133         } } while(0)
134
135 # if WANT_TOKEN_STRINGS
136 const char * const csaTOKEN_NAMES[] = {
137         "TOK_INVAL",
138         "TOK_EOF",
139         
140         "TOK_STR",
141         "TOK_INTEGER",
142         "TOK_REAL",
143         "TOK_VARIABLE",
144         "TOK_IDENT",
145         
146         "TOK_RWD_FUNCTION",
147         "TOK_RWD_NAMESPACE",
148         
149         "TOK_RWD_NEW",
150         "TOK_RWD_RETURN",
151         "TOK_RWD_BREAK",
152         "TOK_RWD_CONTINUE",
153         
154         "TOK_RWD_IF",
155         "TOK_RWD_ELSE",
156         "TOK_RWD_DO",
157         "TOK_RWD_WHILE",
158         "TOK_RWD_FOR",
159         
160         "TOK_RWD_NULL",
161         "TOK_RWD_VOID",
162         "TOK_RWD_OBJECT",
163         "TOK_RWD_OPAUQE",
164         "TOK_RWD_STRING",
165         "TOK_RWD_INTEGER",
166         "TOK_RWD_REAL",
167         
168         "TOK_ASSIGN",
169         "TOK_SEMICOLON",
170         "TOK_COMMA",
171         "TOK_SCOPE",
172         "TOK_ELEMENT",
173         
174         "TOK_EQUALS",
175         "TOK_LT",       "TOK_LTE",
176         "TOK_GT",       "TOK_GTE",
177         
178         "TOK_BWNOT",    "TOK_LOGICNOT",
179         "TOK_DIV",      "TOK_MUL",
180         "TOK_PLUS",     "TOK_MINUS",
181         "TOK_SHL",      "TOK_SHR",
182         "TOK_LOGICAND", "TOK_LOGICOR",  "TOK_LOGICXOR",
183         "TOK_AND",      "TOK_OR",       "TOK_XOR",
184         
185         "TOK_INCREMENT",        "TOK_DECREMENT",
186         "TOK_ASSIGN_DIV",       "TOK_ASSIGN_MUL",
187         "TOK_ASSIGN_PLUS",      "TOK_ASSIGN_MINUS",
188         "TOK_ASSIGN_SHL",       "TOK_ASSIGN_SHR",
189         "TOK_ASSIGN_LOGICAND",  "TOK_ASSIGN_LOGICOR",   "TOK_ASSIGN_LOGICXOR",
190         "TOK_ASSIGN_AND",       "TOK_ASSIGN_OR",        "TOK_ASSIGN_XOR",
191         
192         "TOK_PAREN_OPEN",       "TOK_PAREN_CLOSE",
193         "TOK_BRACE_OPEN",       "TOK_BRACE_CLOSE",
194         "TOK_SQUARE_OPEN",      "TOK_SQUARE_CLOSE",
195         
196         "TOK_LAST"
197 };
198 # endif
199
200 #endif

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