1 /* vim: set et sts=4 sw=4 fdm=indent fdl=1 fdn=0 fo+=t tw=80:
3 * Taller de Programación (75.42).
6 * Programa calculadora.
8 * Copyleft 2003 - Leandro Lucarella <llucare@fi.uba.ar>
9 * Puede copiar, modificar y distribuir este programa bajo los términos de
10 * la licencia GPL (http://www.gnu.org/).
12 * Creado: dom sep 14 13:03:49 ART 2003
19 #include "equation_list.h"
20 #include "parser_common.h"
21 #include "parseerror.h"
27 #include "memdebug_debugger.h"
29 #define PARSE_ERROR(str) ParseError_set_pos_message(error, str, i + 1, c)
31 bool parser_equation(const char* line, size_t len, DLList* equation_list,
33 enum {SEARCH_VAR, VAR, SEARCH_EQUAL, EXP} state = SEARCH_VAR;
39 for (i = 0; i < len; i++) {
42 case SEARCH_VAR: /* Busca el comienzo de una variable. */
45 /* Es una letra => es el comienzo de la variable. */
48 } else { /* es otra cosa => error */
49 PARSE_ERROR("un espacio o una letra");
53 /* Si es espacio, no hace nada, deja que siga. */
55 case VAR: /* Se fija cual es el nombre de la variable. */
56 if (!is_alpha_num(c)) {
58 /* Es un espacio, entonces hay que buscar un igual. */
60 /* Calculo la longitud de la variable. */
61 var_len = i - var_start;
62 } else if (c == '=') {
63 /* Es igual, empieza la expresión. */
65 /* Calculo la longitud de la variable. */
66 var_len = i - var_start;
67 } else { /* es otra cosa */
69 "un espacio, una letra, un número o un igual");
73 /* Si es alfanumérico, no hace nada, deja que siga. */
75 case SEARCH_EQUAL: /* Busca un signo de igual. */
78 /* Es igual, empieza la expresión. */
80 } else { /* es otra cosa */
81 PARSE_ERROR("un espacio o un igual");
85 /* Si es espacio, no hace nada, deja que siga. */
87 case EXP: /* Encontró la expresión, la agrego a la lista. */
88 eq = Equation_new(line, var_start, var_len,
89 i, /* Comienzo de la ecuación */
90 len - i); /* Longitud de la ecuación (sin el "\n") */
91 /* No se pudo alocar la memoria. */
94 ParseError_set_message(error,
95 "No se pudo alocar la memoria para la ecuación");
98 /* Lo agrego a la lista y si no se agregó bien da error. */
99 if (!DLList_push(equation_list, eq)) {
101 ParseError_set_message(error,
102 "No se poner la ecuación en la lista");
103 /* Elimino la ecuación recién creada. */
107 /* Se terminó todo bien. */
111 /* Error, no se llego a parsear todo bien. */
115 ParseError_set_message(error,
116 "No se encontró la definición de una variable");
120 ParseError_set_message(error, "No se encontró un igual");
123 ParseError_set_message(error, "No se encontró una expresión");
129 #undef PARSE_ERROR /* Sólo queremos usarlo en este fragmento */