+ /* Calcula la expresión del segundo operando. */
+ if (!parser_expression(exp + i + 1, len - i - 1, &result2,
+ var_list, error)) {
+ /* Si hay error, devuelve FALSE (y "arrastra" el error. */
+ return FALSE;
+ }
+ *result = (c == '+') ? (result1 + result2) : (result1 - result2);
+ return TRUE;
+ }
+ }
+ /* No hay tampoco operadores de alta precendencia, busco operadores de baja
+ * precedencia. */
+ for (i = 0; i < len; i++) {
+ c = exp[i];
+ /* Manejo los niveles de paréntesis. */
+ if ((c == '(')) {
+ level++;
+ } else if (c == ')') {
+ level--;
+ /* Está en el nivel básico y hay un operador. */
+ } else if (((c == '*') || (c == '/')) && !level) {
+ /* No hay segundo operando. */
+ if (i == len - 1) {
+ ParseError_set_message(error, "Falta segundo operando");
+ return FALSE;
+ }
+ /* Calcula la expresión del primer operando. */
+ if (!parser_expression(exp, i, &result1, var_list, error)) {
+ /* Si hay error, devuelve FALSE (y "arrastra" el error. */
+ return FALSE;
+ }
+ /* Calcula la expresión del segundo operando. */
+ if (!parser_expression(exp + i + 1, len - i - 1, &result2,
+ var_list, error)) {
+ /* Si hay error, devuelve FALSE (y "arrastra" el error. */
+ return FALSE;
+ }
+ /* Si estamos dividiendo, chequeamos que el divisor no sea cero. */
+ if (c == '/') {
+ /* Segundo operando es cero. */
+ if (result2 == 0.0) {
+ ParseError_set_message(error, "División por cero");
+ return FALSE;
+ }
+ *result = result1 / result2;
+ /* Si estamos multiplicando, no hay chequeos extra. */
+ } else {
+ *result = result1 * result2;
+ }
+ return TRUE;