viernes, septiembre 30, 2005

Sesión del Viernes 30 de Septiembre

En la sesión de hoy les presenté la traducción de un programa completo de ensamblador a lenguaje máquina.

Les expliqué la traducción del siguiente programa:
     mov ax,0
mov cx,1
do1: cmp ax,50h
jg findo
add ax,cx
inc cx
findo:
mov bx,ax
Que resulta en el siguiente programa en lenguaje máquina:
Dirección     Instrucción           Tamaño
-------------------------------------------
0 mov ax,0 b8 00 00 3
3 mov cx,1 b9 01 00 3
6 do1: cmp ax,50h 3d 50 00 3
9 jg findo 7F 05 2
B add ax,cx 01 c8 2
D inc cx 41 1
E jmp do1 eb f6 2
10 findo1: mov bx,ax 89 c3 2

Quedó como ejercicio traducir el siguiente programa:
     mov ax,0
mov bx,[5]
mov cx,20h
do1: add ax,bx
inc cx
loop do1
mov [5],ax
int 20h

Pueden revisar la siguiente referencia que explica la traducción de otro programa.

miércoles, septiembre 28, 2005

Sesión del Miércoles 28 de Septiembre

En la sesión de hoy realizamos algunos ejercicios de conversión de ensamblador a lenguaje máquina.
Para esto requieren esta información, de la cual les dejé algunas copias.
Pueden estudiar este ejemplo de conversión de ensamblador a lenguaje máquina para repasar lo visto en clase.

martes, septiembre 27, 2005

Sesión del Martes 27 de Septiembre

En la sesión de hoy, presenté un breve repaso de la arquitectura de los procesadores Intel, conocida como arquitectura IA32, y un breve repaso del lenguaje ensamblador. Pueden apoyarse en este presentación como material de repaso.

viernes, septiembre 23, 2005

Sesión del Viernes 23 de Septiembre

En esta sesión realizaron la práctica del analizador sintáctico con Lex y Yacc (ver guía) usando como ejemplo el desarrollo de una calculadora sencilla.
Les pedí que modificaran los programas lex y yacc para agregar la operación módulo.

miércoles, septiembre 21, 2005

Sesión del Miércoles 21 de Septiembre

En la sesión de hoy les presenté la herramienta YACC (Yet Another Compiler Compiler), que es un generador de analizadores sintácticos en C.

Esta herramienta está diseñada para trabajar en conjunto con LEX (el generador de analizadores léxicos visto en clases pasadas).
Yacc genera analizadores sintácticos ascendentes. Para esto utiliza una pila y operaciones shift (corrimiento) y reduce (reducción).
En este tipo de analizadores puede haber conflictos shift-reduce y reduce-reduce.

Las opciones que Yacc implementa por omisión para resolver estos conflictos son:
  • En un conflicto shift-reduce opta por shift.
  • En un conflicto reduce-reduce opta por la regla de reducción definida primero en la lista reglas.

Finalmente presenté el ejemplo de una gramática de una caculadora simple que sólo acepta sumas y restas de términos.
A continuación muestro los programas de lex y yacc para este ejemplo.

Analizador léxico
/* calc.l */
%{
#include<stdlib.h>
#include"calc_tab.h"
void yyerror(char *);
%}

%%

[0-9]+ { yylval = atoi(yytext); return INTEGER; }
[-+\n] return *yytext;
[ \t] ; /* Elimina espacios */
. yyerror("caracter invalido");

%%

int yywrap(void)
{
return 1;
}

Analizador sintáctico
/* calc.y */
%{
int yyylex(void);
void yyerror(char *);
%}

%token INTEGER

%%

program: program expr '\n' {printf("%d\n",$2); }
|
;

expr: INTEGER { $$ = $1; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
;
%%

void yyerror (char *s)
{
printf("%s\n",s);
return;
}

int main(void)
{
yyparse();
return 0;
}

Proceso de compilación
El proceso de compilación de esta calculadora requiere los siguientes pasos:
  1. Compilar el programa yacc con el comando
     yacc -d calc.y
    que genera los archivos calc_tab.c y calc_tab.h

  2. Compilar el progama lex con el comando
    flex -ocalc.c calc.l
    que genera el archivo calc.c

  3. Compilar los códigos fuente con un compilador de C. En caso de Turbo C el comando sería
    tcc -ecalc.exe calc_tab.c calc.c
    que genera el ejecutable calc.exe

Para reforzar estos conceptos les recomiendo esta referencia.

martes, septiembre 20, 2005

Sesión del Martes 20 de Septiembre

En la sesión de hoy vimos la parte teórica del analizador sintáctico.
Los temas vistos son: gramáticas de libre contexto, reglas de producción, notación BNF, árboles sintácticos, derivaciones izquierda y derecha y expresiones ambigüas.
Pueden consultar las secciones 4.1 y 4.2 de esta referencia.

miércoles, septiembre 14, 2005

Sesión del Miércoles 14 de Septiembre

En la sesión de hoy realizaron la Práctica 4 El Analizador léxico. Utilizaron el programa flex.exe, que también está disponible (comprimido en formato zip) en la página del curso.

martes, septiembre 13, 2005

Sesión del Martes 13 de septiembre

En la sesión de hoy les presenté varios ejemplos de "programas lex" mostrando la interpretación de varias expresiones regulares. Pueden consultar algunos ejemplos en esta referencia.

viernes, septiembre 09, 2005

Sesión del Viernes 9 de Septiembre

En la sesión de hoy hablamos de expresiones regulares como otra forma de expresar patrones para reconocer tokens en un analizador léxico. Vimos algunos conceptos generales como alfabeto, lenguaje, etc.
Posteriormente les presenté brevemente el generador de analizadores léxicos LEX.
Pueden apoyarse en este referencia

miércoles, septiembre 07, 2005

Sesión del Jueves 7 de septiembre

En la sesión de hoy comenté brevemente sobre la utilería make y sobre el compilador libre de C lcc-win32.
Posteriormente iniciamos el estudio del analizador léxico, la primera de las etapas que ejecuta un compilador durante el proceso de traducción. Les recomiendo consultar esta referencia sobre este último tema.

martes, septiembre 06, 2005

Sesión del Martes 6 de septiembre

En la sesión de hoy terminaron la Práctica sobre la utilería make.

También realizaron la tarea 2: Errores comunes en C. Deben enviar a mi correo los resultados de la tarea 2.

viernes, septiembre 02, 2005

Sesión del Viernes 2 de septiembre

En la sesión de hoy iniciaron la Práctica 3: La utilería make en Turbo C..

En la próxima sesión terminarán esta práctica y realizará la Tarea 2: Errores comunes en C.