EVAL_EXPRESSION *exp = expression_parse(argv[1], &failed_at, &error);
if(!exp)
- printf("\nFAILED\nExpression: '%s'\nParsing stopped at: '%s'\nError code: %d (%s)\n", argv[1], (failed_at)?failed_at:"<NONE>", error, expression_strerror(error));
+ printf("\nFAILED\nExpression: '%s'\nParsing stopped at: '%s'\nError code: %d (%s)\n", argv[1], (failed_at)?((*failed_at)?failed_at:"<END OF EXPRESSION>"):"<NONE>", error, expression_strerror(error));
else {
printf("\nOK\nExpression: '%s'\nParsed as : '%s'\nError code: %d (%s)\n", argv[1], exp->parsed_as, error, expression_strerror(error));
op1->operator = EVAL_OPERATOR_VALUE;
eval_node_set_value_to_constant(op1, 0, number);
}
- else if(*string)
+ else if(**string)
*error = EVAL_ERROR_UNKNOWN_OPERAND;
else
*error = EVAL_ERROR_MISSING_OPERAND;
return parse_rest_of_expression(string, error, op);
}
- else if(**string == EVAL_OPERATOR_EXPRESSION_CLOSE) {
+ else if(**string == ')') {
;
}
else if(**string) {
s = string;
EVAL_NODE *op = parse_full_expression(&s, &err);
+ if(*s) {
+ if(op) {
+ eval_node_free(op);
+ op = NULL;
+ }
+ err = EVAL_ERROR_REMAINING_GARBAGE;
+ }
+
if (failed_at) *failed_at = s;
if (error) *error = err;
case EVAL_ERROR_MISSING_OPERATOR:
return "expected operator";
+ case EVAL_ERROR_REMAINING_GARBAGE:
+ return "remaining characters after expression";
+
case EVAL_ERROR_INVALID_VALUE:
return "invalid value structure - internal error";
#define EVAL_ERROR_UNKNOWN_OPERAND 2
#define EVAL_ERROR_MISSING_OPERAND 3
#define EVAL_ERROR_MISSING_OPERATOR 4
+#define EVAL_ERROR_REMAINING_GARBAGE 5
// evaluation errors
-#define EVAL_ERROR_INVALID_VALUE 5
-#define EVAL_ERROR_INVALID_NUMBER_OF_OPERANDS 6
-#define EVAL_ERROR_VALUE_IS_NAN 7
-#define EVAL_ERROR_VALUE_IS_INFINITE 8
-#define EVAL_ERROR_UNKNOWN_VARIABLE 9
+#define EVAL_ERROR_INVALID_VALUE 11
+#define EVAL_ERROR_INVALID_NUMBER_OF_OPERANDS 12
+#define EVAL_ERROR_VALUE_IS_NAN 13
+#define EVAL_ERROR_VALUE_IS_INFINITE 14
+#define EVAL_ERROR_UNKNOWN_VARIABLE 15
// parse the given string as an expression and return:
// a pointer to an expression if it parsed OK