Skip to content
JulioVargasRoa edited this page Nov 29, 2012 · 17 revisions

Bienvenido al Wiki del proyecto 'Errores'

El objetivo del proyecto es crear un programa que corrija los errores presentes en un archivo escrito en lenguaje C.

Aquí puedes publicar dudas e información sobre este proyecto.

Por Guillermo Silva

Considero que esta bien que empiecen a investigar, pero en mi opinión, si van a hablar de algún tema en especifico seria mejor crear una pagina nueva para dicho tema, además de incluir bibliografía para ahorrar tiempo a los compañeros que quieran agregar mas acerca de este, no sé que opinen.

Por Laura Hernandez

Hola chicos, para los errores en lenguaje c pude encontrar que algunos elementos puede provocar resultados impredecibles, por ejemplo: *Uso de una variable automática que no se ha inicializado *Omitiendo un cierre de delimitador de comentarios *Uso de un índice de matriz mayor que la longitud de la matriz (en C, los índices de matriz ejecutar entre cero y -1.) *Omitiendo un punto y coma o una llave de cierre *Utilizando un puntero sin inicializar *Uso de una barra diagonal cuando hace falta una barra diagonal inversa (por ejemplo, sustituyendo "/ n" para "\n".) *Usando "=" en una comparación que se desee "==" *Sobrescribir el terminador nulo para una cadena *Terminar antes de tiempo una declaración de función con un punto y coma (a menudo, el compilador indicadores el bloque "huérfanas" de código como un error de sintaxis.) *Especificar los valores de variables en una instrucción scanf() en lugar de sus direcciones *No se puede declarar el tipo de valor devuelto para una función *Suponiendo que una orden de evaluación de expresión cuando se utiliza una expresión con efectos secundarios (por ejemplo, [i] = i ++; es ambiguo y peligroso.) *Omitiendo un "salto" desde un caso en una instrucción switch (ejecución de "caídas a través de" a los siguientes casos.) *Uso de "un rodaje" para salir de un bloque de código asociado a un si instrucción (la instrucción break sale de un bloque de código asociado a una para modificador o while (instrucción).)

Estos son algunos de lo errores más comunes que se pueden cometer, podríamos poner estos errores como expresiones regulares y llamarlos en un main.c el cual leerá un archivo que tenga este lenguaje, bueno es así como yo le entendí, no se que opinan ustedes.

editado:Nayeli Hernandez Hola bueno estuve igual investigando y yo encontre que existen 3 categorias en las cuales se caracterizan los errores que son los siguientes:

De sintaxis (sintácticos).
De ejecución.
De lógica (lógicos).

¿Qué es un error de sitanxis en C? Los errores de sintaxis son los más fáciles de detectar en el código fuente de un programa. Un error de sintaxis se produce al escribir, incorrectamente, alguna parte del código. ejemplo:

Se ha escrito include en vez de #include.
Se ha escrito imt en vez de int.
Falta un punto y coma (;) después de la llamada a printf.
Se ha escrito retunr en vez de return.

¿Qué es un error de ejecución en C? Una vez corregidos los errores de sintaxis en el código fuente de un programa, se debe revisar que no se puede producir ningún error en la ejecución del mismo. Un error de ejecución se produce cuando el ordenador no puede ejecutar alguna instrucción de forma correcta.

Ejemplo: #include <stdio.h>

int main() { int a; float b;

a = 0; b = 6.4 / a;

printf( "%f", b );

return 0; } se produce un error de ejecución, ya que, al intentar evaluar la expresión:

6.4 / a

a vale 0, y no se puede dividir entre cero.

Errores de Lógica en Lenguaje C ¿Qué es un error de lógica en un programa escrito en C? Los errores de lógica son los más difíciles de detectar. Cuando un programa no tiene errores de sintaxis ni de ejecución, pero, aún así, no funciona bien, esto es debido a la existencia de algún error lógico. De manera que, un error de lógica se produce cuando los resultados obtenidos no son los esperados.

Francisco Juarez: Laura tiene razon en muchas de las equivocaciones de C, pero tambien uno de los mas grandes y que mas se sufren en estructuras de datos, es el uso de apuntadores dobles, triples y la direccion cuando se debe de usar &? y cuando no.

Julio Vargas********

Traduce la especificacion de una gramatica de contexto libre a un programa en C que implementa un analizador LALR(1) para esa gram´atica. Permite asociar c´odigo C (acciones sem´anticas) a las reglas de la gram´atica • se ejecutar´a cada vez que se aplique la regla correspondiente Esquema de funcionamiento: fichero.y ---> BISON ---> fichero.tab.c fichero.tab.c + (ficheros .c) ---> GCC ---> ejecutable | |-- main() |-- yyerror() |-- yylex()

Compilacion:

