244 lines
8.5 KiB
C
244 lines
8.5 KiB
C
#include "error.h"
|
|
|
|
static const char *err_msgs[] = {
|
|
/* MN_ERROR_OPENING_FILE */
|
|
"Error opening file '%s'.\n",
|
|
/* MN_ERROR_CLOSING_FILE */
|
|
"Error closing file '%s'.\n",
|
|
|
|
/* LX_LINE_CONTINUATION */
|
|
"%s:%d: a line with continuation may not be followed by an empty line\n",
|
|
/* LX_MULTIPLE_LINE_COMMENT */
|
|
"%s:%d: multiple line comment may not appear on the same line as code\n",
|
|
/* LX_EXPECTED_TOKEN_DELIMITER */
|
|
"%s:%d: expected token delimiter after string literal\n",
|
|
|
|
/* TK_EXPECTED_FLOATING_POINT */
|
|
"%s:%u: expected floating point decimal value\n",
|
|
/* TK_EXPECTED_INTEGER */
|
|
"%s:%u: expected integer value\n",
|
|
/* TK_UNKNOWN_TOKEN */
|
|
"%s:%u: unknown token at: %s\n",
|
|
|
|
/* PR_UNKNOWN_IDENTIFIER_TYPE */
|
|
"%s:%u: unable to delete unknown identifier type\n",
|
|
/* PR_UNKNOWN_STATEMENT_TYPE */
|
|
"unable to delete unknown statement type\n",
|
|
/* PR_UNKNOWN_EXPRESSION_TYPE */
|
|
"unable to delete unknown expression type\n",
|
|
/* PR_EXPECTED_BOOLEAN */
|
|
"%s:%u: expected integer at: %s\n",
|
|
/* PR_EXPECTED_INTEGER */
|
|
"%s:%u: expected integer at: %s\n",
|
|
/* PR_EXPECTED_FLOAT */
|
|
"%s:%u: expected float at: %s\n",
|
|
/* PR_EXPECTED_STRING */
|
|
"%s:%u: expected string at: %s\n",
|
|
/* PR_EXPECTED_CONSTANT */
|
|
"%s:%u: expected constant value at: %s\n",
|
|
/* PR_EXPECTED_TYPE */
|
|
"%s:%u: expected type at: %s\n",
|
|
/* PR_EXPECTED_IDENTIFIER */
|
|
"%s:%u: expected identifier at: %s\n",
|
|
/* PR_EXPECTED_TOKEN */
|
|
"%s:%u: expected %s at: %s\n",
|
|
/* PR_INVALID_OPERATOR */
|
|
"%s:%u: invalid operator at: %s\n",
|
|
/* PR_EXPECTED_EXPRESSION */
|
|
"%s:%u: expected expression at: %s\n",
|
|
/* PR_EXPECTED_END_OF_EXPRESSION */
|
|
"%s:%u: expected end of expression at: %s\n",
|
|
/* PR_EXPECTED_END_OF_STATEMENT */
|
|
"%s:%u: expected end of statement at: %s\n",
|
|
/* PR_CANNOT_USE_STR_AS_LITERAL */
|
|
"%s:%u: cannot use an interpolated string as an OMG literal at: %s\n",
|
|
/* PR_LITERAL_MUST_BE_UNIQUE */
|
|
"%s:%u: OMG literal must be unique at: %s\n",
|
|
/* PR_EXPECTED_LOOP_NAME */
|
|
"%s:%u: expected loop name at: %s\n",
|
|
/* PR_EXPECTED_EITHER_TOKEN */
|
|
"%s:%u: expected %s or %s at: %s\n",
|
|
/* PR_EXPECTED_UNARY_FUNCTION */
|
|
"%s:%u: expected unary function at: %s\n",
|
|
/* PR_EXPECTED_MATCHING_LOOP_NAME */
|
|
"%s:%u: expected matching loop name at: %s\n",
|
|
/* PR_EXPECTED_STATEMENT */
|
|
"%s:%u: expected statement at: %s\n",
|
|
|
|
/* IN_INVALID_IDENTIFIER_TYPE */
|
|
"%s:%u invalid identifier type at: %s\n",
|
|
/* IN_UNABLE_TO_STORE_VARIABLE */
|
|
"%s:%u unable to store variable: %s\n",
|
|
/* IN_VARIABLE_DOES_NOT_EXIST */
|
|
"%s:%u variable does not exist: %s\n",
|
|
/* IN_CANNOT_IMPLICITLY_CAST_NIL */
|
|
"Cannot implicitly cast nil\n",
|
|
/* IN_CANNOT_CAST_FUNCTION_TO_BOOLEAN */
|
|
"Cannot cast function to boolean value\n",
|
|
/* IN_CANNOT_CAST_ARRAY_TO_BOOLEAN */
|
|
"Cannot cast array to boolean value\n",
|
|
/* IN_UNKNOWN_VALUE_DURING_BOOLEAN_CAST */
|
|
"Unknown value type encountered during boolean cast\n",
|
|
/* IN_UNABLE_TO_CAST_VALUE */
|
|
"Unable to cast value\n",
|
|
/* IN_EXPECTED_INTEGER_VALUE */
|
|
"Expected integer value\n",
|
|
/* IN_CANNOT_CAST_FUNCTION_TO_INTEGER */
|
|
"Cannot cast function to integer value\n",
|
|
/* IN_CANNOT_CAST_ARRAY_TO_INTEGER */
|
|
"Cannot cast array to integer value\n",
|
|
/* IN_UNKNOWN_VALUE_DURING_INTEGER_CAST */
|
|
"Unknown value type encountered during integer cast\n",
|
|
/* IN_EXPECTED_DECIMAL */
|
|
"Expected floating point decimal value\n",
|
|
/* IN_CANNOT_CAST_FUNCTION_TO_DECIMAL */
|
|
"Cannot cast function to floating point decimal value\n",
|
|
/* IN_CANNOT_CAST_ARRAY_TO_DECIMAL */
|
|
"Cannot cast array to floating point decimal value\n",
|
|
/* IN_UNKNOWN_VALUE_DURING_DECIMAL_CAST */
|
|
"Unknown value type encountered during floating point decimal cast\n",
|
|
/* IN_CANNOT_CAST_BOOLEAN_TO_STRING */
|
|
"Cannot cast boolean to string value\n",
|
|
/* IN_EXPECTED_CLOSING_PAREN */
|
|
"Expected closing parenthesis after :(\n",
|
|
/* IN_INVALID_HEX_NUMBER */
|
|
"Please supply a valid hexadecimal number\n",
|
|
/* IN_CODE_POINT_MUST_BE_POSITIVE */
|
|
"Code point is supposed to be positive\n",
|
|
/* IN_EXPECTED_CLOSING_SQUARE_BRACKET */
|
|
"Expected closing square bracket after :[\n",
|
|
/* IN_EXPECTED_CLOSING_CURLY_BRACE */
|
|
"Expected closing curly brace after :{\n",
|
|
/* IN_VARIABLE_NOT_AN_ARRAY */
|
|
"%s:%u variable is not an array: %s\n",
|
|
/* IN_CANNOT_CAST_FUNCTION_TO_STRING */
|
|
"Cannot cast function to string value\n",
|
|
/* IN_CANNOT_CAST_ARRAY_TO_STRING */
|
|
"Cannot cast array to string value\n",
|
|
/* IN_UNKNOWN_VALUE_DURING_STRING_CAST */
|
|
"Unknown value type encountered during string cast\n",
|
|
/* IN_UNKNOWN_CAST_TYPE */
|
|
"Unknown cast type\n",
|
|
/* IN_UNDEFINED_FUNCTION */
|
|
"%s:%u: undefined function at: %s\n",
|
|
/* IN_INCORRECT_NUMBER_OF_ARGUMENTS */
|
|
"%s:%u: incorrect number of arguments supplied to: %s\n",
|
|
/* IN_INVALID_RETURN_TYPE */
|
|
"Invalid return type\n",
|
|
/* IN_UNKNOWN_CONSTANT_TYPE */
|
|
"Unknown constant type\n",
|
|
/* IN_DIVISION_BY_ZERO */
|
|
"Division by zero undefined\n",
|
|
/* IN_INVALID_OPERAND_TYPE */
|
|
"Invalid operand type\n",
|
|
/* IN_INVALID_BOOLEAN_OPERATION_TYPE */
|
|
"Invalid boolean operation type\n",
|
|
/* IN_INVALID_EQUALITY_OPERATION_TYPE */
|
|
"Invalid equality operation type\n",
|
|
/* IN_REDEFINITION_OF_VARIABLE */
|
|
"%s:%u: redefinition of existing variable at: %s\n",
|
|
/* IN_INVALID_DECLARATION_TYPE */
|
|
"Unknown declaration type\n",
|
|
/* IN_INVALID_TYPE */
|
|
"Invalid type\n",
|
|
/* IN_FUNCTION_NAME_USED_BY_VARIABLE */
|
|
"%s:%u: function name already used by existing variable at: %s\n",
|
|
/* IN_CANNOT_CAST_VALUE_TO_ARRAY */
|
|
"%s:%u: cannot cast value to array at: %s\n",
|
|
/* IN_UNABLE_TO_EXECUTE_COMMAND */
|
|
"Unable to execute command\n",
|
|
};
|
|
|
|
static const int err_codes[] = {
|
|
/* The 100 block is for the main body */
|
|
100, /* MN_ERROR_OPENING_FILE */
|
|
101, /* MN_ERROR_CLOSING_FILE */
|
|
|
|
/* The 200 block is for the lexer */
|
|
200, /* LX_LINE_CONTINUATION */
|
|
201, /* LX_MULTIPLE_LINE_COMMENT */
|
|
202, /* LX_EXPECTED_TOKEN_DELIMITER */
|
|
|
|
/* The 300 block is for the tokenizer */
|
|
300, /* TK_EXPECTED_FLOATING_POINT */
|
|
301, /* TK_EXPECTED_INTEGER */
|
|
302, /* TK_UNKNOWN_TOKEN */
|
|
|
|
/* The 400 block is for the parser */
|
|
400, /* PR_UNKNOWN_IDENTIFIER_TYPE */
|
|
401, /* PR_UNKNOWN_STATEMENT_TYPE */
|
|
402, /* PR_UNKNOWN_EXPRESSION_TYPE */
|
|
403, /* PR_EXPECTED_BOOLEAN */
|
|
404, /* PR_EXPECTED_INTEGER */
|
|
405, /* PR_EXPECTED_FLOAT */
|
|
406, /* PR_EXPECTED_STRING */
|
|
407, /* PR_EXPECTED_CONSTANT */
|
|
408, /* PR_EXPECTED_TYPE */
|
|
409, /* PR_EXPECTED_IDENTIFIER */
|
|
410, /* PR_EXPECTED_TOKEN */
|
|
411, /* PR_INVALID_OPERATOR */
|
|
412, /* PR_EXPECTED_EXPRESSION */
|
|
413, /* PR_EXPECTED_END_OF_EXPRESSION */
|
|
414, /* PR_EXPECTED_END_OF_STATEMENT */
|
|
415, /* PR_CANNOT_USE_STR_AS_LITERAL */
|
|
416, /* PR_LITERAL_MUST_BE_UNIQUE */
|
|
417, /* PR_EXPECTED_LOOP_NAME */
|
|
418, /* PR_EXPECTED_ONE_OF */
|
|
419, /* PR_EXPECTED_UNARY_FUNCTION */
|
|
420, /* PR_EXPECTED_MATCHING_LOOP_NAME */
|
|
421, /* PR_EXPECTED_STATEMENT */
|
|
|
|
/* The 500 block is for the interpreter */
|
|
500, /* IN_INVALID_IDENTIFIER_TYPE */
|
|
501, /* IN_UNABLE_TO_STORE_VARIABLE */
|
|
502, /* IN_VARIABLE_DOES_NOT_EXIST */
|
|
503, /* IN_CANNOT_IMPLICITLY_CAST_NIL */
|
|
504, /* IN_CANNOT_CAST_FUNCTION_TO_BOOLEAN */
|
|
505, /* IN_CANNOT_CAST_ARRAY_TO_BOOLEAN */
|
|
506, /* IN_UNKNOWN_VALUE_DURING_BOOLEAN_CAST */
|
|
507, /* IN_UNABLE_TO_CAST_VALUE */
|
|
508, /* IN_EXPECTED_INTEGER_VALUE */
|
|
509, /* IN_CANNOT_CAST_FUNCTION_TO_INTEGER */
|
|
510, /* IN_CANNOT_CAST_ARRAY_TO_INTEGER */
|
|
511, /* IN_UNKNOWN_VALUE_DURING_INTEGER_CAST */
|
|
512, /* IN_EXPECTED_DECIMAL */
|
|
513, /* IN_CANNOT_CAST_FUNCTION_TO_DECIMAL */
|
|
514, /* IN_CANNOT_CAST_ARRAY_TO_DECIMAL */
|
|
515, /* IN_UNKNOWN_VALUE_DURING_DECIMAL_CAST */
|
|
516, /* IN_CANNOT_CAST_BOOLEAN_TO_STRING */
|
|
517, /* IN_EXPECTED_CLOSING_PAREN */
|
|
518, /* IN_INVALID_HEX_NUMBER */
|
|
519, /* IN_CODE_POINT_MUST_BE_POSITIVE */
|
|
520, /* IN_EXPECTED_CLOSING_SQUARE_BRACKET */
|
|
521, /* IN_EXPECTED_CLOSING_CURLY_BRACE */
|
|
522, /* IN_VARIABLE_NOT_AN_ARRAY */
|
|
523, /* IN_CANNOT_CAST_FUNCTION_TO_STRING */
|
|
524, /* IN_CANNOT_CAST_ARRAY_TO_STRING */
|
|
525, /* IN_UNKNOWN_VALUE_DURING_STRING_CAST */
|
|
526, /* IN_UNKNOWN_CAST_TYPE */
|
|
527, /* IN_UNDEFINED_FUNCTION */
|
|
528, /* IN_INCORRECT_NUMBER_OF_ARGUMENTS */
|
|
529, /* IN_INVALID_RETURN_TYPE */
|
|
530, /* IN_UNKNOWN_CONSTANT_TYPE */
|
|
531, /* IN_DIVISION_BY_ZERO */
|
|
532, /* IN_INVALID_OPERAND_TYPE */
|
|
533, /* IN_INVALID_BOOLEAN_OPERATION_TYPE */
|
|
534, /* IN_INVALID_EQUALITY_OPERATION_TYPE */
|
|
535, /* IN_REDEFINITION_OF_VARIABLE */
|
|
536, /* IN_INVALID_DECLARATION_TYPE */
|
|
537, /* IN_INVALID_TYPE */
|
|
538, /* IN_FUNCTION_NAME_USED_BY_VARIABLE */
|
|
539, /* IN_CANNOT_CAST_VALUE_TO_ARRAY */
|
|
540, /* IN_UNABLE_TO_EXECUTE_COMMAND */
|
|
};
|
|
|
|
int error(ErrorType e, ...)
|
|
{
|
|
va_list args;
|
|
va_start(args, e);
|
|
vfprintf(stderr, err_msgs[e], args);
|
|
va_end(args);
|
|
|
|
return err_codes[e];
|
|
}
|