lci/error.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];
}