20 agosto 2008

Un compilador sencillo paso a paso (13 - Estructuras repetitivas)

Si sabemos cómo hacer saltos, y cómo comprobaciones del tipo "if..then..else", crear construcciones como "while" y como "repeat..until" debería ser muy fácil. Tampoco debería ser muy complejo crear secuencias "for". Vamos con ello...

Comencemos por "while". Un bloque como

while condicion do
begin
bloque1
end
restoDePrograma


Se podría reescribir como

inicioWhile:
if not condicion then goto inicioRestoDePrograma;
bloque1
goto inicioWhile;
inicioRestoDePrograma:
restoDePrograma


Que, al igual que ocurría con "if", ya tiene una traducción casi directa a ensamblador (y, por tanto, a código máquina).


El caso de "repeat..until" es aún más sencillo. El código fuente sería

repeat
bloque1
until condicion;
restoDePrograma


Se podría reescribir en forma muy cercana al ensamblador como

inicioRepeat:
bloque1
if not condicion then goto inicioRepeat;
restoDePrograma


Mientras que el bucle "for" es apenas ligeramente más complicado:

for variable := valorInicial to valorFinal do
begin
bloque1
end
restoDePrograma


Quedaría como

variable := valorInicial;
inicioFor:
if variable > valorFinal then goto inicioRestoDePrograma;
bloque1
inc(variable)
goto inicioFor;
inicioRestoDePrograma:
restoDePrograma


(ignoramos por ahora el caso de usar "downto" en vez de "to").

Aun así, hay cosas que mejorar (en una versión posterior). Unas son fallos claros de la versión actual y otras son mejoras necesarias. La primera y más evidente es que nuestro analizador léxico no reconoce operadores de formados por dos letras: ni "<=", ni ">=", ni "<>". Tampoco se crea correctamente el código objetivo para estas comparaciones. Por supuesto, tampoco permite AND, OR y NOT para formar condiciones más complejas. Tampoco sabemos analizar expresiones matemáticas más elaboradas, de modo que no podemos hacer cosas como "if a > x+1 then ..."

Todo irá llegando... ;-)

Como siempre, para más detalles, todo el código está en la página del proyecto en Google Code:

http://code.google.com/p/cpcpachi/