🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.os.linux.programacion
3 messages
3 total messages Started by nebris Sat, 09 Jul 2005 00:30
Intérprete usando Flex y Bison (o Lex y Yacc)
#1886
Author: nebris
Date: Sat, 09 Jul 2005 00:30
39 lines
2002 bytes
�Hola ecoleros!

Estoy construyendo un int�rprete utilizando para ello Flex y Bison. Al
int�rprete entre otras cosas se le pasan comandos por teclado, que pueden
tener varios argumentos (o incluso ninguno).

Tras definir las reglas de Flex correspondientes, en las que digo que
una CADENA es una sucesi�n de letras, etc, se me ocurri� que lo siguiente
podr�a valer para la parte de Bison:

        ...

        argumentos:     /* vacio */
                        | CADENA
                        | argumentos CADENA
                        ;

        comando:
                          CADENA argumentos     { /* Ejecutar comando */ }
                        ;
        ...

Con esto aparecen dos problemas, que no he sido capaz de resolver:

1 - El int�rprete no reconoce comandos sin argumentos, si se le introduce
uno, salta de l�nea pero no hace nada.

2 - �C�mo puedo acceder a cada uno de los argumentos? Necesitar�a poder
tomar cada uno por separado, para meterlos en un array o similar y pasarlos
a una funci�n.

Bueno, espero que alguien pueda darme alguna idea o indicarme alg�n ejemplo
en el que se haga algo parecido.

Saludos y muchas gracias

-- 

Pablo GR
Re: Int�rprete usando Flex y Bison (o Lex y Yacc)
#1887
Author: Dienekes
Date: Sat, 09 Jul 2005 05:11
112 lines
4969 bytes
"nebris" <gta_tequila_slammer@yahoo.com> escribi� en el mensaje 
news:dan5pj$99h127@cesio.mundo-r.com...
> �Hola ecoleros!
>
> Estoy construyendo un int�rprete utilizando para ello Flex y Bison. Al
> int�rprete entre otras cosas se le pasan comandos por teclado, que pueden
> tener varios argumentos (o incluso ninguno).
>
> Tras definir las reglas de Flex correspondientes, en las que digo que
> una CADENA es una sucesi�n de letras, etc, se me ocurri� que lo siguiente
> podr�a valer para la parte de Bison:
>
>        ...
>
>        argumentos:     /* vacio */
>                        | CADENA
>                        | argumentos CADENA
>                        ;
>
>        comando:
>                          CADENA argumentos     { /* Ejecutar comando */ }
>                        ;
>        ...
>
> Con esto aparecen dos problemas, que no he sido capaz de resolver:
>
> 1 - El int�rprete no reconoce comandos sin argumentos, si se le introduce
> uno, salta de l�nea pero no hace nada.
>
> 2 - �C�mo puedo acceder a cada uno de los argumentos? Necesitar�a poder
> tomar cada uno por separado, para meterlos en un array o similar y 
> pasarlos
> a una funci�n.
>
> Bueno, espero que alguien pueda darme alguna idea o indicarme alg�n 
> ejemplo
> en el que se haga algo parecido.
>
> Saludos y muchas gracias
>
> -- 
>
> Pablo GR

Hola, te recomenda�a que reescribieras la gram�tica as�:

command:    STRING optional_argument_list {*/ Acciones */}
                    ;

optional_argument_list:    /* empty */
                                      | argument_list { $$ = $1; }
                                      ;

argument_list:                 argument
                                      {
                                         printf("\nProcessing argument: 
%s\n", $1->name);
                                         $$ = insert_arg(arg_list, $1);
                                       }
                                       | argument_list ',' argument
                                      {
                                         printf("\nProcessing argument: 
%s\n", $3->name);
                                         $$ = insert_arg(arg_list, $3);
                                       }

Donde en $$ vas decolviendo el puntero que apunta al principio de la lista 
de
argumentos que has de definir (aqu� la llam� arg_list).

El token argument deber�a estar definido como:

%token <node> argument

Donde node saldr�a de:

%union {
  node_type *node;
}

node_type ser�a el tipo de los nodos de tu lista que deber�a estar definido
junto con todas las funciones que necesites de manejo de esa lista en un
fichero aparte, del que deber�as incluir la cabecera en el programa YACC:

#include "list_management.h"

Los tokens argument_list y optional_argument_list deber�an ser de este tipo
tambi�n en caso de quieras ir propagando el puntero que apunta al comienzo
de la lista por la pila del YACC en caso de que lo vayas a usar en el futuro 
o
vayas a extender la gram�tica con nuevas funcionalidades, etc... Si no es el
caso no es necesario devolver ese puntero que vendr�a retornado por la
funci�n insert_arg en los $$. Simplemente tratar�as ese puntero 
asign�ndoselo
a una variable que hayas definido en tu programa y que represente a la lista
de argumentos.

En este caso he supuesto que el tipo de los nodos de la lista tiene al menos
un campo char *name para poder ir mostr�ndolos por pantalla a medida
que tratas los argumentos por separado y haces cosas con ellos. 
Evidentemente
tendr� los campos que t� necesites.

Con esto deber�as poder hacer lo que necesitas, s�lo es cuesti�n de colocar
ese c�digo correctamente en las tres partes que se divide un programa YACC.

Suerte.

__________
Salu2,
   Dienekes.
Re: Intérprete usando Flex y Bison (o Lex y Yacc)
#1889
Author: nebris
Date: Sat, 09 Jul 2005 21:49
16 lines
1362 bytes
Hola de nuevo:

Muchas gracias por tu ayuda. Tras leer tu explicaci�n y entender m�s o menos
lo que hab�a que hacer, lo llev� a la pr�ctica y los resultados han sido
bastante buenos, aunque he tenido que hacer algunas modificaciones para
poder leer la entrada con readline.

Ahora s�lo queda ampliar un poco la gram�tica para a�adir el resto de
funcionalidades y corregir algunos fallos que, aparentemente est�n ligados
al analizador l�xico.

Un saludo

-- 

Pablo GR
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads