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/
No hay comentarios:
Publicar un comentario