🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #1887

Re: Int�rprete usando Flex y Bison (o Lex y Yacc)

#1887
From: 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.
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-mail
References: <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