Si alguna vez has estado con deseos de hacer tu primera formula para graficar un fractal, aquí te dejo un código que funciona con una librería que emula las librerías de borland para gráficos en turbo c++, la ventaja es que es emulada para mingw estándar, este ejemplo parte con el supuesto de que ya cuentas con mingw y las librerías winbgim para mingw instaladas y funcionando.Este código lo puedes encontrar en el libro gráficos en turbo c++, a continuación te dejo la imagen y el código , ademas de un breve vídeo.
En las universidades es una practica común para todos los estudiantes del área de computación el hacer un analizador léxico sintáctico, que son los pasos previos para realizar un compilador.Empecemos con las definiciones de ambos.
Analizador Léxico: Unanalizador léxicooanalizador lexicográfico(eninglésscanner) es la primera fase de uncompiladorconsistente en unprogramaque recibe como entrada elcódigo fuentede otro programa (secuencia de caracteres) y produce una salida compuesta detokens(componentes léxicos) o símbolos. Estostokenssirven para una posterior etapa del proceso de traducción, siendo la entrada para elanalizador sintáctico(en inglésparser).
La especificación de un lenguaje de programación a menudo incluye un conjunto de reglas que definen el léxico. Estas reglas consisten comúnmente en expresiones regulares que indican el conjunto de posibles secuencias de caracteres que definen un token o lexema.
En algunos lenguajes de programación es necesario establecer patrones para caracteres especiales (como el espacio en blanco) que la gramática pueda reconocer sin que constituya un token en sí.
Analizador sintactico: Un analizador sintáctico (o parser) es un programa informático que analiza una cadena de símbolos de acuerdo a las reglas de una gramática formal. El término proviene del Latín pars, que significa parte (del discurso). Usualmente hace parte de un compilador, en cuyo caso, transforma una entrada en un árbol sintáctico de derivación.12
El análisis sintáctico convierte el texto de entrada en otras estructuras (comúnmente árboles), que son más útiles para el posterior análisis y capturan la jerarquía implícita de la entrada. Un analizador léxico crea tokens de una secuencia de caracteres de entrada y son estos tokens los que son procesados por el analizador sintáctico para construir la estructura de datos, por ejemplo un árbol de análisis o árboles de sintaxis abstracta.
El análisis sintáctico también es un estado inicial del análisis de frases de lenguaje natural. Es usado para generar diagramas de lenguajes que usan flexión gramatical, como los idiomas romances o el latín. Los lenguajes habitualmente reconocidos por los analizadores sintácticos son los lenguajes libres de contexto. Cabe notar que existe una justificación formal que establece que los lenguajes libres de contexto son aquellos reconocibles por un autómata de pila, de modo que todo analizador sintáctico que reconozca un lenguaje libre de contexto es equivalente en capacidad computacional a un autómata de pila.
Los analizadores sintácticos fueron extensivamente estudiados durante los años 1970, detectándose numerosos patrones de funcionamiento en ellos, cosa que permitió la creación de programas generadores de analizadores sintácticos a partir de una especificación de la sintaxis del lenguaje en forma Backus-Naur por ejemplo, tales como yacc, GNU bison y javaCC.
En los años 50's fue un tema muy estudiado, por lo que se realizaron herramientas para generarlos, donde uno de los mas óptimos es flex de GNU y bison de GNU tambien, estas herramientas son distribuidas de forma libre debido a que pertenecen a los proyectos de software libre. Si decides investigar mas a detalle la historia de estas herramientas, te sorprenderás al descubrir que miembros muy importantes en mundo de la computación estan implicados, tales como Richard Stallman y el CEO de google. Mientras tanto solo nos acomoda entender flex como una herramienta para generar un analizador lexico y a bison como una herramienta para generar analizador sintáctico.
Se dara por supuesto que ya cuentas con ambas herramientas instaladas, debido a que para poder ejecutar el ejemplo, necesitaras instalar apropiadamente flex y bison.
El analizador léxico contendrá todas las palabras reservadas, operadores y delimitadores que se usaran para la gramática que se definirá en el archivo c.y el cual es un archivo bison, la función yyerror solo se encargara de imprimir el numero de linea donde se detecta el error y el carácter que lo ocasiona. El archivo c.y queda de la siguiente forma:
%{ /* * A lexer for the basic gramar to use for recognizing mlish sentences. */ #include <stdio.h> extern int lineno; %} %token MAIN DESCONOCIDO NOMBRE NUMERO PCOMA PRINTF VAL RETURN %token CONDITIONAL DELIMITADORES COMPARISION COMILLA COMA MAIN %token DECLARACION OPERACIONES INCREMENTO DECREMENTO SUMA RESTA MULTIPLICACION DIVISION %% sentence : input | input principal {printf("No hay errores de sintaxis");} ; input: /* vacío */ | input line ; line: '\n' | sencondicion | declaraciones | sencondicion '\n' | declaraciones '\n' | operaciones | operaciones '\n' | imprimir | imprimir '\n' | retornar | retornar '\n' ; sencondicion:condicion delimitador variable comparacion variable delimitador delimitador input delimitador{if($4=='=') { yyerror("no se permite asignacion"); exit(1);} else{if(($2!='(') || ($6!=')')) yyerror("falta parentecis"); exit(1);}} |condicion delimitador variable comparacion numero delimitador delimitador input delimitador |condicion delimitador variable comparacion numero delimitador input |condicion delimitador variable comparacion variable delimitador input ; declaraciones :tipo variable comparacion numero pcoma {/*if($5==';') {yyerror("falta ;");exit(1);}*/} |tipo variable comparacion variable pcoma {/*if($5==';') {yyerror("falta ;");exit(1);}*/} |tipo variable pcoma {if($3!=';') yyerror("falta ;");exit(1);} |tipo variable delimitador numero delimitador comparacion numero pcoma { if(($3!='[') && ($5!=']')) yyerror("falta '[' o '] '");exit(1);} |tipo variable delimitador numero delimitador pcoma { if(($3!='[') && ($5!=']')) yyerror("falta '[' o '] '");exit(1);} |tipo variable comparacion {if($3!='=') yyerror("Solo se permite asignacion");exit(1);} ; operaciones :variable comparacion numero division numero pcoma {/*if($5 == 0){yyerror("no es posible division entre 0"); exit(1);}*/} |variable comparacion variable division variable pcoma |variable comparacion variable division numero pcoma |variable comparacion numero division variable pcoma |variable comparacion numero suma numero pcoma |variable comparacion variable suma variable pcoma |variable comparacion variable suma numero pcoma |variable comparacion numero suma variable pcoma |decremento variable pcoma |variable decremento pcoma |variable incremento pcoma |incremento variable pcoma |variable comparacion numero multiplicacion numero pcoma |variable comparacion variable multiplicacion variable pcoma |variable comparacion variable multiplicacion numero pcoma |variable comparacion numero multiplicacion variable pcoma |variable comparacion numero resta numero pcoma |variable comparacion variable resta variable pcoma |variable comparacion variable resta numero pcoma |variable comparacion numero resta variable pcoma ; imprimir : printf delimitador comilla variable comilla delimitador pcoma | printf delimitador comilla val variable comilla coma variable delimitador pcoma | printf delimitador comilla variable val comilla coma variable delimitador pcoma ; retornar : return variable pcoma | return numero pcoma ; principal : main delimitador delimitador delimitador input delimitador | main delimitador tipo variable delimitador delimitador input delimitador | tipo main delimitador delimitador delimitador input delimitador | tipo main delimitador tipo variable delimitador delimitador input delimitador | tipo main delimitador tipo variable coma tipo variable delimitador delimitador input delimitador ; main : MAIN ; tipo:DECLARACION ; pcoma :PCOMA ; suma : SUMA ; resta : RESTA ; multiplicacion: MULTIPLICACION ; division : DIVISION ; incremento : INCREMENTO ; decremento : DECREMENTO ; ; variable :NOMBRE ; numero:NUMERO ; condicion:CONDITIONAL ; delimitador :DELIMITADORES comparacion :COMPARISION ; printf : PRINTF ; comilla : COMILLA ; coma : COMA ; val : VAL ; return : RETURN ; %% extern FILE *yyin; int main(argc,argv) int argc; char **argv; { char filename[40]; ++argv, --argc; /* se salta el nombre del programa */ if (argc>0) yyin = fopen(argv[0], "r"); else { printf("Introduzca el nombre del fichero de entrada: "); scanf("%s", &filename); yyin = fopen(filename, "r"); } yyparse(); }
El archivo c.y tiene las mismas características que el archivo c.l , solo que en la sección de las reglas contendrá la gramática en formato simplificado BNF, de la siguiente manera:
principal : main delimitador delimitador delimitador input delimitador | main delimitador tipo variable delimitador delimitador input delimitador | tipo main delimitador delimitador delimitador input delimitador | tipo main delimitador tipo variable delimitador delimitador input delimitador | tipo main delimitador tipo variable coma tipo variable delimitador delimitador input delimitador ;
La primera linea main delimitador delimitador delimitador input delimitador puede traducirse como
main() {
input // input tambien tiene una definición de gramática
}
Para compilarlo se hará de la siguiente manera:
bison -d c.y
Este comando va a generar los archivos c.tab.h y c.tab.c
flex c.l
Este comando generara el archivo lex.yy.c
Una vez generados los archivos, el siguiente paso es compilar la aplicación para generar el analizador. La compilación se genera con el siguiente comando:
gcc c.tab.c lex.yy.c -L "C:\GnuWin32\lib" -lfl -o analizador Este comando va a juntar los archivos generados por flex y bison en una compilación en c que sera el archivo analizador.exe Una vez generado el ejecutable le podemos cargar al programa un archivo de código en c con el que hará el análisis léxico sintáctico.
Unix Text Processing Tools flex and bison Editorial O'Relly Compilers: Principles, Techniques, and Tools1st Alfred V. Aho(Author), Ravi Sethi(Author), Jeffrey D. Ullman (Author)
A continuación te dejo el enlace a github para ver el proyecto y un breve vídeo explicativo.
Para este vídeo juego de la plataforma nintendo family, nintendo y super nintendo, hay items que pueden ser obtenidos al principio del mundo uno y dos, en esta entrada les mostrare como hacer las vidas infinitas en la misión dos del mundo uno, como obtener el guante de power en la misión 4 del mundo 1, y como obtener el ancla en la misión 2 del mundo dos.A continuación los vídeos que personalmente me encargue de realizarlos.
Si te has preguntado ¿Para que es el ancla?
Es solo para que los barcos no se vayan cuando pierdes una vida en el mismo.
Ahora mismo hay mucha mas información circulando en la red, de la que puede haber circulando en una universidad, donde puedes aprender casi cualquier cosa que se te ocurra, en esta entrada solo quiero hacerles la recomendación de usar las siguientes herramientas.
Opciones:
Youtube: Tiene infinidad de webinars y cursos y cátedras, grabados así como los vídeos que hacen los youtubers.
Yandex videos: Lo mismo que youtube pero en versión rusa.Tiene tambien mucho contenido en español casi como youtube. Aquí te dejo la liga.
Coursera: Te ofrece un sin numero de cursos gratuitos de diferentes universidades.Aqui te dejo la liga coursera.
tux typing: Tuxtype no es una herramienta en linea, pero te ayuda, a escribir mas rápido en el teclado y de forma adecuada, que es una gran ventaja si llegas a dominar esta habilidad. Aquí te dejo la ruta de descarga
Brainwars: Esta es una app que te ayuda a mejorar tus habilidades de calculo, memoria, psicomotriz, criterio, observación, exactitud, concentración y velocidad. Aquí dejo la liga
Conclusión:
Con estas herramientas puedes desarrollar conocimiento y habilidad, y volverte como un asiático nivel 80.Quien sabe seguramente, por ahi debe haber mas de alguno que no necesito ir a la universidad para ser muy bueno en loque aprende, gracias a las herramientas digitales y el Internet.