1 /*
2  *  AvidaScript.h
3  *  avida_test_language
4  *
5  *  Created by David on 1/14/06.
6  *  Copyright 1999-2011 Michigan State University. All rights reserved.
7  *
8  *
9  *  This file is part of Avida.
10  *
11  *  Avida is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
12  *  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
13  *
14  *  Avida is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Lesser General Public License along with Avida.
18  *  If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef AvidaScript_h
23 #define AvidaScript_h
24 
25 #include "cString.h"
26 
27 typedef enum eASTokens {
28   AS_TOKEN_SUPPRESS = 1,
29   AS_TOKEN_ENDL,
30   AS_TOKEN_COMMA,
31 
32   AS_TOKEN_OP_BIT_NOT, // 4
33   AS_TOKEN_OP_BIT_AND,
34   AS_TOKEN_OP_BIT_OR,
35 
36   AS_TOKEN_OP_LOGIC_NOT, // 7
37   AS_TOKEN_OP_LOGIC_AND,
38   AS_TOKEN_OP_LOGIC_OR,
39 
40   AS_TOKEN_OP_ADD, // 10
41   AS_TOKEN_OP_SUB,
42   AS_TOKEN_OP_MUL,
43   AS_TOKEN_OP_DIV,
44   AS_TOKEN_OP_MOD,
45 
46   AS_TOKEN_DOT, // 15
47   AS_TOKEN_ASSIGN,
48   AS_TOKEN_REF,
49 
50   AS_TOKEN_OP_EQ, // 18
51   AS_TOKEN_OP_LE,
52   AS_TOKEN_OP_GE,
53   AS_TOKEN_OP_LT,
54   AS_TOKEN_OP_GT,
55   AS_TOKEN_OP_NEQ,
56 
57   AS_TOKEN_PREC_OPEN, // 24
58   AS_TOKEN_PREC_CLOSE,
59 
60   AS_TOKEN_IDX_OPEN, // 26
61   AS_TOKEN_IDX_CLOSE,
62 
63   AS_TOKEN_ARR_OPEN, // 28
64   AS_TOKEN_ARR_CLOSE,
65   AS_TOKEN_ARR_RANGE,
66   AS_TOKEN_ARR_EXPAN,
67   AS_TOKEN_ARR_WILD,
68 
69   AS_TOKEN_LITERAL_DICT, // 33
70   AS_TOKEN_DICT_MAPPING,
71   AS_TOKEN_LITERAL_MATRIX,
72 
73   AS_TOKEN_TYPE_ARRAY, // 36
74   AS_TOKEN_TYPE_BOOL,
75   AS_TOKEN_TYPE_CHAR,
76   AS_TOKEN_TYPE_DICT,
77   AS_TOKEN_TYPE_FLOAT,
78   AS_TOKEN_TYPE_INT,
79   AS_TOKEN_TYPE_MATRIX,
80   AS_TOKEN_TYPE_STRING,
81   AS_TOKEN_TYPE_VAR,
82   AS_TOKEN_TYPE_VOID,
83 
84   AS_TOKEN_CMD_IF, // 46
85   AS_TOKEN_CMD_ELSE,
86   AS_TOKEN_CMD_ELSEIF,
87   AS_TOKEN_CMD_WHILE,
88   AS_TOKEN_CMD_FOREACH,
89   AS_TOKEN_CMD_FUNCTION,
90 
91   AS_TOKEN_CMD_RETURN, // 52
92 
93   AS_TOKEN_BUILTIN_CALL, // 53
94   AS_TOKEN_BUILTIN_METHOD,
95 
96   AS_TOKEN_ID, // 55
97 
98   AS_TOKEN_FLOAT, // 56
99   AS_TOKEN_INT,
100   AS_TOKEN_STRING,
101   AS_TOKEN_CHAR,
102   AS_TOKEN_BOOL,
103 
104   AS_TOKEN_UNKNOWN, // 60
105   AS_TOKEN_INVALID
106 } ASToken_t;
107 
108 
109 typedef enum eASParseErrors {
110   AS_PARSE_ERR_UNEXPECTED_TOKEN,
111   AS_PARSE_ERR_UNTERMINATED_EXPR,
112   AS_PARSE_ERR_NULL_EXPR,
113   AS_PARSE_ERR_EOF,
114   AS_PARSE_ERR_EMPTY,
115   AS_PARSE_ERR_INTERNAL,
116 
117   AS_PARSE_ERR_UNKNOWN
118 } ASParseError_t;
119 
120 
121 typedef enum eASSemanticErrors {
122   AS_SEMANTIC_WARN_LOSS_OF_PRECISION,
123   AS_SEMANTIC_WARN_NO_DIMENSIONS,
124   AS_SEMANTIC_WARN_NO_RETURN,
125   AS_SEMANTIC_WARN_UNREACHABLE,
126   AS_SEMANTIC_WARN__LAST,
127 
128   AS_SEMANTIC_ERR_ARGUMENT_DEFAULT_REQUIRED,
129   AS_SEMANTIC_ERR_ARGUMENT_MISSING_REQUIRED,
130   AS_SEMANTIC_ERR_BUILTIN_CALL_SIGNATURE_MISMATCH,
131   AS_SEMANTIC_ERR_CANNOT_CAST,
132   AS_SEMANTIC_ERR_CANNOT_COMPARE,
133   AS_SEMANTIC_ERR_CANNOT_OVERRIDE_LIB_FUNCTION,
134   AS_SEMANTIC_ERR_FUNCTION_CALL_SIGNATURE_MISMATCH,
135   AS_SEMANTIC_ERR_FUNCTION_DEFAULT_CALL_INVALID,
136   AS_SEMANTIC_ERR_FUNCTION_DEFAULT_VARIABLE_REF_INVALID,
137   AS_SEMANTIC_ERR_FUNCTION_REDEFINITION,
138   AS_SEMANTIC_ERR_FUNCTION_RTYPE_MISMATCH,
139   AS_SEMANTIC_ERR_FUNCTION_SIGNATURE_MISMATCH,
140   AS_SEMANTIC_ERR_FUNCTION_UNDECLARED,
141   AS_SEMANTIC_ERR_FUNCTION_UNDEFINED,
142   AS_SEMANTIC_ERR_INVALID_ASSIGNMENT_TARGET,
143   AS_SEMANTIC_ERR_INVALID_CHAR_LITERAL,
144   AS_SEMANTIC_ERR_TOO_MANY_ARGUMENTS,
145   AS_SEMANTIC_ERR_UNDEFINED_TYPE_OP,
146   AS_SEMANTIC_ERR_UNPACK_WILD_NONARRAY,
147   AS_SEMANTIC_ERR_VARIABLE_DIMENSIONS_INVALID,
148   AS_SEMANTIC_ERR_VARIABLE_UNDEFINED,
149   AS_SEMANTIC_ERR_VARIABLE_REDEFINITION,
150   AS_SEMANTIC_ERR_INTERNAL,
151 
152   AS_SEMANTIC_ERR_UNKNOWN
153 } ASSemanticError_t;
154 
155 typedef enum eASDirectInterpretErrors {
156   AS_DIRECT_INTERPRET_ERR_CANNOT_RESIZE_MATRIX_ROW,
157   AS_DIRECT_INTERPRET_ERR_DIVISION_BY_ZERO,
158   AS_DIRECT_INTERPRET_ERR_INDEX_OUT_OF_BOUNDS,
159   AS_DIRECT_INTERPRET_ERR_INDEX_ERROR,
160   AS_DIRECT_INTERPRET_ERR_INVALID_ARRAY_SIZE,
161   AS_DIRECT_INTERPRET_ERR_KEY_NOT_FOUND,
162   AS_DIRECT_INTERPRET_ERR_MATRIX_OP_TYPE_MISMATCH,
163   AS_DIRECT_INTERPRET_ERR_MATRIX_SIZE_MISMATCH,
164   AS_DIRECT_INTERPRET_ERR_NOBJ_METHOD_LOOKUP_FAILED,
165   AS_DIRECT_INTERPRET_ERR_NOBJ_TYPE_MISMATCH,
166   AS_DIRECT_INTERPRET_ERR_OBJECT_ASSIGN_FAIL,
167   AS_DIRECT_INTERPRET_ERR_TYPE_CAST,
168   AS_DIRECT_INTERPRET_ERR_UNDEFINED_TYPE_OP,
169   AS_DIRECT_INTERPRET_ERR_UNPACK_VALUE_TOO_LARGE,
170   AS_DIRECT_INTERPRET_ERR_UNPACK_VALUE_TOO_SMALL,
171   AS_DIRECT_INTERPRET_ERR_INTERNAL,
172 
173   AS_DIRECT_INTERPRET_ERR_UNKNOWN
174 } ASDirectInterpretError_t;
175 
176 typedef enum eASBuiltInFunction {
177   AS_BUILTIN_CAST_BOOL,
178   AS_BUILTIN_CAST_CHAR,
179   AS_BUILTIN_CAST_INT,
180   AS_BUILTIN_CAST_FLOAT,
181   AS_BUILTIN_CAST_STRING,
182   AS_BUILTIN_IS_ARRAY,
183   AS_BUILTIN_IS_BOOL,
184   AS_BUILTIN_IS_CHAR,
185   AS_BUILTIN_IS_DICT,
186   AS_BUILTIN_IS_INT,
187   AS_BUILTIN_IS_FLOAT,
188   AS_BUILTIN_IS_MATRIX,
189   AS_BUILTIN_IS_STRING,
190   AS_BUILTIN_CLEAR,
191   AS_BUILTIN_COPY,
192   AS_BUILTIN_HASKEY,
193   AS_BUILTIN_KEYS,
194   AS_BUILTIN_LEN,
195   AS_BUILTIN_REMOVE,
196   AS_BUILTIN_RESIZE,
197   AS_BUILTIN_VALUES,
198 
199   AS_BUILTIN_UNKNOWN
200 } ASBuiltIn_t;
201 
202 enum eASExitCodes {
203   AS_EXIT_OK = 0,
204   AS_EXIT_FILE_NOT_FOUND = 200,
205   AS_EXIT_FAIL_PARSE,
206   AS_EXIT_FAIL_SEMANTIC,
207   AS_EXIT_FAIL_INTERPRET,
208 
209   AS_EXIT_INTERNAL_ERROR,
210 
211   AS_EXIT_UNKNOWN
212 };
213 
214 typedef enum eASTypes {
215   AS_TYPE_ARRAY = 0,
216   AS_TYPE_BOOL,
217   AS_TYPE_CHAR,
218   AS_TYPE_DICT,
219   AS_TYPE_FLOAT,
220   AS_TYPE_INT,
221   AS_TYPE_OBJECT_REF,
222   AS_TYPE_MATRIX,
223   AS_TYPE_STRING,
224   AS_TYPE_VAR,
225 
226   AS_TYPE_RUNTIME,
227 
228   AS_TYPE_VOID,
229 
230   AS_TYPE_INVALID
231 } ASType_t;
232 
233 struct sASTypeInfo {
234   ASType_t type;
235   cString info;
236 
sASTypeInfosASTypeInfo237   sASTypeInfo() : type(AS_TYPE_INVALID) { ; }
sASTypeInfosASTypeInfo238   sASTypeInfo(ASType_t in_type) : type(in_type) { ; }
sASTypeInfosASTypeInfo239   sASTypeInfo(ASType_t in_type, const cString& in_info) : type(in_type), info(in_info) { ; }
240 
241   bool operator==(const sASTypeInfo& ot) const { return (type == ot.type && info == ot.info); }
242   bool operator!=(const sASTypeInfo& ot) const { return (type != ot.type || info != ot.info); }
243 };
244 
245 enum eASMethodReturnValues {
246   AS_NOT_FOUND = -1
247 };
248 
249 
250 class cASNativeObject;
251 
252 namespace AvidaScript {
253   const char* mapBuiltIn(ASBuiltIn_t builtin);
254   const char* mapToken(ASToken_t token);
255   const char* mapType(const sASTypeInfo& type);
256 
TypeOf()257   template<typename T> inline sASTypeInfo TypeOf() { return sASTypeInfo(AS_TYPE_INVALID); }
258   template<> inline sASTypeInfo TypeOf<bool>() { return sASTypeInfo(AS_TYPE_BOOL); }
259   template<> inline sASTypeInfo TypeOf<char>() { return sASTypeInfo(AS_TYPE_CHAR); }
260   template<> inline sASTypeInfo TypeOf<int>() { return sASTypeInfo(AS_TYPE_INT); }
261   template<> inline sASTypeInfo TypeOf<double>() { return sASTypeInfo(AS_TYPE_FLOAT); }
262   template<> inline sASTypeInfo TypeOf<const cString&>() { return sASTypeInfo(AS_TYPE_STRING); }
263   template<> inline sASTypeInfo TypeOf<cString>() { return sASTypeInfo(AS_TYPE_STRING); }
264   template<> inline sASTypeInfo TypeOf<void>() { return sASTypeInfo(AS_TYPE_VOID); }
265   template<> inline sASTypeInfo TypeOf<cASNativeObject>() { return sASTypeInfo(AS_TYPE_OBJECT_REF); }
266 };
267 
268 #endif
269