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