[C con Clase] problemazo de diseño

Programante programante en gmail.com
Sab Dic 27 23:02:48 CET 2008


Núria Busom Figueres escribió:
> Hola a todos,
>
> estoy haciendo un programa que trabaja con gramáticas (automátas) y
> bueno... de momento todavía estoy programando el codigo para que el
> usuario me pueda entrar la gramática que quiera. Para los que no esten
> muy familiarizados con el tema se trata de una cosa así:
> G=({S, A, B,...}, {a, b, c,...}, P, S),  el tamaño del 1er y 2º campo
> los entra el usuario mediante int main(int argc, char* argv[])
>    (el 1er campo está formado por el alfabeto de no terminales
>    el 2º campo por el alfabeto de terminales
>    S es el simbolo inicial)
>    P es el conjunto de producciones, que empezando por cada uno de uno
> de los simbolos del 1er campo, sería del estilo:
>     S-> SA | A
>     A-> AaA | aa | B
>     B->...
>
> Para representar todo esto he creado la clase Gramatica:
>
> struct Produccion {
>     char* parteIzq;
>     char*** parteDcha; ???????
> };
>
> class Gramatica{
>         char* Sn;
>         char* St;
>         Produccion P;
>         char S;
> ...};
>
> por ejemplo en : A-> AaA | aa | B llamaré parteIzq a 'A' y parteDcha a
> 'AaA | aa | B'
> Y aquí viene mi problema:
> _*no se como representar la parteDcha !!!!!*_ Problemas que tengo:
> · 1º: no sé como de largo será
> · 2º: si lo represento como un vector, en cada una de las casillas
> puede haber más de un carácter
> Por ejemplo, si la gramatica fuera:
> G=({S, A, B}, {a, b}, P, S)
> S-> SA | A
> A-> AaA | aa | B
> B-> bb
> entonces el usuario tendria que llamar el programa mediante "gram 3 2"
> y mi programa ppal recogería num_prod=3 y num_elem=2, por lo que ya
> podría hacer Sn=new char[3] y St=new char[2];
> y en lo referente a P, tendría:
> parteIzq=new char[3]; y parteDcha=new char[3]; y a partir de aquí me
> pierdo:
>
> parteDcha estaría formada por {S, A, B}, pero cada uno de estos
> tendría que ser un vector de largada yo_que_sé y encima con esto no
> sería suficiente ya que como en una casilla no podría poner, por
> ejemplo, 'AaA', necesitaria que cada casilla apuntara a otro vector de
> largada desconocida....
>
> Bueno, y hasta aquí mi GRAN DILEMA, me he alargado mucho, ya lo sé
> pero quería que se entendiera bien mi duda. Finalmente, mis preguntas:
>
> - hay alguna forma mejor de representarlo??
> - existe char***?? (ya me imagino que no, pero algo similar...)
>
> Bueno, pues esto es todo
>
> Muchas gracias a todos!!!!

Sí, existe char*** que no es más que un puntero a char**, que es a su
vez un puntero a char*, o lo que es lo mismo, a un puntero a caracteres.
No obstante, hacerlo así es complicado y requiere pericia al trabajar
con tantos punteros.
Te aconsejo usar clases.
Podrías usar algo así:
map<string, vector<string> > Producciones;

Entonces representarías
S-> SA | A
A-> AaA | aa | B
como:
vector<string> ParteDerecha;
 ParteDerecha.push_back("SA");
 ParteDerecha.push_back("A");
Producciones["S"] = ParteDerecha;
 ParteDerecha.push_back("AaA");
 ParteDerecha.push_back("aa");
 ParteDerecha.push_back("B");
Producciones["A"] = ParteDerecha;

El problema que vas a tener es verificar si un texto pertenece o no a la
gramática, lo cual lleva a las técnicas de procesadores que están
seguramente más allá de lo que esperas.





Más información sobre la lista de distribución Cconclase