[C con Clase] Crear un compilador

Programante programante en gmail.com
Dom Mar 20 17:31:25 CET 2011


El 15/03/11 07:07, Abel escribió:
> Hola a todos,
> despues de mucho tiempo vuelvo a entrar al foro, talvez me puedan ayudar con el siguiente problema.
> Quiero escribir un programa, el que me mostrará un espacio vacío para llenar un texto. En este espacio vacío, el usuario podra escribir código C (solo un comando por línea), despues lo podrá hacer correr y obtendrá los mismos resulatdos que obtendría haciendolo correr por ejemplo con el Dev C++.
> Un ejemplo:
> int a;
> int b;
>
> a=suma(2,5);
> b=resta(3,1);
>
> a=(2*b)-a;
> return(a);
>
> Las funciones suma() y resta() ya estarían declaradas en mi programa principal, asi que no necesitaría volverlas a declarar. 
> Mi idea es: 
> Empezaría a leer línea por línea el texto, cada línea lo almaceno en un "string" y a travez de un switch(string)lo busco y si lo encuentra ejecuto ese comando; por ejemplo la primera línea:
> string="int a" (sin el punto y coma)
> switch(string)        // aqui empieza mi problema, switch no acepta cadenas
>        case "int a"   : int a; break;
>        case "float a" : float a; break;
>        case "char a"  : char a; break;
>        case etc.....
> el mayor problema lo tengo en la quinta línea: a=(2*b)-a; cómo hago de una manera sencilla que me realice esta operación?
> Por toda idea que me puedan dar, les agradecería.
> Saludos.
> Abel.
Esto no hace lo que quieres. Tendrías que tener una estructura donde
almacenar las variables del subprograma, luego interpretar cada comando
y cambiar las variables según haga falta, tener en cuenta la prioridad
de operadores... Programar un intérprete (o un compilador) es una tarea
compleja, no aconsejo ir por esa ruta.

Lo que puedes hacer es hacer como Dev-C++, que en realidad no te compila
los programas, sino que llama a gcc para que realice él la compilación.

Cuando tienes introducido el texto del programa, lo guardarías en un
fichero, por ejemplo programa.c. Puedes incluir antes del código que
introdujo el usuario includes, las funciones suma y resta, etc. (si sólo
quieres añadir funciones, otra opción es añadirlas como una librería, lo
que sería más rápido).
Luego haces:
if ( system( "gcc programa.c -o programa.exe") == 0 ) {
  // Compiló correctamente
 char buffer[1024];
 FILE* resultado = popen("programa.exe", "r");
 fgets(buffer, sizeof(buffer), resultado);
 pclose(resultado);
 printf("El resultado es %s", buffer);
} else {
 // gcc habrá escrito mensajes de error arriba
 puts("No se pudo compiilar");
}





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