bison fichero.y Compila la especificacion de la gramatica y crea el fichero fichero.tab.c con el codigo y las tablas del analizador LALR(1) $ gcc fichero.tab.c (ficheros .c) El usuario debe proporcinar las funciones main(), yyerror() y yylex() . El c´odigo de usuario deber´a llamar a la funci´on yyparse(), desde la cual se llamar´a a la funci´on yylex() del analizador l´exico cada vez que necesite un token. Opciones: bison -d genera "fichero.tab.h" con las definiciones de las constantes asociadas a los tokens, adem´as de variables y estrucutras de datos necesarias para el analizador l´exico. bison -v genera "fichero.output" con un resumen legible del aut´omata LALR(1) y se˜nala los conflictos y/o errores presentes en la gram´atica de entrada – FJRP 2007 ccia PL – 12. Funcionamiento del analizador El fichero "XXXX.tab.c" contine las tablas del analizador y la funci´on int yyparse(void) • yyparse() simula el analizador LALR(1) • devolver´a 0 si el an´alisis tubo ´exito y 1 si el an´alisis fallo • deber´a de ser llamada desde el c´odigo del usuario Cada vez que yyparse() necesite un nuevo token, llamar´a a la funci´on int yylex() • yylex() devuelve un n o entero que identifica al siguiente token • esas constantes enteras aparecen en el fichero "XXXX.tab.h" • yylex() devolver´a el token eof (end of file) cuando alcance el final del fichero

Para comunicar los atributos de los tokens se usa la variable global yylval

• es de tipo yystype y est´a declarada en "XXXX.tab.h" • yylex() escribe en yylval los valores que despu´es usar´a yyparse() La funci´on yyparse() realiza un an´alisis ascendente salto-reducci´on • agrupa tokens y no terminales seg´un a las reglas de la gram´atica • utiliza una pila donde acumula s´ımbolos • cuando en la cima de la pila se localiza el lado derecho de una regla, se eliminar´an de la pila y se meter´a en ella el no terminal del lado derecho de la regla. (REDUCCION)

Por regla general el c´odigo asociado a una regla (acciones sem´anticas) se ejecutar´a en el momento en que se reduzca la regla • es posible incluir c´odigo en mitad de la parte derecha de las reglas • a cada elemento de la pila se le asocia asociada una variable de tipo yystype • el c´odigo de las acciones sem´anticas puede acceder a esas varibles usando las pseudo-variables $$, $1, $2, $3, . . .

bibliografia http://ccia.ei.uvigo.es/docencia/PL/bison.pdf

Esteban A. Torres:

Al igual que Nayeli , investigue sobre este tipo de "Analisis" y bueno esto nos lleva presisamente a a los Elementos de la programación que se utilizan.

  1. Léxico
  2. Sintaxis
  3. Semantico

El Léxico nos dice que es un conjunto de palabras ,símbolos de puntuación, simbolos de operaciones admitidas y demas elementos que son enriquecidos por los lenguajes.

El de Sintaxis nos dices que es un conjunto de reglas aplicadas para el buen uso de un lenguaje de programación, le de notamos como la declaración o bien las instrucciones en las cuales se deben emplear para el buen uso de un ]Lenguaje de programación.

El Semantico nos indica sobre la interpretación o sentido de cada una de las palabras utilizadas en un lenguaje de programación o bien en un programa ya escrito.

Este ultimo como bien lo dijo el profe ya es algo muy avanzado el cual pues no vamos a utilizar.

Pero podemos empezar a definir la parte sobre como empezar a estructurar los archivos, tengamos en cuenta los conocimientos adquiridos que seran fundamentales las gramaticas, expresiones regulares , etc.

En un principio deberiamos empezar por algo simple, como ejemplo para empezar aportar a github como un pequeño autocorrector de un simple "punto y coma" ";".

Les dejo un link es de compiladores que encontre en la red:

http://compiladores.galeon.com/tarea_4.htm

Si no en su defecto Wikipediaso......

Saludos ... Seguimos en la Lucha =)

Ivan Rangel:

Bueno yo estoy de acuerdo con todos ustedes y esta perfecto que identifiquemos los tipos de errores y como abordarlos, pero en mi punto de vista debemos en principio enfocarnos a errores basicos, como son la falta de un punto y coma, un parentesis o una llave, una variable no inicializada, el mal llamado de las librerias, etc. Ya corrigiendo estos errores podemos enfocarnos en cosas mas complejas como estructuras de datos o arrelgos o apuntadores.

Como Esteba nos comenta estoy de acuerdo en utilizar gramaticas ya que como el profesor Norman nos ha dicho son mas poderosas y se adaptan mejor a nuestras necesidades en este caso, ya que las gramaticas se peuden quedar un poco cortas y pueden no adaptarse bien a lo que necesitamos. Lo que sigue es empezar a modelar las producciones de la gramatica y bueno creo que hablo por todos al decir que esperamos que los demas compañeros comenten algo para saber su opinion y que aporten mas ideas. Saludos!!

Diego Aguilar

Hola, estoy deacuerdo con Ivan Rangel, opino que seria bueno enfocarnos es problemas mas sencillos, digo para poder sacar algo funcional, considero que lo de la distancia de Lvenhstein nos puede ser util para un programa muy sencillo por ejemplo uno en donde solo incluya un "printf" y que este mal escrito , y asi tendriamos que crear la gramatica de printf y la forma de ver que en cuanto el compilador encuentre una palabra parecida, con una o dos letras diferentes, la cambie automaticamente por "printf". Bueno a mi se me ocurre algo asi sencillo o tambien empezar por la falta de ";". Y despues considerar problemas mas dificiles. Saludos.

##Bruno Arana: Me di cuenta que he estado publicando cosas en algo así como mi sub-repositorio y esas cosas solo las podía leer yo, pero bueno estoy de acuerdo con sus ideas y deje en una de las páginas de la wiki el artículo que supuestamente ya había publicado sobre como funciona un corrector ortográfico, incluye un ejemplo que aunque esta en python puede ser de utilidad, igual les dejo aqui el link: http://norvig.com/spell-correct.html

Saludos.