<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body text="#000000" bgcolor="#ffffff">
Hola a todo el mundo,<br>
<br>
Tengo que hacer un traductor de pseudocodigo (inventado por mi) a
lenguaje C para un trabajo de la facultad. Tengo terminado el Lexer y
la gramatica del Parser (Yacc) con la mayoría de las funciones que se
utilizarán para traducir el pseudocódigo a C. El problema es que quiero
crear una lista enlazada donde se almacenen todas las variables
declaradas y su tipo (entero, real o cadena de caracteres), pero al
insertar los elementos en la lista desde la regla de Yacc, sólo inserta
una variable y el resto se pierden. Creo que puede deberse a la forma
que tiene Yacc de evaluar las reglas para encontrar los "tokens" y a
las recursiones que utiliza que hace que el puntero que apunta al
comienzo de la lista se pierda.<br>
<br>
Necesito ayuda urgente. He trabajado bastante el pseudocodigo, el lex y
el yacc, pero no consigo avanzar y tengo que entregar la práctica
cuanto antes. Agradecería mucho cualquier tipo de ayuda que pudiesen
darme.<br>
<br>
Para cualquiera que lo necesite, puedo enviar el pseudocódigo, aunque
es bastante largo y engorroso, por lo que no me atrevo a ponerlo
todavía por aquí.<br>
<br>
Aquí les explico un poco cual es el problema que tengo:<br>
<br>
- Para definir las variables que se utilizarán en el algoritmo existe
una clausula "clausula_variables" que aparecerá de la siguiente forma:<br>
<br>
<small>ALGORITMO IDENTIFICADOR<br>
clausula_variables<br>
INICIO<br>
lista_instrucciones<br>
FINALGORITMO</small><br>
<br>
Donde <small>ALGORITMO</small>, <small>IDENTIFICADOR</small>, <small>INICIO</small>
y <small>FINALGORITMO</small> son símbolos Terminales de la gramática
("tokens" reconocidos por Lex).<br>
El símbolo no terminal "<small>clausula_variables</small>" se define
como:<br>
<br>
<small>clausula_variables:    /* No hace nada*/    {<br>
                                                                     $$
= (char*) malloc((strlen("/* No hay variables declaradas
*/\n")+1)*sizeof(char));<br>
                                                                    
sprintf($$, "/* No hay variables declaradas */\n");<br>
                                                                    }<br>
                             |    VARIABLES<br>
                                  lista_declaracion<br>
                                  FINVARIABLES        {<br>
                                                                     $$
= (char*) malloc((strlen($2)+1)*sizeof(char));<br>
                                                                    
sprintf($$, "%s", $2);<br>
                                                                    }<br>
                            ;</small><br>
<br>
Por otro lado "<small>lista_declaracion</small>" se define como:<br>
<br>
<small>lista_declaracion:    /* No hace nada */             {<br>
                                                                    
        $$ = (char*) malloc((strlen(" ")+1)*sizeof(char));<br>
                                                                    
        sprintf($$, " ");<br>
                                                                       
   }<br>
<br>
                        |        tipo_dato IDENTIFICADOR    ';'        {<br>
                                                                      
                      /* Insertar la nueva variable en la lista de
identificadores */<br>
                                                                    
                        printf("\nDeclaracion de variable: '%s%s'\n",
$1, $2);<br>
                                                                    
                        if(buscarId($2, listaIds) == NOT_DEFINED)<br>
                                                                    
                            {    insertarId($2,
definirTipoVariable($1), &listaIds); printf("\nVariable
insertada\n"); }<br>
                                                                    
                        else<br>
                                                                       
                         printf("\nVariable no insertada\n");<br>
                                                                       
                    }<br>
                                lista_declaracion                   
            {<br>
                                                                    
                        printf("\nEntrando a 'lista_declaracion':'2'");<br>
                                                                    
                        $$ = (char*)
malloc((strlen($1)+strlen($2)+strlen($5)+strlen("\n;")+1)*sizeof(char));<br>
                                                                    
                        sprintf($$, "%s%s;\n%s", $1, $2, $5);       
        <br>
                                                                       
                    }<br>
                        |       lista_declaracion COMENTARIO       {<br>
                                                                    
                        $$ = (char*)
malloc((strlen("/**/\n")+strlen($1)+strlen($2)+1)*sizeof(char));<br>
                                                                    
                        sprintf($$, "%s\n/*%s*/", $1+2, $2);<br>
                                                                       
                    }<br>
                        ;</small><br>
<br>
Como se puede observar, se llama a varias funciones "<small>buscarId</small>",
"<small>definirTipoVariables</small>", "<small>buscarIds</small>", etc.
que hacen uso de una lista enlazada "<small>listaIds</small>" que está
declarada como una variable global en la zona de declaraciones de Yacc
entre los símbolos "<small>%{</small>" y "<small>%}</small>". La
estructura de la lista esta definida en un archivo de cabecera
"symbol.h" que está incluido en el fichero del Yacc.<br>
<br>
Muchas gracias por todo. Y un saludo.<br>
<pre class="moz-signature" cols="72">-- 
------------------------------------------------
Rafael Enríquez Herrador - <a class="moz-txt-link-abbreviated" href="mailto:rafenher07@gmail.com">rafenher07@gmail.com</a>
------------------------------------------------</pre>
</body>
</html>