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 "parser_common.h"
20 #include "parseerror.h"
26 #include "memdebug_debugger.h"
28 size_t DLList_equation_print(DLList* l, FILE* fp) {
31 for (eq = DLList_begin(l); DLList_have_more(l); eq = DLList_next(l)) {
32 cant += Equation_print(eq, fp);
37 void DLList_equation_delete(DLList* l) {
39 while (!DLList_empty(l)) {
40 Equation_delete((Equation*)DLList_pop(l));
46 #define PARSE_ERROR(str) ParseError_set_pos_message(error, str, i + 1, c)
48 bool parser_equation(const char* line, size_t len, DLList* equation_list,
50 enum {SEARCH_VAR, VAR, SEARCH_EQUAL, EXP} state = SEARCH_VAR;
56 for (i = 0; i < len; i++) {
59 case SEARCH_VAR: /* Busca el comienzo de una variable. */
62 /* Es una letra => es el comienzo de la variable. */
65 } else { /* es otra cosa => error */
66 PARSE_ERROR("un espacio o una letra");
70 /* Si es espacio, no hace nada, deja que siga. */
72 case VAR: /* Se fija cual es el nombre de la variable. */
73 if (!is_alpha_num(c)) {
75 /* Es un espacio, entonces hay que buscar un igual. */
77 /* Calculo la longitud de la variable. */
78 var_len = i - var_start;
79 } else if (c == '=') {
80 /* Es igual, empieza la expresión. */
82 /* Calculo la longitud de la variable. */
83 var_len = i - var_start;
84 } else { /* es otra cosa */
86 "un espacio, una letra, un número o un igual");
90 /* Si es alfanumérico, no hace nada, deja que siga. */
92 case SEARCH_EQUAL: /* Busca un signo de igual. */
95 /* Es igual, empieza la expresión. */
97 } else { /* es otra cosa */
98 PARSE_ERROR("un espacio o un igual");
102 /* Si es espacio, no hace nada, deja que siga. */
104 case EXP: /* Encontró la expresión, la agrego a la lista. */
105 eq = Equation_new(line, var_start, var_len,
106 i, /* Comienzo de la ecuación */
107 len - i); /* Longitud de la ecuación (sin el "\n") */
108 /* No se pudo alocar la memoria. */
111 ParseError_set_message(error,
112 "No se pudo alocar la memoria para la ecuación");
115 /* Lo agrego a la lista y si no se agregó bien da error. */
116 if (!DLList_push(equation_list, eq)) {
118 ParseError_set_message(error,
119 "No se poner la ecuación en la lista");
120 /* Elimino la ecuación recién creada. */
124 /* Se terminó todo bien. */
128 /* Error, no se llego a parsear todo bien. */
132 ParseError_set_message(error,
133 "No se encontró la definición de una variable");
137 ParseError_set_message(error, "No se encontró un igual");
140 ParseError_set_message(error, "No se encontró una expresión");
146 #undef PARSE_ERROR /* Sólo queremos usarlo en este fragmento */