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 "parseerror.h"
25 bool is_space(char c) {
26 return (c == ' ') || (c == '\t');
29 bool is_number(char c) {
30 return ('0' < c) && (c < '9');
33 bool is_alpha(char c) {
34 return (c == '_') || (('a' < c) && (c < 'z')) || (('A' < c) && (c < 'Z'));
37 bool is_alpha_num(c) {
38 return is_number(c) || is_alpha(c);
41 #define PARSE_ERROR(str) ParseError_set_pos_message(error, str, i, c)
43 bool parser_equation(const char* line, size_t len, DLList* equation_list,
45 enum {SEARCH_VAR, VAR, SEARCH_EQUAL, EXP} state = SEARCH_VAR;
51 for (i = 0; i < len; i++) {
53 case SEARCH_VAR: /* Busca el comienzo de una variable. */
56 /* Es una letra => es el comienzo de la variable. */
59 } else { /* es otra cosa => error */
60 PARSE_ERROR("un espacio o una letra");
64 /* Si es espacio, no hace nada, deja que siga. */
66 case VAR: /* Se fija cual es el nombre de la variable. */
67 if (!is_alpha_num(c)) {
69 /* Es un espacio, entonces hay que buscar un igual. */
71 /* Calculo la longitud de la variable. */
72 var_len = i - var_start;
73 } else if (c == '=') {
74 /* Es igual, empieza la expresión. */
76 } else { /* es otra cosa */
78 "un espacio, una letra, un número o un igual");
82 /* Si es alfanumérico, no hace nada, deja que siga. */
84 case SEARCH_EQUAL: /* Busca un signo de igual. */
87 /* Es igual, empieza la expresión. */
89 } else { /* es otra cosa */
90 PARSE_ERROR("un espacio o un igual");
94 /* Si es espacio, no hace nada, deja que siga. */
96 case EXP: /* Encontró la expresión, la agrego a la lista. */
97 eq = Equation_new(line, var_start, var_len,
98 i, /* Comienzo de la ecuación */
99 len - i); /* Longitud de la ecuación (sin el "\n") */
100 /* No se pudo alocar la memoria. */
103 ParseError_set_message(error,
104 "No se pudo alocar la memoria para la ecuación");
107 /* Lo agrego a la lista y si no se agregó bien da error. */
108 if (!DLList_push(equation_list, eq)) {
110 ParseError_set_message(error,
111 "No se poner la ecuación en la lista");
112 /* Elimino la ecuación recién creada. */
116 /* Se terminó todo bien. */
120 /* Error, no se llego a parsear todo bien. */
124 ParseError_set_message(error,
125 "No se encontró la definición de una variable");
129 ParseError_set_message(error, "No se encontró un igual");
132 ParseError_set_message(error, "No se encontró una expresión");
138 #undef PARSE_ERROR /* Sólo queremos usarlo en este fragmento */