Article View: es.comp.os.linux.programacion
Article #1887Re: Int�rprete usando Flex y Bison (o Lex y Yacc)
From: Dienekes
Date: Sat, 09 Jul 2005 05:11
Date: Sat, 09 Jul 2005 05:11
112 lines
4969 bytes
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.
Technical Details
Message-ID:
<d0Jze.2006671$I96.2602083@telenews.teleline.es>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!news2.google.com!fu-berlin.de!nsnmpen1-lo.nuria.telefonica-data.net!telenews.teleline.es!not-for-mailReferences:
<dan5pj$99h127@cesio.mundo-r.com>Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,d872613fa5db76a5 X-Google-Attributes: gidf86c8,public X-Google-Language: SPANISH,ASCII Path: arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!news2.google.com!fu-berlin.de!nsnmpen1-lo.nuria.telefonica-data.net!telenews.teleline.es!not-for-mail X-Trace-PostClient-IP: 217.125.1.78 From: "Dienekes" <jf.mailbox@gmail.com> Newsgroups: es.comp.os.linux.programacion References: <dan5pj$99h127@cesio.mundo-r.com> Subject: Re: Int�rprete usando Flex y Bison (o Lex y Yacc) Lines: 115 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.2180 X-RFC2646: Format=Flowed; Original X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 Message-ID: <d0Jze.2006671$I96.2602083@telenews.teleline.es> Date: Sat, 09 Jul 2005 05:11:37 GMT NNTP-Posting-Host: 10.20.31.4 X-Complaints-To: usenet@teleline.es X-Trace: telenews.teleline.es 1120885897 10.20.31.4 (Sat, 09 Jul 2005 07:11:37 MET DST) NNTP-Posting-Date: Sat, 09 Jul 2005 07:11:37 MET DST Organization: Terra Networks