un solo error
ESTE PROGRAMILLA ME MARA UN SOLO ERROR NO SE SI ALGUIIEN PUED AYUDARME
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
struct node
{
int indice; // indice
char nombre[60]; // nombre de la variable o funcion
int tipo; // tipo de dato
int clase; // variable(0), funcion(1)
int npar; // numero de parametros.
int nfunc; // numero de funcion
struct node *sig;
};
int slinea = 0;
int edetectado = 0;
int ocurrio_en_linea = 0;
int contador = 0;
int indice=0;
int nfuncion = 0;
typedef struct node NODO;
typedef NODO *tipolista;
int _token, _token1;
char _ulexica[60], _ulexica2[60],nomfuncion[60];
tipolista lista = NULL;
FILE *archivo;
FILE *archivox;
void libera_lista( tipolista *lista_datos )
{
tipolista p;
while( *lista_datos != NULL )
{
p = *lista_datos;
*lista_datos = (*lista_datos)->sig;
free(p);
}
}
void eerror()
{
edetectado = 1;
if ( slinea == 0 ) slinea = 1;
ocurrio_en_linea = slinea;
}
int busca( char *nombre, int clase, int npar, int nfunc )
{
tipolista p = lista;
while( p != NULL )
{
if ( strcmp(nombre,p->nombre) == 0 && p->nfunc == nfunc && p->clase == clase && p->npar == npar && p->nfunc == nfunc ) return 1;
p = p->sig;
}
return 0;
}
int busca_si_esta_declarado( char *nombre, int nfunc )
{
tipolista p = lista;
while( p != NULL )
{
if ( strcmp(nombre,p->nombre) == 0 && p->nfunc == nfunc ) return 1;
p = p->sig;
}
return 0;
}
void insertar( tipolista *lista, char nombre[], int tipo, int clase, int npar, int nfunc )
{
if ( !edetectado )
{
if ( busca( nombre, clase, npar, nfunc ) == 1 )
{
eerror();
}
else
{
tipolista p;
p = (NODO*)malloc(sizeof(NODO));
p->indice = indice++;
strcpy(p->nombre,nombre);
p->tipo = tipo;
p->clase = clase;
p->npar = npar;
p->nfunc = nfunc;
p->sig = *lista;
*lista = p;
}
}
}
void actualiza_npar( tipolista lista, char nombre[], int npar )
{
if ( !edetectado )
{
tipolista p = lista;
while( p != NULL )
{
if ( strcmp(nombre,p->nombre) == 0 ) p->npar = npar;
p = p->sig;
}
}
}
void muestra()
{
tipolista p = lista;
FILE *archivo_salida;
archivo_salida = fopen("resultados.txt", "w+");
fprintf(archivo_salida,"indice t nombre t tipot clase t npar t nfuncn");
while( p != NULL )
{
fprintf(archivo_salida,"%dt%st%dt%dt%dt%dn",
p->indice,
p->nombre,
p->tipo,
p->clase,
p->npar,
p->nfunc);
p = p->sig;
}
}
void siguiente_unidad()
{
if ( !edetectado )
{
fscanf(archivo,"%d",&_token);
fscanf(archivo,"%s",_ulexica);
if ( _token == 500 )
{
slinea = slinea + 1;
siguiente_unidad();
}
}
}
void si_encuentra_tipo()
{
if ( !edetectado )
{
if ( _token == 110 || _token == 107 || _token == 102 )
{
_token1 = _token;
siguiente_unidad();
strcpy(_ulexica2,_ulexica);
siguiente_unidad();
switch( _token )
{
// entero nombre;
case 40 : insertar(&lista,_ulexica2,_token1,1,1,nfuncion); break;
// entero nombre1,nombre2...;
case 12: case 22: strcpy(_ulexica,_ulexica2);
insertar(&lista,_ulexica,_token1,1,1,nfuncion);
while( _token != 40 && !edetectado)
{
siguiente_unidad();
if ( _token == 3 )
insertar(&lista,_ulexica,_token1,1,1,nfuncion);
}
if ( _token == 3 )
insertar(&lista,_ulexica,_token1,1,1,nfuncion);
break;
// entero nombre( entero nombre1,.., nombre2)
case 10 : // El identificador se copia a ulexic
strcpy(_ulexica,_ulexica2);
insertar(&lista,_ulexica,_token1,0,1,++nfuncion);
strcpy(nomfuncion,_ulexica);
siguiente_unidad();
contador = 0;
// Mientras no encuentre un parentesis que cierra
while ( _token != 11 && !edetectado )
{
_token1 = _token; // _token1 -> tipo de dato
siguiente_unidad();
strcpy(_ulexica2,_ulexica); // _ulexica2 -> identificador
if ( _token != 11 && _token != 12 )
{
insertar(&lista,_ulexica2,_token1,1,1,nfuncion);
contador++;
}
if ( _token == 12 ) siguiente_unidad();
}
// Actualiza el numero de parametros
if ( !edetectado )
actualiza_npar(lista,nomfuncion,contador);
break;
}
}
}
}
void si_encuentra_identificador()
{
if ( !edetectado )
{
if ( _token == 3 )
{
strcpy(_ulexica2,_ulexica);
siguiente_unidad();
if ( _token == 10 )
{
/* Es una funcion */
}
else
{
if ( busca_si_esta_declarado(_ulexica2,nfuncion) == 0 )
{
ocurrio_en_linea = slinea;
eerror();
}
}
}
}
}
int semantico( char *narchivo )
{
slinea = 0;
edetectado = 0;
ocurrio_en_linea = 0;
contador = 0;
indice=0;
nfuncion = 0;
archivo = fopen(narchivo, "rt");
// archivox = fopen("resultados.txt", "w+");
do
{
if ( !edetectado )
{
si_encuentra_tipo();
si_encuentra_identificador();
siguiente_unidad();
}
}while( _token != 400 && !edetectado);
muestra();
libera_lista(&lista);
if ( edetectado == 1 ) return ocurrio_en_linea;
return 0;
}
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
struct node
{
int indice; // indice
char nombre[60]; // nombre de la variable o funcion
int tipo; // tipo de dato
int clase; // variable(0), funcion(1)
int npar; // numero de parametros.
int nfunc; // numero de funcion
struct node *sig;
};
int slinea = 0;
int edetectado = 0;
int ocurrio_en_linea = 0;
int contador = 0;
int indice=0;
int nfuncion = 0;
typedef struct node NODO;
typedef NODO *tipolista;
int _token, _token1;
char _ulexica[60], _ulexica2[60],nomfuncion[60];
tipolista lista = NULL;
FILE *archivo;
FILE *archivox;
void libera_lista( tipolista *lista_datos )
{
tipolista p;
while( *lista_datos != NULL )
{
p = *lista_datos;
*lista_datos = (*lista_datos)->sig;
free(p);
}
}
void eerror()
{
edetectado = 1;
if ( slinea == 0 ) slinea = 1;
ocurrio_en_linea = slinea;
}
int busca( char *nombre, int clase, int npar, int nfunc )
{
tipolista p = lista;
while( p != NULL )
{
if ( strcmp(nombre,p->nombre) == 0 && p->nfunc == nfunc && p->clase == clase && p->npar == npar && p->nfunc == nfunc ) return 1;
p = p->sig;
}
return 0;
}
int busca_si_esta_declarado( char *nombre, int nfunc )
{
tipolista p = lista;
while( p != NULL )
{
if ( strcmp(nombre,p->nombre) == 0 && p->nfunc == nfunc ) return 1;
p = p->sig;
}
return 0;
}
void insertar( tipolista *lista, char nombre[], int tipo, int clase, int npar, int nfunc )
{
if ( !edetectado )
{
if ( busca( nombre, clase, npar, nfunc ) == 1 )
{
eerror();
}
else
{
tipolista p;
p = (NODO*)malloc(sizeof(NODO));
p->indice = indice++;
strcpy(p->nombre,nombre);
p->tipo = tipo;
p->clase = clase;
p->npar = npar;
p->nfunc = nfunc;
p->sig = *lista;
*lista = p;
}
}
}
void actualiza_npar( tipolista lista, char nombre[], int npar )
{
if ( !edetectado )
{
tipolista p = lista;
while( p != NULL )
{
if ( strcmp(nombre,p->nombre) == 0 ) p->npar = npar;
p = p->sig;
}
}
}
void muestra()
{
tipolista p = lista;
FILE *archivo_salida;
archivo_salida = fopen("resultados.txt", "w+");
fprintf(archivo_salida,"indice t nombre t tipot clase t npar t nfuncn");
while( p != NULL )
{
fprintf(archivo_salida,"%dt%st%dt%dt%dt%dn",
p->indice,
p->nombre,
p->tipo,
p->clase,
p->npar,
p->nfunc);
p = p->sig;
}
}
void siguiente_unidad()
{
if ( !edetectado )
{
fscanf(archivo,"%d",&_token);
fscanf(archivo,"%s",_ulexica);
if ( _token == 500 )
{
slinea = slinea + 1;
siguiente_unidad();
}
}
}
void si_encuentra_tipo()
{
if ( !edetectado )
{
if ( _token == 110 || _token == 107 || _token == 102 )
{
_token1 = _token;
siguiente_unidad();
strcpy(_ulexica2,_ulexica);
siguiente_unidad();
switch( _token )
{
// entero nombre;
case 40 : insertar(&lista,_ulexica2,_token1,1,1,nfuncion); break;
// entero nombre1,nombre2...;
case 12: case 22: strcpy(_ulexica,_ulexica2);
insertar(&lista,_ulexica,_token1,1,1,nfuncion);
while( _token != 40 && !edetectado)
{
siguiente_unidad();
if ( _token == 3 )
insertar(&lista,_ulexica,_token1,1,1,nfuncion);
}
if ( _token == 3 )
insertar(&lista,_ulexica,_token1,1,1,nfuncion);
break;
// entero nombre( entero nombre1,.., nombre2)
case 10 : // El identificador se copia a ulexic
strcpy(_ulexica,_ulexica2);
insertar(&lista,_ulexica,_token1,0,1,++nfuncion);
strcpy(nomfuncion,_ulexica);
siguiente_unidad();
contador = 0;
// Mientras no encuentre un parentesis que cierra
while ( _token != 11 && !edetectado )
{
_token1 = _token; // _token1 -> tipo de dato
siguiente_unidad();
strcpy(_ulexica2,_ulexica); // _ulexica2 -> identificador
if ( _token != 11 && _token != 12 )
{
insertar(&lista,_ulexica2,_token1,1,1,nfuncion);
contador++;
}
if ( _token == 12 ) siguiente_unidad();
}
// Actualiza el numero de parametros
if ( !edetectado )
actualiza_npar(lista,nomfuncion,contador);
break;
}
}
}
}
void si_encuentra_identificador()
{
if ( !edetectado )
{
if ( _token == 3 )
{
strcpy(_ulexica2,_ulexica);
siguiente_unidad();
if ( _token == 10 )
{
/* Es una funcion */
}
else
{
if ( busca_si_esta_declarado(_ulexica2,nfuncion) == 0 )
{
ocurrio_en_linea = slinea;
eerror();
}
}
}
}
}
int semantico( char *narchivo )
{
slinea = 0;
edetectado = 0;
ocurrio_en_linea = 0;
contador = 0;
indice=0;
nfuncion = 0;
archivo = fopen(narchivo, "rt");
// archivox = fopen("resultados.txt", "w+");
do
{
if ( !edetectado )
{
si_encuentra_tipo();
si_encuentra_identificador();
siguiente_unidad();
}
}while( _token != 400 && !edetectado);
muestra();
libera_lista(&lista);
if ( edetectado == 1 ) return ocurrio_en_linea;
return 0;
}
Undefined symbol _main in module c0.ASM
Marca ese error... bueno estaba checando el codigo y veo que no tiene la funcion main... como sabrás un programa en c lo unico que ejecuta es la funcion main y de ahi que puedes hacer llamadas a otras funciones. Si no tienes la funcion main() tu programa nunca se va a ejecutar.
Ahora si lo que qiueres es usarlo como biblioteca, pues usalo, y de otro archivo manda a llamar las funciones, y asi te das cuenta si funcionan o no, pero como te dije, si no tiene la funcion main()... no lo quieras ejecutar.
Marca ese error... bueno estaba checando el codigo y veo que no tiene la funcion main... como sabrás un programa en c lo unico que ejecuta es la funcion main y de ahi que puedes hacer llamadas a otras funciones. Si no tienes la funcion main() tu programa nunca se va a ejecutar.
Ahora si lo que qiueres es usarlo como biblioteca, pues usalo, y de otro archivo manda a llamar las funciones, y asi te das cuenta si funcionan o no, pero como te dije, si no tiene la funcion main()... no lo quieras ejecutar.
